blob: 3aa0f567a73e46e5a7bdeac60b3489030028048b [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 Confidential Information as defined by the Khronos
17 * Membership Agreement until designated non-confidential by Khronos, at which
18 * point this condition clause shall be removed.
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060019 *
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070020 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060021 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070022 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23 *
24 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
25 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
26 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
27 * USE OR OTHER DEALINGS IN THE MATERIALS
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060028 *
29 * Author: Jeremy Hayes <jeremy@lunarg.com>
30 * Author: Tony Barbour <tony@LunarG.com>
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070031 * Author: Mark Lobodzinski <mark@LunarG.com>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060032 */
33
34#include <stdio.h>
35#include <stdlib.h>
36#include <string.h>
37
38#include <iostream>
39#include <string>
40#include <sstream>
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050041#include <unordered_map>
Michael Lentine157a2ec2016-01-27 11:25:05 -060042#include <unordered_set>
Jeremy Hayes99a96322015-06-26 12:48:09 -060043#include <vector>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060044
Tobin Ehlisb835d1b2015-07-03 10:34:49 -060045#include "vk_loader_platform.h"
David Pinedo9316d3b2015-11-06 12:54:48 -070046#include "vulkan/vk_layer.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060047#include "vk_layer_config.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060048#include "vk_enum_validate_helper.h"
49#include "vk_struct_validate_helper.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060050
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060051#include "vk_layer_table.h"
52#include "vk_layer_data.h"
53#include "vk_layer_logging.h"
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -060054#include "vk_layer_extension_utils.h"
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070055#include "vk_layer_utils.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060056
Cody Northrop55443ef2015-09-28 15:09:32 -060057struct layer_data {
Jeremy Hayes99a96322015-06-26 12:48:09 -060058 debug_report_data *report_data;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070059 std::vector<VkDebugReportCallbackEXT> logging_callback;
Cody Northrop55443ef2015-09-28 15:09:32 -060060
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070061 //TODO: Split instance/device structs
62 //Device Data
63 //Map for queue family index to queue count
Michael Lentinebdf744f2016-01-27 15:43:43 -060064 std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
65
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070066 layer_data() :
67 report_data(nullptr)
68 {};
Cody Northrop55443ef2015-09-28 15:09:32 -060069};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050070
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070071static std::unordered_map<void*, layer_data*> layer_data_map;
Jeremy Hayes99a96322015-06-26 12:48:09 -060072static device_table_map pc_device_table_map;
73static instance_table_map pc_instance_table_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060074
Jeremy Hayes99a96322015-06-26 12:48:09 -060075// "my instance data"
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070076debug_report_data *mid(VkInstance object)
77{
Jeremy Hayes99a96322015-06-26 12:48:09 -060078 dispatch_key key = get_dispatch_key(object);
Tobin Ehlisbfbac252015-09-01 11:46:36 -060079 layer_data *data = get_my_data_ptr(key, layer_data_map);
Jeremy Hayes99a96322015-06-26 12:48:09 -060080#if DISPATCH_MAP_DEBUG
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070081 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 -060082#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060083 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060084
85 return data->report_data;
86}
87
88// "my device data"
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070089debug_report_data *mdd(void* object)
90{
Jeremy Hayes99a96322015-06-26 12:48:09 -060091 dispatch_key key = get_dispatch_key(object);
92 layer_data *data = get_my_data_ptr(key, layer_data_map);
93#if DISPATCH_MAP_DEBUG
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070094 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 -060095#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060096 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060097 return data->report_data;
98}
99
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700100static void InitParamChecker(layer_data *data, const VkAllocationCallbacks *pAllocator)
101{
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700102 VkDebugReportCallbackEXT callback;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600103 uint32_t report_flags = getLayerOptionFlags("ParamCheckerReportFlags", 0);
104
105 uint32_t debug_action = 0;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700106 getLayerOptionEnum("ParamCheckerDebugAction", (uint32_t *) &debug_action);
107 if(debug_action & VK_DBG_LAYER_ACTION_LOG_MSG)
108 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600109 FILE *log_output = NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700110 const char* option_str = getLayerOption("ParamCheckerLogFilename");
Tobin Ehlisb1df55e2015-09-15 09:55:54 -0600111 log_output = getLayerLogOutput(option_str, "ParamChecker");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700112 VkDebugReportCallbackCreateInfoEXT dbgCreateInfo;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700113 memset(&dbgCreateInfo, 0, sizeof(dbgCreateInfo));
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700114 dbgCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700115 dbgCreateInfo.flags = report_flags;
116 dbgCreateInfo.pfnCallback = log_callback;
117 dbgCreateInfo.pUserData = log_output;
118
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700119 layer_create_msg_callback(data->report_data, &dbgCreateInfo, pAllocator, &callback);
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -0600120 data->logging_callback.push_back(callback);
121 }
122
123 if (debug_action & VK_DBG_LAYER_ACTION_DEBUG_OUTPUT) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700124 VkDebugReportCallbackCreateInfoEXT dbgCreateInfo;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700125 memset(&dbgCreateInfo, 0, sizeof(dbgCreateInfo));
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700126 dbgCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700127 dbgCreateInfo.flags = report_flags;
128 dbgCreateInfo.pfnCallback = win32_debug_output_msg;
129 dbgCreateInfo.pUserData = NULL;
130
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700131 layer_create_msg_callback(data->report_data, &dbgCreateInfo, pAllocator, &callback);
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -0600132 data->logging_callback.push_back(callback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600133 }
134}
135
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700136VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700137 VkInstance instance,
138 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700139 const VkAllocationCallbacks *pAllocator,
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700140 VkDebugReportCallbackEXT* pMsgCallback)
141{
142 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
143 VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600144
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700145 if (result == VK_SUCCESS)
146 {
147 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
148 result = layer_create_msg_callback(data->report_data, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600149 }
150
151 return result;
152}
153
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700154VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(
155 VkInstance instance,
156 VkDebugReportCallbackEXT msgCallback,
157 const VkAllocationCallbacks *pAllocator)
158{
159 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700160 pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600161
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700162 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700163 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600164}
165
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700166VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(
167 VkInstance instance,
168 VkDebugReportFlagsEXT flags,
169 VkDebugReportObjectTypeEXT objType,
170 uint64_t object,
171 size_t location,
172 int32_t msgCode,
173 const char* pLayerPrefix,
174 const char* pMsg)
175{
176 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
177 pTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700178}
179
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700180static const VkExtensionProperties instance_extensions[] = {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700181 {
182 VK_EXT_DEBUG_REPORT_EXTENSION_NAME,
183 VK_EXT_DEBUG_REPORT_SPEC_VERSION
184 }
185};
Tony Barbour59a47322015-06-24 16:06:58 -0600186
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700187VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(
188 const char *pLayerName,
189 uint32_t *pCount,
190 VkExtensionProperties* pProperties)
191{
192 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600193}
194
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700195static const VkLayerProperties pc_global_layers[] = {
196 {
197 "VK_LAYER_LUNARG_param_checker",
198 VK_API_VERSION,
199 VK_MAKE_VERSION(0, 1, 0),
200 "Validation layer: param_checker",
201 }
202};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700203
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700204VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(
205 uint32_t *pCount,
206 VkLayerProperties* pProperties)
207{
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -0600208 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers),
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700209 pc_global_layers,
210 pCount, pProperties);
Tony Barbour59a47322015-06-24 16:06:58 -0600211}
212
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700213VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(
214 VkPhysicalDevice physicalDevice,
215 const char* pLayerName,
216 uint32_t* pCount,
217 VkExtensionProperties* pProperties)
218{
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -0600219 /* ParamChecker does not have any physical device extensions */
Jon Ashburn751c4842015-11-02 17:37:20 -0700220 if (pLayerName == NULL) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700221 return get_dispatch_table(pc_instance_table_map, physicalDevice)->EnumerateDeviceExtensionProperties(
222 physicalDevice,
223 NULL,
224 pCount,
225 pProperties);
Jon Ashburn751c4842015-11-02 17:37:20 -0700226 } else {
227 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
228 }
Jeremy Hayesad367152015-04-17 10:36:53 -0600229}
230
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700231VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(
232 VkPhysicalDevice physicalDevice,
233 uint32_t* pCount,
234 VkLayerProperties* pProperties)
235{
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -0700236
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -0600237 /* ParamChecker's physical device layers are the same as global */
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700238 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers,
239 pCount, pProperties);
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -0600240}
Jeremy Hayes99a96322015-06-26 12:48:09 -0600241
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700242static
243std::string EnumeratorString(VkResult const& enumerator)
244{
245 switch(enumerator)
246 {
247 case VK_RESULT_MAX_ENUM:
248 {
249 return "VK_RESULT_MAX_ENUM";
250 break;
251 }
252 case VK_ERROR_LAYER_NOT_PRESENT:
253 {
254 return "VK_ERROR_LAYER_NOT_PRESENT";
255 break;
256 }
257 case VK_ERROR_INCOMPATIBLE_DRIVER:
258 {
259 return "VK_ERROR_INCOMPATIBLE_DRIVER";
260 break;
261 }
262 case VK_ERROR_MEMORY_MAP_FAILED:
263 {
264 return "VK_ERROR_MEMORY_MAP_FAILED";
265 break;
266 }
267 case VK_INCOMPLETE:
268 {
269 return "VK_INCOMPLETE";
270 break;
271 }
272 case VK_ERROR_OUT_OF_HOST_MEMORY:
273 {
274 return "VK_ERROR_OUT_OF_HOST_MEMORY";
275 break;
276 }
277 case VK_ERROR_INITIALIZATION_FAILED:
278 {
279 return "VK_ERROR_INITIALIZATION_FAILED";
280 break;
281 }
282 case VK_NOT_READY:
283 {
284 return "VK_NOT_READY";
285 break;
286 }
287 case VK_ERROR_OUT_OF_DEVICE_MEMORY:
288 {
289 return "VK_ERROR_OUT_OF_DEVICE_MEMORY";
290 break;
291 }
292 case VK_EVENT_SET:
293 {
294 return "VK_EVENT_SET";
295 break;
296 }
297 case VK_TIMEOUT:
298 {
299 return "VK_TIMEOUT";
300 break;
301 }
302 case VK_EVENT_RESET:
303 {
304 return "VK_EVENT_RESET";
305 break;
306 }
307 case VK_SUCCESS:
308 {
309 return "VK_SUCCESS";
310 break;
311 }
312 case VK_ERROR_EXTENSION_NOT_PRESENT:
313 {
314 return "VK_ERROR_EXTENSION_NOT_PRESENT";
315 break;
316 }
317 case VK_ERROR_DEVICE_LOST:
318 {
319 return "VK_ERROR_DEVICE_LOST";
320 break;
321 }
322 default:
323 {
324 return "unrecognized enumerator";
325 break;
326 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600327 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600328}
329
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700330static
331bool ValidateEnumerator(VkFormatFeatureFlagBits const& enumerator)
332{
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600333 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600334 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT |
335 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
336 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT |
337 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
338 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT |
339 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT |
340 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
341 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT |
342 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
Cody Northrop61d6dd62015-08-18 14:58:29 -0600343 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT |
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700344 VK_FORMAT_FEATURE_BLIT_SRC_BIT |
345 VK_FORMAT_FEATURE_BLIT_DST_BIT |
Jon Ashburn766866a2016-01-22 15:39:20 -0700346 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700347 if(enumerator & (~allFlags))
348 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600349 return false;
350 }
351
352 return true;
353}
354
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700355static
356std::string EnumeratorString(VkFormatFeatureFlagBits const& enumerator)
357{
358 if(!ValidateEnumerator(enumerator))
359 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600360 return "unrecognized enumerator";
361 }
362
363 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700364 if(enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT)
365 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600366 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
367 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700368 if(enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT)
369 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600370 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
371 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700372 if(enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT)
373 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600374 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
375 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700376 if(enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT)
377 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600378 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
379 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700380 if(enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)
381 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600382 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
383 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700384 if(enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT)
385 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600386 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
387 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700388 if(enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)
389 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600390 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
391 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700392 if(enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT)
393 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600394 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
395 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700396 if(enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT)
397 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600398 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
399 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700400 if(enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)
401 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600402 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
403 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700404 if(enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT)
405 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800406 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600407 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700408 if(enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT)
409 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800410 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600411 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700412 if(enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT)
413 {
Jon Ashburn766866a2016-01-22 15:39:20 -0700414 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
415 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600416
417 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700418 for(auto const& string : strings)
419 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600420 enumeratorString += string;
421
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700422 if(string != strings.back())
423 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600424 enumeratorString += '|';
425 }
426 }
427
428 return enumeratorString;
429}
430
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700431static
432bool ValidateEnumerator(VkImageUsageFlagBits const& enumerator)
433{
434 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT |
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600435 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700436 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
437 VK_IMAGE_USAGE_STORAGE_BIT |
438 VK_IMAGE_USAGE_SAMPLED_BIT |
439 VK_IMAGE_USAGE_TRANSFER_DST_BIT |
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600440 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT |
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800441 VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700442 if(enumerator & (~allFlags))
443 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600444 return false;
445 }
446
447 return true;
448}
449
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700450static
451std::string EnumeratorString(VkImageUsageFlagBits const& enumerator)
452{
453 if(!ValidateEnumerator(enumerator))
454 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600455 return "unrecognized enumerator";
456 }
457
458 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700459 if(enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT)
460 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600461 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
462 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700463 if(enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
464 {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600465 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600466 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700467 if(enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)
468 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600469 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
470 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700471 if(enumerator & VK_IMAGE_USAGE_STORAGE_BIT)
472 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600473 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
474 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700475 if(enumerator & VK_IMAGE_USAGE_SAMPLED_BIT)
476 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600477 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
478 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700479 if(enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT)
480 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800481 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600482 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700483 if(enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT)
484 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600485 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
486 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700487 if(enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT)
488 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800489 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600490 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600491
492 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700493 for(auto const& string : strings)
494 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600495 enumeratorString += string;
496
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700497 if(string != strings.back())
498 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600499 enumeratorString += '|';
500 }
501 }
502
503 return enumeratorString;
504}
505
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700506static
507bool ValidateEnumerator(VkQueueFlagBits const& enumerator)
508{
509 VkQueueFlagBits allFlags = (VkQueueFlagBits)(
510 VK_QUEUE_TRANSFER_BIT |
511 VK_QUEUE_COMPUTE_BIT |
512 VK_QUEUE_SPARSE_BINDING_BIT |
513 VK_QUEUE_GRAPHICS_BIT);
514 if(enumerator & (~allFlags))
515 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600516 return false;
517 }
518
519 return true;
520}
521
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700522static
523std::string EnumeratorString(VkQueueFlagBits const& enumerator)
524{
525 if(!ValidateEnumerator(enumerator))
526 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600527 return "unrecognized enumerator";
528 }
529
530 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700531 if(enumerator & VK_QUEUE_TRANSFER_BIT)
532 {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800533 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600534 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700535 if(enumerator & VK_QUEUE_COMPUTE_BIT)
536 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600537 strings.push_back("VK_QUEUE_COMPUTE_BIT");
538 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700539 if(enumerator & VK_QUEUE_SPARSE_BINDING_BIT)
540 {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800541 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600542 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700543 if(enumerator & VK_QUEUE_GRAPHICS_BIT)
544 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600545 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
546 }
547
548 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700549 for(auto const& string : strings)
550 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600551 enumeratorString += string;
552
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700553 if(string != strings.back())
554 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600555 enumeratorString += '|';
556 }
557 }
558
559 return enumeratorString;
560}
561
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700562static
563bool ValidateEnumerator(VkMemoryPropertyFlagBits const& enumerator)
564{
565 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT |
566 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT |
567 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
568 VK_MEMORY_PROPERTY_HOST_CACHED_BIT |
569 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
570 if(enumerator & (~allFlags))
571 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600572 return false;
573 }
574
575 return true;
576}
577
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700578static
579std::string EnumeratorString(VkMemoryPropertyFlagBits const& enumerator)
580{
581 if(!ValidateEnumerator(enumerator))
582 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600583 return "unrecognized enumerator";
584 }
585
586 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700587 if(enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT)
588 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600589 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
590 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700591 if(enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
592 {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800593 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600594 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700595 if(enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)
596 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600597 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
598 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700599 if(enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT)
600 {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800601 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600602 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700603 if(enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)
604 {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800605 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600606 }
607
608 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700609 for(auto const& string : strings)
610 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600611 enumeratorString += string;
612
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700613 if(string != strings.back())
614 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600615 enumeratorString += '|';
616 }
617 }
618
619 return enumeratorString;
620}
621
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700622static
623bool ValidateEnumerator(VkMemoryHeapFlagBits const& enumerator)
624{
625 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
626 if(enumerator & (~allFlags))
627 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600628 return false;
629 }
630
631 return true;
632}
633
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700634static
635std::string EnumeratorString(VkMemoryHeapFlagBits const& enumerator)
636{
637 if(!ValidateEnumerator(enumerator))
638 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600639 return "unrecognized enumerator";
640 }
641
642 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700643 if(enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT)
644 {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800645 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600646 }
647
648 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700649 for(auto const& string : strings)
650 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600651 enumeratorString += string;
652
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700653 if(string != strings.back())
654 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600655 enumeratorString += '|';
656 }
657 }
658
659 return enumeratorString;
660}
661
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700662static
663bool ValidateEnumerator(VkSparseImageFormatFlagBits const& enumerator)
664{
665 VkSparseImageFormatFlagBits allFlags = (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800666 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT |
667 VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700668 if(enumerator & (~allFlags))
669 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600670 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600671 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600672
673 return true;
674}
675
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700676static
677std::string EnumeratorString(VkSparseImageFormatFlagBits const& enumerator)
678{
679 if(!ValidateEnumerator(enumerator))
680 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600681 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600682 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600683
684 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700685 if(enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT)
686 {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800687 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600688 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700689 if(enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT)
690 {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800691 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600692 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700693 if(enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT)
694 {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800695 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600696 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600697
698 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700699 for(auto const& string : strings)
700 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600701 enumeratorString += string;
702
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700703 if(string != strings.back())
704 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600705 enumeratorString += '|';
706 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600707 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600708
709 return enumeratorString;
710}
711
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700712static
713bool ValidateEnumerator(VkFenceCreateFlagBits const& enumerator)
714{
715 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
716 if(enumerator & (~allFlags))
717 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600718 return false;
719 }
720
721 return true;
722}
723
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700724static
725std::string EnumeratorString(VkFenceCreateFlagBits const& enumerator)
726{
727 if(!ValidateEnumerator(enumerator))
728 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600729 return "unrecognized enumerator";
730 }
731
732 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700733 if(enumerator & VK_FENCE_CREATE_SIGNALED_BIT)
734 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600735 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
736 }
737
738 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700739 for(auto const& string : strings)
740 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600741 enumeratorString += string;
742
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700743 if(string != strings.back())
744 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600745 enumeratorString += '|';
746 }
747 }
748
749 return enumeratorString;
750}
751
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700752static
753bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const& enumerator)
754{
755 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600756 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
757 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT |
758 VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
759 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT |
760 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
761 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT |
762 VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
763 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
764 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
765 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700766 if(enumerator & (~allFlags))
767 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600768 return false;
769 }
770
771 return true;
772}
773
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700774static
775std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const& enumerator)
776{
777 if(!ValidateEnumerator(enumerator))
778 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600779 return "unrecognized enumerator";
780 }
781
782 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700783 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT)
784 {
785 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600786 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700787 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT)
788 {
789 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600790 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700791 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT)
792 {
793 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600794 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700795 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT)
796 {
797 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600798 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700799 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT)
800 {
801 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600802 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700803 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT)
804 {
805 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600806 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700807 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT)
808 {
809 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600810 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700811 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT)
812 {
813 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600814 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700815 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT)
816 {
817 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600818 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700819 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT)
820 {
821 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600822 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700823 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT)
824 {
825 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600826 }
827
828 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700829 for(auto const& string : strings)
830 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600831 enumeratorString += string;
832
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700833 if(string != strings.back())
834 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600835 enumeratorString += '|';
836 }
837 }
838
839 return enumeratorString;
840}
841
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700842static
843bool ValidateEnumerator(VkQueryResultFlagBits const& enumerator)
844{
845 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT |
846 VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
847 VK_QUERY_RESULT_WAIT_BIT |
848 VK_QUERY_RESULT_64_BIT);
849 if(enumerator & (~allFlags))
850 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600851 return false;
852 }
853
854 return true;
855}
856
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700857static
858std::string EnumeratorString(VkQueryResultFlagBits const& enumerator)
859{
860 if(!ValidateEnumerator(enumerator))
861 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600862 return "unrecognized enumerator";
863 }
864
865 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700866 if(enumerator & VK_QUERY_RESULT_PARTIAL_BIT)
867 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600868 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
869 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700870 if(enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT)
871 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600872 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
873 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700874 if(enumerator & VK_QUERY_RESULT_WAIT_BIT)
875 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600876 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
877 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700878 if(enumerator & VK_QUERY_RESULT_64_BIT)
879 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600880 strings.push_back("VK_QUERY_RESULT_64_BIT");
881 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600882
883 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700884 for(auto const& string : strings)
885 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600886 enumeratorString += string;
887
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700888 if(string != strings.back())
889 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600890 enumeratorString += '|';
891 }
892 }
893
894 return enumeratorString;
895}
896
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700897static
898bool ValidateEnumerator(VkBufferUsageFlagBits const& enumerator)
899{
900 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT |
901 VK_BUFFER_USAGE_INDEX_BUFFER_BIT |
Jeremy Hayes99a96322015-06-26 12:48:09 -0600902 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
903 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT |
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700904 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
905 VK_BUFFER_USAGE_TRANSFER_DST_BIT |
Jeremy Hayes99a96322015-06-26 12:48:09 -0600906 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT |
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700907 VK_BUFFER_USAGE_TRANSFER_SRC_BIT |
908 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
909 if(enumerator & (~allFlags))
910 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600911 return false;
912 }
913
914 return true;
915}
916
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700917static
918std::string EnumeratorString(VkBufferUsageFlagBits const& enumerator)
919{
920 if(!ValidateEnumerator(enumerator))
921 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600922 return "unrecognized enumerator";
923 }
924
925 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700926 if(enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT)
927 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600928 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
929 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700930 if(enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT)
931 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600932 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
933 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700934 if(enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT)
935 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600936 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
937 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700938 if(enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT)
939 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600940 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
941 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700942 if(enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)
943 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600944 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
945 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700946 if(enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT)
947 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800948 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600949 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700950 if(enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)
951 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600952 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
953 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700954 if(enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT)
955 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800956 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600957 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700958 if(enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)
959 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600960 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
961 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600962
963 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700964 for(auto const& string : strings)
965 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600966 enumeratorString += string;
967
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700968 if(string != strings.back())
969 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600970 enumeratorString += '|';
971 }
972 }
973
974 return enumeratorString;
975}
976
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700977static
978bool ValidateEnumerator(VkBufferCreateFlagBits const& enumerator)
979{
980 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(VK_BUFFER_CREATE_SPARSE_ALIASED_BIT |
981 VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT |
982 VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
983 if(enumerator & (~allFlags))
984 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600985 return false;
986 }
987
988 return true;
989}
990
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700991static
992std::string EnumeratorString(VkBufferCreateFlagBits const& enumerator)
993{
994 if(!ValidateEnumerator(enumerator))
995 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600996 return "unrecognized enumerator";
997 }
998
999 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001000 if(enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT)
1001 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001002 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
1003 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001004 if(enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT)
1005 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001006 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
1007 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001008 if(enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT)
1009 {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -06001010 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001011 }
1012
1013 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001014 for(auto const& string : strings)
1015 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001016 enumeratorString += string;
1017
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001018 if(string != strings.back())
1019 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001020 enumeratorString += '|';
1021 }
1022 }
1023
1024 return enumeratorString;
1025}
1026
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001027static
1028bool ValidateEnumerator(VkImageCreateFlagBits const& enumerator)
1029{
1030 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT |
1031 VK_IMAGE_CREATE_SPARSE_ALIASED_BIT |
1032 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
1033 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT |
1034 VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
1035 if(enumerator & (~allFlags))
1036 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001037 return false;
1038 }
1039
1040 return true;
1041}
1042
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001043static
1044std::string EnumeratorString(VkImageCreateFlagBits const& enumerator)
1045{
1046 if(!ValidateEnumerator(enumerator))
1047 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001048 return "unrecognized enumerator";
1049 }
1050
1051 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001052 if(enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT)
1053 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001054 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
1055 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001056 if(enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)
1057 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001058 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
1059 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001060 if(enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT)
1061 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001062 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
1063 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001064 if(enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT)
1065 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001066 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
1067 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001068 if(enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT)
1069 {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -06001070 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001071 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001072
1073 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001074 for(auto const& string : strings)
1075 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001076 enumeratorString += string;
1077
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001078 if(string != strings.back())
1079 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001080 enumeratorString += '|';
1081 }
1082 }
1083
1084 return enumeratorString;
1085}
1086
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001087static
1088bool ValidateEnumerator(VkColorComponentFlagBits const& enumerator)
1089{
1090 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT |
1091 VK_COLOR_COMPONENT_B_BIT |
1092 VK_COLOR_COMPONENT_G_BIT |
1093 VK_COLOR_COMPONENT_R_BIT);
1094 if(enumerator & (~allFlags))
1095 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001096 return false;
1097 }
1098
1099 return true;
1100}
1101
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001102static
1103std::string EnumeratorString(VkColorComponentFlagBits const& enumerator)
1104{
1105 if(!ValidateEnumerator(enumerator))
1106 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001107 return "unrecognized enumerator";
1108 }
1109
1110 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001111 if(enumerator & VK_COLOR_COMPONENT_A_BIT)
1112 {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001113 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001114 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001115 if(enumerator & VK_COLOR_COMPONENT_B_BIT)
1116 {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001117 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001118 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001119 if(enumerator & VK_COLOR_COMPONENT_G_BIT)
1120 {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001121 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001122 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001123 if(enumerator & VK_COLOR_COMPONENT_R_BIT)
1124 {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001125 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001126 }
1127
1128 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001129 for(auto const& string : strings)
1130 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001131 enumeratorString += string;
1132
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001133 if(string != strings.back())
1134 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001135 enumeratorString += '|';
1136 }
1137 }
1138
1139 return enumeratorString;
1140}
1141
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001142static
1143bool ValidateEnumerator(VkPipelineCreateFlagBits const& enumerator)
1144{
1145 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(VK_PIPELINE_CREATE_DERIVATIVE_BIT |
1146 VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT |
1147 VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
1148 if(enumerator & (~allFlags))
1149 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001150 return false;
1151 }
1152
1153 return true;
1154}
1155
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001156static
1157std::string EnumeratorString(VkPipelineCreateFlagBits const& enumerator)
1158{
1159 if(!ValidateEnumerator(enumerator))
1160 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001161 return "unrecognized enumerator";
1162 }
1163
1164 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001165 if(enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT)
1166 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001167 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
1168 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001169 if(enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT)
1170 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001171 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
1172 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001173 if(enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT)
1174 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001175 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001176 }
1177
1178 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001179 for(auto const& string : strings)
1180 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001181 enumeratorString += string;
1182
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001183 if(string != strings.back())
1184 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001185 enumeratorString += '|';
1186 }
1187 }
1188
1189 return enumeratorString;
1190}
1191
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001192static
1193bool ValidateEnumerator(VkShaderStageFlagBits const& enumerator)
1194{
1195 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(VK_SHADER_STAGE_ALL |
1196 VK_SHADER_STAGE_FRAGMENT_BIT |
1197 VK_SHADER_STAGE_GEOMETRY_BIT |
1198 VK_SHADER_STAGE_COMPUTE_BIT |
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -06001199 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT |
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001200 VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT |
1201 VK_SHADER_STAGE_VERTEX_BIT);
1202 if(enumerator & (~allFlags))
1203 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001204 return false;
1205 }
1206
1207 return true;
1208}
1209
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001210static
1211std::string EnumeratorString(VkShaderStageFlagBits const& enumerator)
1212{
1213 if(!ValidateEnumerator(enumerator))
1214 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001215 return "unrecognized enumerator";
1216 }
1217
1218 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001219 if(enumerator & VK_SHADER_STAGE_ALL)
1220 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001221 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001222 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001223 if(enumerator & VK_SHADER_STAGE_FRAGMENT_BIT)
1224 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001225 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001226 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001227 if(enumerator & VK_SHADER_STAGE_GEOMETRY_BIT)
1228 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001229 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
1230 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001231 if(enumerator & VK_SHADER_STAGE_COMPUTE_BIT)
1232 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001233 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
1234 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001235 if(enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT)
1236 {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -06001237 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001238 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001239 if(enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT)
1240 {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -06001241 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001242 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001243 if(enumerator & VK_SHADER_STAGE_VERTEX_BIT)
1244 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001245 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001246 }
1247
1248 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001249 for(auto const& string : strings)
1250 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001251 enumeratorString += string;
1252
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001253 if(string != strings.back())
1254 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001255 enumeratorString += '|';
1256 }
1257 }
1258
1259 return enumeratorString;
1260}
1261
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001262static
1263bool ValidateEnumerator(VkPipelineStageFlagBits const& enumerator)
1264{
Chia-I Wu89d0f942015-10-31 00:31:16 +08001265 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Chia-I Wu89d0f942015-10-31 00:31:16 +08001266 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT |
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001267 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT |
1268 VK_PIPELINE_STAGE_HOST_BIT |
1269 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT |
1270 VK_PIPELINE_STAGE_TRANSFER_BIT |
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001271 VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
Jon Ashburn4bf8ba42015-12-31 12:14:37 -07001272 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001273 VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
Jon Ashburn4bf8ba42015-12-31 12:14:37 -07001274 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
1275 VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT |
1276 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
1277 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT |
1278 VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
1279 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
1280 VK_PIPELINE_STAGE_VERTEX_INPUT_BIT |
1281 VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
1282 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001283 if(enumerator & (~allFlags))
1284 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001285 return false;
1286 }
1287
1288 return true;
1289}
1290
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001291static
1292std::string EnumeratorString(VkPipelineStageFlagBits const& enumerator)
1293{
1294 if(!ValidateEnumerator(enumerator))
1295 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001296 return "unrecognized enumerator";
1297 }
1298
1299 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001300 if(enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT)
1301 {
Chia-I Wu89d0f942015-10-31 00:31:16 +08001302 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
1303 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001304 if(enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT)
1305 {
Chia-I Wu89d0f942015-10-31 00:31:16 +08001306 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001307 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001308 if(enumerator & VK_PIPELINE_STAGE_HOST_BIT)
1309 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001310 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001311 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001312 if(enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT)
1313 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001314 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001315 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001316 if(enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT)
1317 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001318 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001319 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001320 if(enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
1321 {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -07001322 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001323 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001324 if(enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT)
1325 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001326 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001327 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001328 if(enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT)
1329 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001330 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001331 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001332 if(enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT)
1333 {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -06001334 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001335 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001336 if(enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT)
1337 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001338 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001339 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001340 if(enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT)
1341 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001342 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
1343 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001344 if(enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT)
1345 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001346 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
1347 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001348 if(enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT)
1349 {
1350 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001351 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001352 if(enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT)
1353 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001354 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
1355 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001356 if(enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT)
1357 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001358 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
1359 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001360 if(enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT)
1361 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001362 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
1363 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001364 if(enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT)
1365 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001366 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001367 }
1368
1369 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001370 for(auto const& string : strings)
1371 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001372 enumeratorString += string;
1373
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001374 if(string != strings.back())
1375 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001376 enumeratorString += '|';
1377 }
1378 }
1379
1380 return enumeratorString;
1381}
1382
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001383static
1384bool ValidateEnumerator(VkAccessFlagBits const& enumerator)
1385{
Chia-I Wua4594202015-10-27 19:54:37 +08001386 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001387 VK_ACCESS_INDIRECT_COMMAND_READ_BIT |
1388 VK_ACCESS_INDEX_READ_BIT |
1389 VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
1390 VK_ACCESS_UNIFORM_READ_BIT |
1391 VK_ACCESS_INPUT_ATTACHMENT_READ_BIT |
1392 VK_ACCESS_SHADER_READ_BIT |
1393 VK_ACCESS_SHADER_WRITE_BIT |
1394 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
1395 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
1396 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
1397 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
1398 VK_ACCESS_TRANSFER_READ_BIT |
1399 VK_ACCESS_TRANSFER_WRITE_BIT |
1400 VK_ACCESS_HOST_READ_BIT |
1401 VK_ACCESS_HOST_WRITE_BIT |
1402 VK_ACCESS_MEMORY_READ_BIT |
1403 VK_ACCESS_MEMORY_WRITE_BIT);
Chia-I Wua4594202015-10-27 19:54:37 +08001404
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001405 if(enumerator & (~allFlags))
1406 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001407 return false;
1408 }
1409
1410 return true;
1411}
1412
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001413static
1414std::string EnumeratorString(VkAccessFlagBits const& enumerator)
1415{
1416 if(!ValidateEnumerator(enumerator))
1417 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001418 return "unrecognized enumerator";
1419 }
1420
1421 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001422 if(enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT)
1423 {
Chia-I Wua4594202015-10-27 19:54:37 +08001424 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001425 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001426 if(enumerator & VK_ACCESS_INDEX_READ_BIT)
1427 {
Chia-I Wua4594202015-10-27 19:54:37 +08001428 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001429 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001430 if(enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT)
1431 {
Chia-I Wua4594202015-10-27 19:54:37 +08001432 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001433 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001434 if(enumerator & VK_ACCESS_UNIFORM_READ_BIT)
1435 {
Chia-I Wua4594202015-10-27 19:54:37 +08001436 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001437 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001438 if(enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT)
1439 {
Chia-I Wua4594202015-10-27 19:54:37 +08001440 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001441 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001442 if(enumerator & VK_ACCESS_SHADER_READ_BIT)
1443 {
Chia-I Wua4594202015-10-27 19:54:37 +08001444 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001445 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001446 if(enumerator & VK_ACCESS_SHADER_WRITE_BIT)
1447 {
Chia-I Wua4594202015-10-27 19:54:37 +08001448 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001449 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001450 if(enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT)
1451 {
Chia-I Wua4594202015-10-27 19:54:37 +08001452 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001453 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001454 if(enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT)
1455 {
Chia-I Wua4594202015-10-27 19:54:37 +08001456 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001457 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001458 if(enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT)
1459 {
Chia-I Wua4594202015-10-27 19:54:37 +08001460 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001461 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001462 if(enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT)
1463 {
Chia-I Wua4594202015-10-27 19:54:37 +08001464 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001465 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001466 if(enumerator & VK_ACCESS_TRANSFER_READ_BIT)
1467 {
Chia-I Wua4594202015-10-27 19:54:37 +08001468 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001469 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001470 if(enumerator & VK_ACCESS_TRANSFER_WRITE_BIT)
1471 {
Chia-I Wua4594202015-10-27 19:54:37 +08001472 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001473 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001474 if(enumerator & VK_ACCESS_HOST_READ_BIT)
1475 {
Chia-I Wua4594202015-10-27 19:54:37 +08001476 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001477 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001478 if(enumerator & VK_ACCESS_HOST_WRITE_BIT)
1479 {
Chia-I Wua4594202015-10-27 19:54:37 +08001480 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001481 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001482 if(enumerator & VK_ACCESS_MEMORY_READ_BIT)
1483 {
Chia-I Wua4594202015-10-27 19:54:37 +08001484 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001485 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001486 if(enumerator & VK_ACCESS_MEMORY_WRITE_BIT)
1487 {
Chia-I Wua4594202015-10-27 19:54:37 +08001488 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001489 }
1490
1491 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001492 for(auto const& string : strings)
1493 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001494 enumeratorString += string;
1495
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001496 if(string != strings.back())
1497 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001498 enumeratorString += '|';
1499 }
1500 }
1501
1502 return enumeratorString;
1503}
1504
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001505static
1506bool ValidateEnumerator(VkCommandPoolCreateFlagBits const& enumerator)
1507{
1508 VkCommandPoolCreateFlagBits allFlags = (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT |
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001509 VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001510 if(enumerator & (~allFlags))
1511 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001512 return false;
1513 }
1514
1515 return true;
1516}
1517
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001518static
1519std::string EnumeratorString(VkCommandPoolCreateFlagBits const& enumerator)
1520{
1521 if(!ValidateEnumerator(enumerator))
1522 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001523 return "unrecognized enumerator";
1524 }
1525
1526 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001527 if(enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT)
1528 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001529 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001530 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001531 if(enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT)
1532 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001533 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001534 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001535
1536 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001537 for(auto const& string : strings)
1538 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001539 enumeratorString += string;
1540
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001541 if(string != strings.back())
1542 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001543 enumeratorString += '|';
1544 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001545 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001546
1547 return enumeratorString;
1548}
1549
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001550static
1551bool ValidateEnumerator(VkCommandPoolResetFlagBits const& enumerator)
1552{
1553 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
1554 if(enumerator & (~allFlags))
1555 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001556 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001557 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001558
1559 return true;
1560}
1561
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001562static
1563std::string EnumeratorString(VkCommandPoolResetFlagBits const& enumerator)
1564{
1565 if(!ValidateEnumerator(enumerator))
1566 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001567 return "unrecognized enumerator";
1568 }
1569
1570 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001571 if(enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT)
1572 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001573 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001574 }
1575
1576 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001577 for(auto const& string : strings)
1578 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001579 enumeratorString += string;
1580
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001581 if(string != strings.back())
1582 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001583 enumeratorString += '|';
1584 }
1585 }
1586
1587 return enumeratorString;
1588}
1589
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001590static
1591bool ValidateEnumerator(VkCommandBufferUsageFlags const& enumerator)
1592{
1593 VkCommandBufferUsageFlags allFlags = (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001594 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1595 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001596 if(enumerator & (~allFlags))
1597 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001598 return false;
1599 }
1600
1601 return true;
1602}
1603
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001604static
1605std::string EnumeratorString(VkCommandBufferUsageFlags const& enumerator)
1606{
1607 if(!ValidateEnumerator(enumerator))
1608 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001609 return "unrecognized enumerator";
1610 }
1611
1612 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001613 if(enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT)
1614 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001615 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001616 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001617 if(enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT)
1618 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001619 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001620 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001621 if(enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT)
1622 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001623 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001624 }
1625
1626 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001627 for(auto const& string : strings)
1628 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001629 enumeratorString += string;
1630
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001631 if(string != strings.back())
1632 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001633 enumeratorString += '|';
1634 }
1635 }
1636
1637 return enumeratorString;
1638}
1639
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001640static
1641bool ValidateEnumerator(VkCommandBufferResetFlagBits const& enumerator)
1642{
1643 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
1644 if(enumerator & (~allFlags))
1645 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001646 return false;
1647 }
1648
1649 return true;
1650}
1651
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001652static
1653std::string EnumeratorString(VkCommandBufferResetFlagBits const& enumerator)
1654{
1655 if(!ValidateEnumerator(enumerator))
1656 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001657 return "unrecognized enumerator";
1658 }
1659
1660 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001661 if(enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT)
1662 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001663 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001664 }
1665
1666 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001667 for(auto const& string : strings)
1668 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001669 enumeratorString += string;
1670
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001671 if(string != strings.back())
1672 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001673 enumeratorString += '|';
1674 }
1675 }
1676
1677 return enumeratorString;
1678}
1679
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001680static
1681bool ValidateEnumerator(VkImageAspectFlagBits const& enumerator)
1682{
1683 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT |
1684 VK_IMAGE_ASPECT_STENCIL_BIT |
1685 VK_IMAGE_ASPECT_DEPTH_BIT |
1686 VK_IMAGE_ASPECT_COLOR_BIT);
1687 if(enumerator & (~allFlags))
1688 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001689 return false;
1690 }
1691
1692 return true;
1693}
1694
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001695static
1696std::string EnumeratorString(VkImageAspectFlagBits const& enumerator)
1697{
1698 if(!ValidateEnumerator(enumerator))
1699 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001700 return "unrecognized enumerator";
1701 }
1702
1703 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001704 if(enumerator & VK_IMAGE_ASPECT_METADATA_BIT)
1705 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001706 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1707 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001708 if(enumerator & VK_IMAGE_ASPECT_STENCIL_BIT)
1709 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001710 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1711 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001712 if(enumerator & VK_IMAGE_ASPECT_DEPTH_BIT)
1713 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001714 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1715 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001716 if(enumerator & VK_IMAGE_ASPECT_COLOR_BIT)
1717 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001718 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1719 }
1720
1721 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001722 for(auto const& string : strings)
1723 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001724 enumeratorString += string;
1725
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001726 if(string != strings.back())
1727 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001728 enumeratorString += '|';
1729 }
1730 }
1731
1732 return enumeratorString;
1733}
1734
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001735static
1736bool ValidateEnumerator(VkQueryControlFlagBits const& enumerator)
1737{
1738 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
1739 if(enumerator & (~allFlags))
1740 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001741 return false;
1742 }
1743
1744 return true;
1745}
1746
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001747static
1748std::string EnumeratorString(VkQueryControlFlagBits const& enumerator)
1749{
1750 if(!ValidateEnumerator(enumerator))
1751 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001752 return "unrecognized enumerator";
1753 }
1754
1755 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001756 if(enumerator & VK_QUERY_CONTROL_PRECISE_BIT)
1757 {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001758 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001759 }
1760
1761 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001762 for(auto const& string : strings)
1763 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001764 enumeratorString += string;
1765
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001766 if(string != strings.back())
1767 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001768 enumeratorString += '|';
1769 }
1770 }
1771
1772 return enumeratorString;
1773}
1774
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001775static const int MaxParamCheckerStringLength = 256;
1776
1777VkBool32 validate_string(layer_data *my_data, const char *apiName, const char *stringName, const char *validateString)
1778{
1779 VkBool32 skipCall = VK_FALSE;
1780
1781 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1782
1783 if (result == VK_STRING_ERROR_NONE) {
1784 return skipCall;
1785 } else if (result & VK_STRING_ERROR_LENGTH) {
1786 skipCall = log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1787 "%s: string %s exceeds max length %d", apiName, stringName, MaxParamCheckerStringLength);
1788 } else if (result & VK_STRING_ERROR_BAD_DATA) {
1789 skipCall = log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1790 "%s: string %s contains invalid characters or is badly formed", apiName, stringName);
1791 }
1792 return skipCall;
1793}
1794
1795
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001796VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(
1797 const VkInstanceCreateInfo* pCreateInfo,
1798 const VkAllocationCallbacks* pAllocator,
1799 VkInstance* pInstance)
1800{
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001801 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1802 VkBool32 skipCall = VK_FALSE;
1803 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001804
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001805 skipCall |= validate_string(my_device_data, "vkCreateInstance()", "VkInstanceCreateInfo->VkApplicationInfo->pApplicationName",
1806 pCreateInfo->pApplicationInfo->pApplicationName);
1807
1808 skipCall |= validate_string(my_device_data, "vkCreateInstance()", "VkInstanceCreateInfo->VkApplicationInfo->pEngineName",
1809 pCreateInfo->pApplicationInfo->pEngineName);
1810
1811 if (skipCall == VK_FALSE) {
1812 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
1813 assert(chain_info->u.pLayerInfo);
1814 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1815 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance) fpGetInstanceProcAddr(NULL, "vkCreateInstance");
1816 if (fpCreateInstance == NULL) {
1817 return VK_ERROR_INITIALIZATION_FAILED;
1818 }
1819
1820 // Advance the link info for the next element on the chain
1821 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1822
1823 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
1824 if (result != VK_SUCCESS)
1825 return result;
1826
1827 layer_data *my_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1828 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
1829
1830 my_data->report_data = debug_report_create_instance(
1831 pTable,
1832 *pInstance,
1833 pCreateInfo->enabledExtensionCount,
1834 pCreateInfo->ppEnabledExtensionNames);
1835
1836 InitParamChecker(my_data, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001837 }
1838
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001839 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001840}
1841
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001842VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(
1843 VkInstance instance,
1844 const VkAllocationCallbacks* pAllocator)
1845{
Jeremy Hayes99a96322015-06-26 12:48:09 -06001846 // Grab the key before the instance is destroyed.
1847 dispatch_key key = get_dispatch_key(instance);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001848 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Chia-I Wuf7458c52015-10-26 21:10:41 +08001849 pTable->DestroyInstance(instance, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001850
1851 // Clean up logging callback, if any
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001852 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1853 while (my_data->logging_callback.size() > 0) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001854 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -07001855 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001856 my_data->logging_callback.pop_back();
Jeremy Hayes99a96322015-06-26 12:48:09 -06001857 }
1858
1859 layer_debug_report_destroy_instance(mid(instance));
1860 layer_data_map.erase(pTable);
1861
1862 pc_instance_table_map.erase(key);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001863}
1864
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001865bool PostEnumeratePhysicalDevices(
1866 VkInstance instance,
1867 uint32_t* pPhysicalDeviceCount,
1868 VkPhysicalDevice* pPhysicalDevices,
1869 VkResult result)
1870{
Jeremy Hayes99a96322015-06-26 12:48:09 -06001871
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001872 if(pPhysicalDeviceCount != nullptr)
1873 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001874 }
1875
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001876 if(pPhysicalDevices != nullptr)
1877 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001878 }
1879
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001880 if(result < VK_SUCCESS)
1881 {
1882 std::string reason = "vkEnumeratePhysicalDevices parameter, VkResult result, is " + EnumeratorString(result);
1883 log_msg(mid(instance), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001884 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001885 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001886
1887 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001888}
1889
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001890VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDevices(
1891 VkInstance instance,
1892 uint32_t* pPhysicalDeviceCount,
1893 VkPhysicalDevice* pPhysicalDevices)
1894{
1895 VkResult result = get_dispatch_table(pc_instance_table_map, instance)->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001896
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001897 PostEnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001898
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001899 return result;
1900}
1901
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001902bool PostGetPhysicalDeviceFeatures(
1903 VkPhysicalDevice physicalDevice,
1904 VkPhysicalDeviceFeatures* pFeatures)
1905{
Jeremy Hayes99a96322015-06-26 12:48:09 -06001906
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001907 if(pFeatures != nullptr)
1908 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001909 }
1910
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001911 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001912}
1913
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001914VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFeatures(
1915 VkPhysicalDevice physicalDevice,
1916 VkPhysicalDeviceFeatures* pFeatures)
1917{
1918 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001919
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06001920 PostGetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001921}
1922
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001923bool PostGetPhysicalDeviceFormatProperties(
1924 VkPhysicalDevice physicalDevice,
1925 VkFormat format,
1926 VkFormatProperties* pFormatProperties)
1927{
Jeremy Hayes99a96322015-06-26 12:48:09 -06001928
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001929 if(format < VK_FORMAT_BEGIN_RANGE ||
1930 format > VK_FORMAT_END_RANGE)
1931 {
1932 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1933 "vkGetPhysicalDeviceFormatProperties parameter, VkFormat format, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001934 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001935 }
1936
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001937 if(pFormatProperties != nullptr)
1938 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001939 }
1940
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001941 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001942}
1943
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001944VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFormatProperties(
1945 VkPhysicalDevice physicalDevice,
1946 VkFormat format,
1947 VkFormatProperties* pFormatProperties)
1948{
1949 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001950
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001951 PostGetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001952}
1953
1954bool PostGetPhysicalDeviceImageFormatProperties(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001955 VkPhysicalDevice physicalDevice,
1956 VkFormat format,
1957 VkImageType type,
1958 VkImageTiling tiling,
1959 VkImageUsageFlags usage,
1960 VkImageCreateFlags flags,
1961 VkImageFormatProperties* pImageFormatProperties,
1962 VkResult result)
1963{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001964
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001965 if(format < VK_FORMAT_BEGIN_RANGE ||
1966 format > VK_FORMAT_END_RANGE)
1967 {
1968 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1969 "vkGetPhysicalDeviceImageFormatProperties parameter, VkFormat format, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001970 return false;
1971 }
1972
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001973 if(type < VK_IMAGE_TYPE_BEGIN_RANGE ||
1974 type > VK_IMAGE_TYPE_END_RANGE)
1975 {
1976 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1977 "vkGetPhysicalDeviceImageFormatProperties parameter, VkImageType type, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001978 return false;
1979 }
1980
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001981 if(tiling < VK_IMAGE_TILING_BEGIN_RANGE ||
1982 tiling > VK_IMAGE_TILING_END_RANGE)
1983 {
1984 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1985 "vkGetPhysicalDeviceImageFormatProperties parameter, VkImageTiling tiling, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001986 return false;
1987 }
1988
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001989
1990 if(pImageFormatProperties != nullptr)
1991 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001992 }
1993
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001994 if(result < VK_SUCCESS)
1995 {
1996 std::string reason = "vkGetPhysicalDeviceImageFormatProperties parameter, VkResult result, is " + EnumeratorString(result);
1997 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Chia-I Wu17241042015-10-31 00:31:16 +08001998 return false;
1999 }
2000
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002001 return true;
2002}
2003
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002004VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceImageFormatProperties(
2005 VkPhysicalDevice physicalDevice,
2006 VkFormat format,
2007 VkImageType type,
2008 VkImageTiling tiling,
2009 VkImageUsageFlags usage,
2010 VkImageCreateFlags flags,
2011 VkImageFormatProperties* pImageFormatProperties)
2012{
2013 VkResult result = get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002014
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002015 PostGetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties, result);
Chia-I Wu17241042015-10-31 00:31:16 +08002016
2017 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002018}
2019
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002020bool PostGetPhysicalDeviceProperties(
2021 VkPhysicalDevice physicalDevice,
2022 VkPhysicalDeviceProperties* pProperties)
2023{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002024
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002025 if(pProperties != nullptr)
2026 {
2027 if(pProperties->deviceType < VK_PHYSICAL_DEVICE_TYPE_BEGIN_RANGE ||
2028 pProperties->deviceType > VK_PHYSICAL_DEVICE_TYPE_END_RANGE)
2029 {
2030 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2031 "vkGetPhysicalDeviceProperties parameter, VkPhysicalDeviceType pProperties->deviceType, is an unrecognized enumerator");
2032 return false;
2033 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002034
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002035 }
2036
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002037 return true;
2038}
2039
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002040VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceProperties(
2041 VkPhysicalDevice physicalDevice,
2042 VkPhysicalDeviceProperties* pProperties)
2043{
2044 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002045
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06002046 PostGetPhysicalDeviceProperties(physicalDevice, pProperties);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002047}
2048
Cody Northropd0802882015-08-03 17:04:53 -06002049bool PostGetPhysicalDeviceQueueFamilyProperties(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002050 VkPhysicalDevice physicalDevice,
2051 uint32_t* pCount,
2052 VkQueueFamilyProperties* pQueueProperties)
2053{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002054
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002055 if(pQueueProperties == nullptr && pCount != nullptr)
2056 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002057 }
2058
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002059 if(pQueueProperties != nullptr)
2060 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002061 }
2062
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002063 return true;
2064}
2065
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002066VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceQueueFamilyProperties(
2067 VkPhysicalDevice physicalDevice,
2068 uint32_t* pCount,
2069 VkQueueFamilyProperties* pQueueProperties)
2070{
2071 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pCount, pQueueProperties);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002072
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002073 PostGetPhysicalDeviceQueueFamilyProperties(physicalDevice, pCount, pQueueProperties);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002074}
2075
2076bool PostGetPhysicalDeviceMemoryProperties(
2077 VkPhysicalDevice physicalDevice,
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002078 VkPhysicalDeviceMemoryProperties* pMemoryProperties)
2079{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002080
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002081 if(pMemoryProperties != nullptr)
2082 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002083 }
2084
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002085 return true;
2086}
2087
Chia-I Wu9ab61502015-11-06 06:42:02 +08002088VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceMemoryProperties(
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002089 VkPhysicalDevice physicalDevice,
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002090 VkPhysicalDeviceMemoryProperties* pMemoryProperties)
2091{
2092 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002093
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06002094 PostGetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002095}
2096
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002097void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06002098 std::unordered_set<uint32_t> set;
2099 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
2100 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002101 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2102 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this structure.", i);
Michael Lentine157a2ec2016-01-27 11:25:05 -06002103 } else {
2104 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
2105 }
Michael Lentine26244832016-01-27 11:40:27 -06002106 if (pCreateInfo->pQueueCreateInfos[i].queueCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002107 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2108 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount, cannot be zero.", i);
Michael Lentinefa71bd52016-01-27 12:50:30 -06002109 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002110 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
2111 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f || pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f) {
2112 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2113 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be between 0 and 1. Actual value is %f", i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
Michael Lentinefa71bd52016-01-27 12:50:30 -06002114 }
Michael Lentine26244832016-01-27 11:40:27 -06002115 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002116 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
2117 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2118 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number of queue families.", i);
2119 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount > properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
2120 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2121 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of queues for the given family index.", i);
Michael Lentine774704f2016-01-27 13:36:46 -06002122 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06002123 }
2124}
2125
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002126void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo* pCreateInfo) {
2127 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Michael Lentinebdf744f2016-01-27 15:43:43 -06002128 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
2129 my_device_data->queueFamilyIndexMap.insert(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002130 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
Michael Lentinebdf744f2016-01-27 15:43:43 -06002131 }
2132}
2133
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002134VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(
2135 VkPhysicalDevice physicalDevice,
2136 const VkDeviceCreateInfo* pCreateInfo,
2137 const VkAllocationCallbacks* pAllocator,
2138 VkDevice* pDevice)
2139{
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06002140 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06002141 * NOTE: We do not validate physicalDevice or any dispatchable
2142 * object as the first parameter. We couldn't get here if it was wrong!
2143 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07002144
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002145 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2146 VkBool32 skipCall = VK_FALSE;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002147 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07002148
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002149 for (auto i = 0; i < pCreateInfo->enabledLayerCount; i++) {
2150 skipCall |= validate_string(my_instance_data, "vkCreateDevice()", "VkDeviceCreateInfo->ppEnabledLayerNames",
2151 pCreateInfo->ppEnabledLayerNames[i]);
2152 }
Michael Lentine774704f2016-01-27 13:36:46 -06002153
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002154 for (auto i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
2155 skipCall |= validate_string(my_instance_data, "vkCreateDevice()", "VkDeviceCreateInfo->ppEnabledExtensionNames",
2156 pCreateInfo->ppEnabledExtensionNames[i]);
2157 }
2158
2159 if (skipCall == VK_FALSE) {
2160 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
2161 assert(chain_info->u.pLayerInfo);
2162 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
2163 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
2164 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice) fpGetInstanceProcAddr(NULL, "vkCreateDevice");
2165 if (fpCreateDevice == NULL) {
2166 return VK_ERROR_INITIALIZATION_FAILED;
2167 }
2168
2169 // Advance the link info for the next element on the chain
2170 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
2171
2172 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
2173 if (result != VK_SUCCESS) {
2174 return result;
2175 }
2176
2177 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
2178 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
2179 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
2180
2181 uint32_t count;
2182 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
2183 std::vector<VkQueueFamilyProperties> properties(count);
2184 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
2185
2186 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
2187 storeCreateDeviceData(*pDevice, pCreateInfo);
2188 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06002189
Jeremy Hayes99a96322015-06-26 12:48:09 -06002190 return result;
2191}
2192
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002193VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(
2194 VkDevice device,
2195 const VkAllocationCallbacks* pAllocator)
2196{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002197 layer_debug_report_destroy_device(device);
2198
2199 dispatch_key key = get_dispatch_key(device);
2200#if DISPATCH_MAP_DEBUG
2201 fprintf(stderr, "Device: %p, key: %p\n", device, key);
2202#endif
2203
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002204 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002205 pc_device_table_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002206}
2207
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002208bool PreGetDeviceQueue(
2209 VkDevice device,
2210 uint32_t queueFamilyIndex,
2211 uint32_t queueIndex)
2212{
2213 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2214 auto queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06002215 if (queue_data == my_device_data->queueFamilyIndexMap.end()) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002216 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2217 "VkGetDeviceQueue parameter, uint32_t queueFamilyIndex %d, must have been given when the device was created.", queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06002218 return false;
2219 }
2220 if (queue_data->second <= queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002221 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2222 "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device was created.", queueIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06002223 return false;
2224 }
2225 return true;
2226}
2227
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002228bool PostGetDeviceQueue(
2229 VkDevice device,
2230 uint32_t queueFamilyIndex,
2231 uint32_t queueIndex,
2232 VkQueue* pQueue)
2233{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002234
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002235
2236
2237 if(pQueue != nullptr)
2238 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002239 }
2240
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002241 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002242}
2243
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002244VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetDeviceQueue(
2245 VkDevice device,
2246 uint32_t queueFamilyIndex,
2247 uint32_t queueIndex,
2248 VkQueue* pQueue)
2249{
Michael Lentinebdf744f2016-01-27 15:43:43 -06002250 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
2251
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002252 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002253
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06002254 PostGetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002255}
2256
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002257bool PreQueueSubmit(
2258 VkQueue queue,
2259 const VkSubmitInfo* submit)
2260{
2261 if(submit->sType != VK_STRUCTURE_TYPE_SUBMIT_INFO) {
2262 log_msg(mdd(queue), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2263 "vkQueueSubmit parameter, VkStructureType pSubmits->sType, is an invalid enumerator");
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002264 return false;
2265 }
2266
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002267 if(submit->pCommandBuffers != nullptr)
2268 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002269 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002270
2271 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002272}
2273
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002274bool PostQueueSubmit(
2275 VkQueue queue,
2276 uint32_t commandBufferCount,
2277 VkFence fence,
2278 VkResult result)
2279{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002280
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002281
2282
2283 if(result < VK_SUCCESS)
2284 {
2285 std::string reason = "vkQueueSubmit parameter, VkResult result, is " + EnumeratorString(result);
2286 log_msg(mdd(queue), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002287 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002288 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002289
2290 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002291}
2292
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002293VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueSubmit(
2294 VkQueue queue,
2295 uint32_t submitCount,
2296 const VkSubmitInfo* pSubmits,
2297 VkFence fence)
2298{
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002299 for (uint32_t i = 0; i < submitCount; i++) {
Chia-I Wu40cf0ae2015-10-26 17:20:32 +08002300 PreQueueSubmit(queue, &pSubmits[i]);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002301 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002302
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002303 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002304
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002305 PostQueueSubmit(queue, submitCount, fence, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002306
2307 return result;
2308}
2309
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002310bool PostQueueWaitIdle(
2311 VkQueue queue,
2312 VkResult result)
2313{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002314
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002315 if(result < VK_SUCCESS)
2316 {
2317 std::string reason = "vkQueueWaitIdle parameter, VkResult result, is " + EnumeratorString(result);
2318 log_msg(mdd(queue), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002319 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002320 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002321
2322 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002323}
2324
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002325VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueWaitIdle(
2326 VkQueue queue)
2327{
2328 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002329
2330 PostQueueWaitIdle(queue, result);
2331
2332 return result;
2333}
2334
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002335bool PostDeviceWaitIdle(
2336 VkDevice device,
2337 VkResult result)
2338{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002339
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002340 if(result < VK_SUCCESS)
2341 {
2342 std::string reason = "vkDeviceWaitIdle parameter, VkResult result, is " + EnumeratorString(result);
2343 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002344 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002345 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002346
2347 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002348}
2349
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002350VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkDeviceWaitIdle(
2351 VkDevice device)
2352{
2353 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002354
2355 PostDeviceWaitIdle(device, result);
2356
2357 return result;
2358}
2359
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002360bool PreAllocateMemory(
2361 VkDevice device,
2362 const VkMemoryAllocateInfo* pAllocateInfo)
2363{
2364 if(pAllocateInfo != nullptr)
2365 {
2366 if(pAllocateInfo->sType != VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO)
2367 {
2368 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2369 "vkAllocateMemory parameter, VkStructureType pAllocateInfo->sType, is an invalid enumerator");
2370 return false;
2371 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002372 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002373
2374 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002375}
2376
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002377bool PostAllocateMemory(
2378 VkDevice device,
2379 VkDeviceMemory* pMemory,
2380 VkResult result)
2381{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002382
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002383 if(pMemory != nullptr)
2384 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002385 }
2386
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002387 if(result < VK_SUCCESS)
2388 {
2389 std::string reason = "vkAllocateMemory parameter, VkResult result, is " + EnumeratorString(result);
2390 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002391 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002392 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002393
2394 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002395}
2396
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002397VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateMemory(
2398 VkDevice device,
2399 const VkMemoryAllocateInfo* pAllocateInfo,
2400 const VkAllocationCallbacks* pAllocator,
2401 VkDeviceMemory* pMemory)
2402{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002403 PreAllocateMemory(device, pAllocateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002404
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002405 VkResult result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002406
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002407 PostAllocateMemory(device, pMemory, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002408
2409 return result;
2410}
2411
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002412bool PostMapMemory(
2413 VkDevice device,
2414 VkDeviceMemory mem,
2415 VkDeviceSize offset,
2416 VkDeviceSize size,
2417 VkMemoryMapFlags flags,
2418 void** ppData,
2419 VkResult result)
2420{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002421
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002422
2423
2424
2425
2426 if(ppData != nullptr)
2427 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002428 }
2429
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002430 if(result < VK_SUCCESS)
2431 {
2432 std::string reason = "vkMapMemory parameter, VkResult result, is " + EnumeratorString(result);
2433 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002434 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002435 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002436
2437 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002438}
2439
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002440VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkMapMemory(
2441 VkDevice device,
2442 VkDeviceMemory mem,
2443 VkDeviceSize offset,
2444 VkDeviceSize size,
2445 VkMemoryMapFlags flags,
2446 void** ppData)
2447{
2448 VkResult result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, mem, offset, size, flags, ppData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002449
2450 PostMapMemory(device, mem, offset, size, flags, ppData, result);
2451
2452 return result;
2453}
2454
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002455bool PreFlushMappedMemoryRanges(
2456 VkDevice device,
2457 const VkMappedMemoryRange* pMemoryRanges)
2458{
2459 if(pMemoryRanges != nullptr)
2460 {
2461 if(pMemoryRanges->sType != VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE)
2462 {
2463 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2464 "vkFlushMappedMemoryRanges parameter, VkStructureType pMemoryRanges->sType, is an invalid enumerator");
2465 return false;
2466 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002467 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002468
2469 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002470}
2471
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002472bool PostFlushMappedMemoryRanges(
2473 VkDevice device,
2474 uint32_t memoryRangeCount,
2475 VkResult result)
2476{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002477
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002478
2479 if(result < VK_SUCCESS)
2480 {
2481 std::string reason = "vkFlushMappedMemoryRanges parameter, VkResult result, is " + EnumeratorString(result);
2482 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002483 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002484 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002485
2486 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002487}
2488
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002489VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFlushMappedMemoryRanges(
2490 VkDevice device,
2491 uint32_t memoryRangeCount,
2492 const VkMappedMemoryRange* pMemoryRanges)
2493{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002494 PreFlushMappedMemoryRanges(device, pMemoryRanges);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002495
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002496 VkResult result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06002497
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002498 PostFlushMappedMemoryRanges(device, memoryRangeCount, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002499
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06002500 return result;
2501}
2502
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002503bool PreInvalidateMappedMemoryRanges(
2504 VkDevice device,
2505 const VkMappedMemoryRange* pMemoryRanges)
2506{
2507 if(pMemoryRanges != nullptr)
2508 {
2509 if(pMemoryRanges->sType != VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE)
2510 {
2511 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2512 "vkInvalidateMappedMemoryRanges parameter, VkStructureType pMemoryRanges->sType, is an invalid enumerator");
2513 return false;
2514 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002515 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002516
2517 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002518}
2519
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002520bool PostInvalidateMappedMemoryRanges(
2521 VkDevice device,
2522 uint32_t memoryRangeCount,
2523 VkResult result)
2524{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002525
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002526
2527 if(result < VK_SUCCESS)
2528 {
2529 std::string reason = "vkInvalidateMappedMemoryRanges parameter, VkResult result, is " + EnumeratorString(result);
2530 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002531 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002532 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002533
2534 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002535}
2536
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002537VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkInvalidateMappedMemoryRanges(
2538 VkDevice device,
2539 uint32_t memoryRangeCount,
2540 const VkMappedMemoryRange* pMemoryRanges)
2541{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002542 PreInvalidateMappedMemoryRanges(device, pMemoryRanges);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002543
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002544 VkResult result = get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06002545
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002546 PostInvalidateMappedMemoryRanges(device, memoryRangeCount, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002547
Tony Barbourb1250542015-04-16 19:23:13 -06002548 return result;
2549}
2550
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002551bool PostGetDeviceMemoryCommitment(
2552 VkDevice device,
2553 VkDeviceMemory memory,
2554 VkDeviceSize* pCommittedMemoryInBytes)
2555{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002556
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002557
2558 if(pCommittedMemoryInBytes != nullptr)
2559 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002560 }
2561
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002562 return true;
2563}
2564
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002565VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetDeviceMemoryCommitment(
2566 VkDevice device,
2567 VkDeviceMemory memory,
2568 VkDeviceSize* pCommittedMemoryInBytes)
2569{
2570 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06002571
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06002572 PostGetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06002573}
2574
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002575bool PostBindBufferMemory(
2576 VkDevice device,
2577 VkBuffer buffer,
2578 VkDeviceMemory mem,
2579 VkDeviceSize memoryOffset,
2580 VkResult result)
2581{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002582
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002583
2584
2585
2586 if(result < VK_SUCCESS)
2587 {
2588 std::string reason = "vkBindBufferMemory parameter, VkResult result, is " + EnumeratorString(result);
2589 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002590 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002591 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002592
2593 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002594}
2595
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002596VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindBufferMemory(
2597 VkDevice device,
2598 VkBuffer buffer,
2599 VkDeviceMemory mem,
2600 VkDeviceSize memoryOffset)
2601{
2602 VkResult result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, mem, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002603
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002604 PostBindBufferMemory(device, buffer, mem, memoryOffset, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002605
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002606 return result;
2607}
2608
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002609bool PostBindImageMemory(
2610 VkDevice device,
2611 VkImage image,
2612 VkDeviceMemory mem,
2613 VkDeviceSize memoryOffset,
2614 VkResult result)
2615{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002616
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002617
2618
2619
2620 if(result < VK_SUCCESS)
2621 {
2622 std::string reason = "vkBindImageMemory parameter, VkResult result, is " + EnumeratorString(result);
2623 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002624 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002625 }
2626
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002627 return true;
2628}
2629
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002630VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindImageMemory(
2631 VkDevice device,
2632 VkImage image,
2633 VkDeviceMemory mem,
2634 VkDeviceSize memoryOffset)
2635{
2636 VkResult result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, mem, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002637
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002638 PostBindImageMemory(device, image, mem, memoryOffset, result);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002639
2640 return result;
2641}
2642
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002643bool PostGetBufferMemoryRequirements(
2644 VkDevice device,
2645 VkBuffer buffer,
2646 VkMemoryRequirements* pMemoryRequirements)
2647{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002648
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002649
2650 if(pMemoryRequirements != nullptr)
2651 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002652 }
2653
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002654 return true;
2655}
2656
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002657VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetBufferMemoryRequirements(
2658 VkDevice device,
2659 VkBuffer buffer,
2660 VkMemoryRequirements* pMemoryRequirements)
2661{
2662 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002663
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06002664 PostGetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002665}
2666
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002667bool PostGetImageMemoryRequirements(
2668 VkDevice device,
2669 VkImage image,
2670 VkMemoryRequirements* pMemoryRequirements)
2671{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002672
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002673
2674 if(pMemoryRequirements != nullptr)
2675 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002676 }
2677
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002678 return true;
2679}
2680
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002681VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetImageMemoryRequirements(
2682 VkDevice device,
2683 VkImage image,
2684 VkMemoryRequirements* pMemoryRequirements)
2685{
2686 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002687
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06002688 PostGetImageMemoryRequirements(device, image, pMemoryRequirements);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002689}
2690
2691bool PostGetImageSparseMemoryRequirements(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002692 VkDevice device,
2693 VkImage image,
2694 uint32_t* pNumRequirements,
2695 VkSparseImageMemoryRequirements* pSparseMemoryRequirements)
2696{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002697
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002698
2699 if(pNumRequirements != nullptr)
2700 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002701 }
2702
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002703 if(pSparseMemoryRequirements != nullptr)
2704 {
2705 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
2706 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
2707 {
2708 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2709 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
2710 return false;
2711 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002712 }
2713
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002714 return true;
2715}
2716
Chia-I Wu9ab61502015-11-06 06:42:02 +08002717VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetImageSparseMemoryRequirements(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002718 VkDevice device,
2719 VkImage image,
2720 uint32_t* pNumRequirements,
2721 VkSparseImageMemoryRequirements* pSparseMemoryRequirements)
2722{
2723 get_dispatch_table(pc_device_table_map, device)->GetImageSparseMemoryRequirements(device, image, pNumRequirements, pSparseMemoryRequirements);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002724
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002725 PostGetImageSparseMemoryRequirements(device, image, pNumRequirements, pSparseMemoryRequirements);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002726}
2727
2728bool PostGetPhysicalDeviceSparseImageFormatProperties(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002729 VkPhysicalDevice physicalDevice,
2730 VkFormat format,
2731 VkImageType type,
2732 VkSampleCountFlagBits samples,
2733 VkImageUsageFlags usage,
2734 VkImageTiling tiling,
2735 uint32_t* pNumProperties,
2736 VkSparseImageFormatProperties* pProperties)
2737{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002738
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002739 if(format < VK_FORMAT_BEGIN_RANGE ||
2740 format > VK_FORMAT_END_RANGE)
2741 {
2742 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2743 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkFormat format, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002744 return false;
2745 }
2746
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002747 if(type < VK_IMAGE_TYPE_BEGIN_RANGE ||
2748 type > VK_IMAGE_TYPE_END_RANGE)
2749 {
2750 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2751 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageType type, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002752 return false;
2753 }
2754
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002755
2756
2757 if(tiling < VK_IMAGE_TILING_BEGIN_RANGE ||
2758 tiling > VK_IMAGE_TILING_END_RANGE)
2759 {
2760 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2761 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageTiling tiling, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002762 return false;
2763 }
2764
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002765 if(pNumProperties != nullptr)
2766 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002767 }
2768
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002769 if(pProperties != nullptr)
2770 {
2771 if ((pProperties->aspectMask &
2772 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
2773 {
2774 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2775 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an unrecognized enumerator");
2776 return false;
2777 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002778 }
2779
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002780 return true;
2781}
2782
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002783VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceSparseImageFormatProperties(
2784 VkPhysicalDevice physicalDevice,
2785 VkFormat format,
2786 VkImageType type,
2787 VkSampleCountFlagBits samples,
2788 VkImageUsageFlags usage,
2789 VkImageTiling tiling,
2790 uint32_t* pNumProperties,
2791 VkSparseImageFormatProperties* pProperties)
2792{
2793 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pNumProperties, pProperties);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002794
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002795 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pNumProperties, pProperties);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002796}
2797
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002798bool PreQueueBindSparse(
2799 VkQueue queue,
2800 uint32_t bindInfoCount,
2801 const VkBindSparseInfo* pBindInfo)
2802{
2803 if(pBindInfo != nullptr)
2804 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002805 }
2806
2807 return true;
2808}
2809
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002810bool PostQueueBindSparse(
2811 VkQueue queue,
2812 uint32_t bindInfoCount,
2813 const VkBindSparseInfo* pBindInfo,
2814 VkFence fence,
2815 VkResult result)
2816{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002817
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002818
2819
2820 if(result < VK_SUCCESS)
2821 {
2822 std::string reason = "vkQueueBindSparse parameter, VkResult result, is " + EnumeratorString(result);
2823 log_msg(mdd(queue), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002824 return false;
2825 }
2826
2827 return true;
2828}
2829
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002830VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueBindSparse(
2831 VkQueue queue,
2832 uint32_t bindInfoCount,
2833 const VkBindSparseInfo* pBindInfo,
2834 VkFence fence)
2835{
Chia-I Wu1ff4c3d2015-10-26 16:55:27 +08002836 PreQueueBindSparse(queue, bindInfoCount, pBindInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002837
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002838 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002839
Chia-I Wu1ff4c3d2015-10-26 16:55:27 +08002840 PostQueueBindSparse(queue, bindInfoCount, pBindInfo, fence, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002841
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002842 return result;
2843}
2844
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002845bool PreCreateFence(
2846 VkDevice device,
2847 const VkFenceCreateInfo* pCreateInfo)
2848{
2849 if(pCreateInfo != nullptr)
2850 {
2851 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_FENCE_CREATE_INFO)
2852 {
2853 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2854 "vkCreateFence parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
2855 return false;
2856 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002857 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002858
2859 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002860}
2861
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002862bool PostCreateFence(
2863 VkDevice device,
2864 VkFence* pFence,
2865 VkResult result)
2866{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002867
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002868 if(pFence != nullptr)
2869 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002870 }
2871
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002872 if(result < VK_SUCCESS)
2873 {
2874 std::string reason = "vkCreateFence parameter, VkResult result, is " + EnumeratorString(result);
2875 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002876 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002877 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002878
2879 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002880}
2881
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002882VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateFence(
2883 VkDevice device,
2884 const VkFenceCreateInfo* pCreateInfo,
2885 const VkAllocationCallbacks* pAllocator,
2886 VkFence* pFence)
2887{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002888 PreCreateFence(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002889
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002890 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002891
2892 PostCreateFence(device, pFence, result);
2893
2894 return result;
2895}
2896
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002897bool PreResetFences(
2898 VkDevice device,
2899 const VkFence* pFences)
2900{
2901 if(pFences != nullptr)
2902 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002903 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002904
2905 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002906}
2907
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002908bool PostResetFences(
2909 VkDevice device,
2910 uint32_t fenceCount,
2911 VkResult result)
2912{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002913
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002914
2915 if(result < VK_SUCCESS)
2916 {
2917 std::string reason = "vkResetFences parameter, VkResult result, is " + EnumeratorString(result);
2918 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002919 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002920 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002921
2922 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002923}
2924
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002925VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetFences(
2926 VkDevice device,
2927 uint32_t fenceCount,
2928 const VkFence* pFences)
2929{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002930 PreResetFences(device, pFences);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002931
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002932 VkResult result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002933
2934 PostResetFences(device, fenceCount, result);
2935
2936 return result;
2937}
2938
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002939bool PostGetFenceStatus(
2940 VkDevice device,
2941 VkFence fence,
2942 VkResult result)
2943{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002944
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002945
2946 if(result < VK_SUCCESS)
2947 {
2948 std::string reason = "vkGetFenceStatus parameter, VkResult result, is " + EnumeratorString(result);
2949 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002950 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002951 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002952
2953 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002954}
2955
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002956VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceStatus(
2957 VkDevice device,
2958 VkFence fence)
2959{
2960 VkResult result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002961
2962 PostGetFenceStatus(device, fence, result);
2963
2964 return result;
2965}
2966
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002967bool PreWaitForFences(
2968 VkDevice device,
2969 const VkFence* pFences)
2970{
2971 if(pFences != nullptr)
2972 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002973 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002974
2975 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002976}
2977
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002978bool PostWaitForFences(
2979 VkDevice device,
2980 uint32_t fenceCount,
2981 VkBool32 waitAll,
2982 uint64_t timeout,
2983 VkResult result)
2984{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002985
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002986
2987
2988
2989 if(result < VK_SUCCESS)
2990 {
2991 std::string reason = "vkWaitForFences parameter, VkResult result, is " + EnumeratorString(result);
2992 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002993 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002994 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002995
2996 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002997}
2998
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002999VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkWaitForFences(
3000 VkDevice device,
3001 uint32_t fenceCount,
3002 const VkFence* pFences,
3003 VkBool32 waitAll,
3004 uint64_t timeout)
3005{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003006 PreWaitForFences(device, pFences);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003007
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003008 VkResult result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003009
3010 PostWaitForFences(device, fenceCount, waitAll, timeout, result);
3011
3012 return result;
3013}
3014
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003015bool PreCreateSemaphore(
3016 VkDevice device,
3017 const VkSemaphoreCreateInfo* pCreateInfo)
3018{
3019 if(pCreateInfo != nullptr)
3020 {
3021 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO)
3022 {
3023 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3024 "vkCreateSemaphore parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
3025 return false;
3026 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003027 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003028
3029 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003030}
3031
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003032bool PostCreateSemaphore(
3033 VkDevice device,
3034 VkSemaphore* pSemaphore,
3035 VkResult result)
3036{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003037
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003038 if(pSemaphore != nullptr)
3039 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003040 }
3041
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003042 if(result < VK_SUCCESS)
3043 {
3044 std::string reason = "vkCreateSemaphore parameter, VkResult result, is " + EnumeratorString(result);
3045 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003046 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003047 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003048
3049 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003050}
3051
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003052VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSemaphore(
3053 VkDevice device,
3054 const VkSemaphoreCreateInfo* pCreateInfo,
3055 const VkAllocationCallbacks* pAllocator,
3056 VkSemaphore* pSemaphore)
3057{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003058 PreCreateSemaphore(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003059
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003060 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003061
3062 PostCreateSemaphore(device, pSemaphore, result);
3063
3064 return result;
3065}
3066
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003067bool PreCreateEvent(
3068 VkDevice device,
3069 const VkEventCreateInfo* pCreateInfo)
3070{
3071 if(pCreateInfo != nullptr)
3072 {
3073 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_EVENT_CREATE_INFO)
3074 {
3075 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3076 "vkCreateEvent parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
3077 return false;
3078 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003079 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003080
3081 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003082}
3083
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003084bool PostCreateEvent(
3085 VkDevice device,
3086 VkEvent* pEvent,
3087 VkResult result)
3088{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003089
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003090 if(pEvent != nullptr)
3091 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003092 }
3093
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003094 if(result < VK_SUCCESS)
3095 {
3096 std::string reason = "vkCreateEvent parameter, VkResult result, is " + EnumeratorString(result);
3097 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003098 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003099 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003100
3101 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003102}
3103
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003104VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateEvent(
3105 VkDevice device,
3106 const VkEventCreateInfo* pCreateInfo,
3107 const VkAllocationCallbacks* pAllocator,
3108 VkEvent* pEvent)
3109{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003110 PreCreateEvent(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003111
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003112 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003113
3114 PostCreateEvent(device, pEvent, result);
3115
3116 return result;
3117}
3118
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003119bool PostGetEventStatus(
3120 VkDevice device,
3121 VkEvent event,
3122 VkResult result)
3123{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003124
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003125
3126 if(result < VK_SUCCESS)
3127 {
3128 std::string reason = "vkGetEventStatus parameter, VkResult result, is " + EnumeratorString(result);
3129 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003130 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003131 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003132
3133 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003134}
3135
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003136VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetEventStatus(
3137 VkDevice device,
3138 VkEvent event)
3139{
3140 VkResult result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003141
3142 PostGetEventStatus(device, event, result);
3143
3144 return result;
3145}
3146
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003147bool PostSetEvent(
3148 VkDevice device,
3149 VkEvent event,
3150 VkResult result)
3151{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003152
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003153
3154 if(result < VK_SUCCESS)
3155 {
3156 std::string reason = "vkSetEvent parameter, VkResult result, is " + EnumeratorString(result);
3157 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003158 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003159 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003160
3161 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003162}
3163
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003164VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkSetEvent(
3165 VkDevice device,
3166 VkEvent event)
3167{
3168 VkResult result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003169
3170 PostSetEvent(device, event, result);
3171
3172 return result;
3173}
3174
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003175bool PostResetEvent(
3176 VkDevice device,
3177 VkEvent event,
3178 VkResult result)
3179{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003180
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003181
3182 if(result < VK_SUCCESS)
3183 {
3184 std::string reason = "vkResetEvent parameter, VkResult result, is " + EnumeratorString(result);
3185 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003186 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003187 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003188
3189 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003190}
3191
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003192VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetEvent(
3193 VkDevice device,
3194 VkEvent event)
3195{
3196 VkResult result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003197
3198 PostResetEvent(device, event, result);
3199
3200 return result;
3201}
3202
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003203bool PreCreateQueryPool(
3204 VkDevice device,
3205 const VkQueryPoolCreateInfo* pCreateInfo)
3206{
3207 if(pCreateInfo != nullptr)
3208 {
3209 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO)
3210 {
3211 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3212 "vkCreateQueryPool parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
3213 return false;
3214 }
3215 if(pCreateInfo->queryType < VK_QUERY_TYPE_BEGIN_RANGE ||
3216 pCreateInfo->queryType > VK_QUERY_TYPE_END_RANGE)
3217 {
3218 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3219 "vkCreateQueryPool parameter, VkQueryType pCreateInfo->queryType, is an unrecognized enumerator");
3220 return false;
3221 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003222 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003223
3224 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003225}
3226
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003227bool PostCreateQueryPool(
3228 VkDevice device,
3229 VkQueryPool* pQueryPool,
3230 VkResult result)
3231{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003232
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003233 if(pQueryPool != nullptr)
3234 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003235 }
3236
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003237 if(result < VK_SUCCESS)
3238 {
3239 std::string reason = "vkCreateQueryPool parameter, VkResult result, is " + EnumeratorString(result);
3240 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003241 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003242 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003243
3244 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003245}
3246
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003247VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateQueryPool(
3248 VkDevice device,
3249 const VkQueryPoolCreateInfo* pCreateInfo,
3250 const VkAllocationCallbacks* pAllocator,
3251 VkQueryPool* pQueryPool)
3252{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003253 PreCreateQueryPool(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003254
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003255 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003256
3257 PostCreateQueryPool(device, pQueryPool, result);
3258
3259 return result;
3260}
3261
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003262bool PostGetQueryPoolResults(
3263 VkDevice device,
3264 VkQueryPool queryPool,
3265 uint32_t firstQuery,
3266 uint32_t queryCount,
3267 size_t dataSize,
3268 void* pData,
3269 VkDeviceSize stride,
3270 VkQueryResultFlags flags,
3271 VkResult result)
3272{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003273
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003274
3275
3276
3277 if(pData != nullptr)
3278 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003279 }
3280
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003281
3282 if(result < VK_SUCCESS)
3283 {
3284 std::string reason = "vkGetQueryPoolResults parameter, VkResult result, is " + EnumeratorString(result);
3285 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003286 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003287 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003288
3289 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003290}
3291
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003292VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetQueryPoolResults(
3293 VkDevice device,
3294 VkQueryPool queryPool,
3295 uint32_t firstQuery,
3296 uint32_t queryCount,
3297 size_t dataSize,
3298 void* pData,
3299 VkDeviceSize stride,
3300 VkQueryResultFlags flags)
3301{
3302 VkResult result = get_dispatch_table(pc_device_table_map, device)->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003303
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003304 PostGetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003305
3306 return result;
3307}
3308
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003309bool PreCreateBuffer(
3310 VkDevice device,
3311 const VkBufferCreateInfo* pCreateInfo)
3312{
3313 if(pCreateInfo != nullptr)
3314 {
3315 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO)
3316 {
3317 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3318 "vkCreateBuffer parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
3319 return false;
3320 }
3321 if(pCreateInfo->sharingMode < VK_SHARING_MODE_BEGIN_RANGE ||
3322 pCreateInfo->sharingMode > VK_SHARING_MODE_END_RANGE)
3323 {
3324 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3325 "vkCreateBuffer parameter, VkSharingMode pCreateInfo->sharingMode, is an unrecognized enumerator");
3326 return false;
3327 }
3328 if(pCreateInfo->pQueueFamilyIndices != nullptr)
3329 {
3330 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003331 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003332
3333 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003334}
3335
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003336bool PostCreateBuffer(
3337 VkDevice device,
3338 VkBuffer* pBuffer,
3339 VkResult result)
3340{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003341
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003342 if(pBuffer != nullptr)
3343 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003344 }
3345
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003346 if(result < VK_SUCCESS)
3347 {
3348 std::string reason = "vkCreateBuffer parameter, VkResult result, is " + EnumeratorString(result);
3349 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003350 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003351 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003352
3353 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003354}
3355
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003356VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateBuffer(
3357 VkDevice device,
3358 const VkBufferCreateInfo* pCreateInfo,
3359 const VkAllocationCallbacks* pAllocator,
3360 VkBuffer* pBuffer)
3361{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003362 PreCreateBuffer(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003363
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003364 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003365
3366 PostCreateBuffer(device, pBuffer, result);
3367
3368 return result;
3369}
3370
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003371bool PreCreateBufferView(
3372 VkDevice device,
3373 const VkBufferViewCreateInfo* pCreateInfo)
3374{
3375 if(pCreateInfo != nullptr)
3376 {
3377 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO)
3378 {
3379 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3380 "vkCreateBufferView parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
3381 return false;
3382 }
3383 if(pCreateInfo->format < VK_FORMAT_BEGIN_RANGE ||
3384 pCreateInfo->format > VK_FORMAT_END_RANGE)
3385 {
3386 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3387 "vkCreateBufferView parameter, VkFormat pCreateInfo->format, is an unrecognized enumerator");
3388 return false;
3389 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003390 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003391
3392 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003393}
3394
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003395bool PostCreateBufferView(
3396 VkDevice device,
3397 VkBufferView* pView,
3398 VkResult result)
3399{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003400
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003401 if(pView != nullptr)
3402 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003403 }
3404
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003405 if(result < VK_SUCCESS)
3406 {
3407 std::string reason = "vkCreateBufferView parameter, VkResult result, is " + EnumeratorString(result);
3408 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003409 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003410 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003411
3412 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003413}
3414
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003415VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateBufferView(
3416 VkDevice device,
3417 const VkBufferViewCreateInfo* pCreateInfo,
3418 const VkAllocationCallbacks* pAllocator,
3419 VkBufferView* pView)
3420{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003421 PreCreateBufferView(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003422
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003423 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003424
3425 PostCreateBufferView(device, pView, result);
3426
3427 return result;
3428}
3429
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003430bool PreCreateImage(
3431 VkDevice device,
3432 const VkImageCreateInfo* pCreateInfo)
3433{
3434 if(pCreateInfo != nullptr)
3435 {
3436 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO)
3437 {
3438 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3439 "vkCreateImage parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
3440 return false;
3441 }
3442 if(pCreateInfo->imageType < VK_IMAGE_TYPE_BEGIN_RANGE ||
3443 pCreateInfo->imageType > VK_IMAGE_TYPE_END_RANGE)
3444 {
3445 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3446 "vkCreateImage parameter, VkImageType pCreateInfo->imageType, is an unrecognized enumerator");
3447 return false;
3448 }
3449 if(pCreateInfo->format < VK_FORMAT_BEGIN_RANGE ||
3450 pCreateInfo->format > VK_FORMAT_END_RANGE)
3451 {
3452 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3453 "vkCreateImage parameter, VkFormat pCreateInfo->format, is an unrecognized enumerator");
3454 return false;
3455 }
3456 if(pCreateInfo->tiling < VK_IMAGE_TILING_BEGIN_RANGE ||
3457 pCreateInfo->tiling > VK_IMAGE_TILING_END_RANGE)
3458 {
3459 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3460 "vkCreateImage parameter, VkImageTiling pCreateInfo->tiling, is an unrecognized enumerator");
3461 return false;
3462 }
3463 if(pCreateInfo->sharingMode < VK_SHARING_MODE_BEGIN_RANGE ||
3464 pCreateInfo->sharingMode > VK_SHARING_MODE_END_RANGE)
3465 {
3466 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3467 "vkCreateImage parameter, VkSharingMode pCreateInfo->sharingMode, is an unrecognized enumerator");
3468 return false;
3469 }
3470 if(pCreateInfo->pQueueFamilyIndices != nullptr)
3471 {
3472 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003473 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003474
3475 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003476}
3477
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003478bool PostCreateImage(
3479 VkDevice device,
3480 VkImage* pImage,
3481 VkResult result)
3482{
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003483
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003484 if(pImage != nullptr)
3485 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003486 }
3487
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003488 if(result < VK_SUCCESS)
3489 {
3490 std::string reason = "vkCreateImage parameter, VkResult result, is " + EnumeratorString(result);
3491 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003492 return false;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003493 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003494
3495 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003496}
3497
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003498VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImage(
3499 VkDevice device,
3500 const VkImageCreateInfo* pCreateInfo,
3501 const VkAllocationCallbacks* pAllocator,
3502 VkImage* pImage)
3503{
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003504 PreCreateImage(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003505
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003506 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003507
3508 PostCreateImage(device, pImage, result);
3509
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003510 return result;
3511}
3512
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003513bool PreGetImageSubresourceLayout(
3514 VkDevice device,
3515 const VkImageSubresource* pSubresource)
3516{
3517 if(pSubresource != nullptr)
3518 {
3519 if ((pSubresource->aspectMask &
3520 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
3521 {
3522 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3523 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
3524 return false;
3525 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003526 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003527
3528 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003529}
3530
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003531bool PostGetImageSubresourceLayout(
3532 VkDevice device,
3533 VkImage image,
3534 VkSubresourceLayout* pLayout)
3535{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003536
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003537
3538 if(pLayout != nullptr)
3539 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003540 }
3541
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003542 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003543}
3544
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003545VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetImageSubresourceLayout(
3546 VkDevice device,
3547 VkImage image,
3548 const VkImageSubresource* pSubresource,
3549 VkSubresourceLayout* pLayout)
3550{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003551 PreGetImageSubresourceLayout(device, pSubresource);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003552
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003553 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003554
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06003555 PostGetImageSubresourceLayout(device, image, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003556}
3557
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003558bool PreCreateImageView(
3559 VkDevice device,
3560 const VkImageViewCreateInfo* pCreateInfo)
3561{
3562 if(pCreateInfo != nullptr)
3563 {
3564 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO)
3565 {
3566 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3567 "vkCreateImageView parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
3568 return false;
3569 }
3570 if(pCreateInfo->viewType < VK_IMAGE_VIEW_TYPE_BEGIN_RANGE ||
3571 pCreateInfo->viewType > VK_IMAGE_VIEW_TYPE_END_RANGE)
3572 {
3573 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3574 "vkCreateImageView parameter, VkImageViewType pCreateInfo->viewType, is an unrecognized enumerator");
3575 return false;
3576 }
3577 if(pCreateInfo->format < VK_FORMAT_BEGIN_RANGE ||
3578 pCreateInfo->format > VK_FORMAT_END_RANGE)
3579 {
3580 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3581 "vkCreateImageView parameter, VkFormat pCreateInfo->format, is an unrecognized enumerator");
3582 return false;
3583 }
3584 if(pCreateInfo->components.r < VK_COMPONENT_SWIZZLE_BEGIN_RANGE ||
3585 pCreateInfo->components.r > VK_COMPONENT_SWIZZLE_END_RANGE)
3586 {
3587 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3588 "vkCreateImageView parameter, VkComponentSwizzle pCreateInfo->components.r, is an unrecognized enumerator");
3589 return false;
3590 }
3591 if(pCreateInfo->components.g < VK_COMPONENT_SWIZZLE_BEGIN_RANGE ||
3592 pCreateInfo->components.g > VK_COMPONENT_SWIZZLE_END_RANGE)
3593 {
3594 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3595 "vkCreateImageView parameter, VkComponentSwizzle pCreateInfo->components.g, is an unrecognized enumerator");
3596 return false;
3597 }
3598 if(pCreateInfo->components.b < VK_COMPONENT_SWIZZLE_BEGIN_RANGE ||
3599 pCreateInfo->components.b > VK_COMPONENT_SWIZZLE_END_RANGE)
3600 {
3601 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3602 "vkCreateImageView parameter, VkComponentSwizzle pCreateInfo->components.b, is an unrecognized enumerator");
3603 return false;
3604 }
3605 if(pCreateInfo->components.a < VK_COMPONENT_SWIZZLE_BEGIN_RANGE ||
3606 pCreateInfo->components.a > VK_COMPONENT_SWIZZLE_END_RANGE)
3607 {
3608 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3609 "vkCreateImageView parameter, VkComponentSwizzle pCreateInfo->components.a, is an unrecognized enumerator");
3610 return false;
3611 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003612 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003613
3614 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003615}
3616
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003617bool PostCreateImageView(
3618 VkDevice device,
3619 VkImageView* pView,
3620 VkResult result)
3621{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003622
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003623 if(pView != nullptr)
3624 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003625 }
3626
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003627 if(result < VK_SUCCESS)
3628 {
3629 std::string reason = "vkCreateImageView parameter, VkResult result, is " + EnumeratorString(result);
3630 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003631 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003632 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003633
3634 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003635}
3636
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003637VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImageView(
3638 VkDevice device,
3639 const VkImageViewCreateInfo* pCreateInfo,
3640 const VkAllocationCallbacks* pAllocator,
3641 VkImageView* pView)
3642{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003643 PreCreateImageView(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003644
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003645 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003646
3647 PostCreateImageView(device, pView, result);
3648
3649 return result;
3650}
3651
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003652bool PreCreateShaderModule(
3653 VkDevice device,
3654 const VkShaderModuleCreateInfo* pCreateInfo)
3655{
3656 if(pCreateInfo) {
3657 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO) {
3658 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3659 "vkCreateShaderModule parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
Michael Lentine03d8e572015-09-15 14:59:14 -05003660 return false;
3661 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003662 if(!pCreateInfo->pCode) {
3663 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3664 "vkCreateShaderModule paramter, void* pCreateInfo->pCode, is null");
Michael Lentine03d8e572015-09-15 14:59:14 -05003665 return false;
3666 }
3667 } else {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003668 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3669 "vkCreateShaderModule parameter, VkShaderModuleCreateInfo pCreateInfo, is null");
Michael Lentine03d8e572015-09-15 14:59:14 -05003670 return false;
3671 }
3672
3673 return true;
3674}
3675
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003676bool PostCreateShaderModule(
3677 VkDevice device,
3678 VkShaderModule* pShaderModule,
3679 VkResult result)
3680{
3681 if(result < VK_SUCCESS) {
3682 std::string reason = "vkCreateShaderModule parameter, VkResult result, is " + EnumeratorString(result);
3683 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Michael Lentine03d8e572015-09-15 14:59:14 -05003684 return false;
3685 }
3686
3687 return true;
3688}
3689
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003690VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateShaderModule(
3691 VkDevice device,
3692 const VkShaderModuleCreateInfo* pCreateInfo,
3693 const VkAllocationCallbacks* pAllocator,
3694 VkShaderModule* pShaderModule)
3695{
Michael Lentine03d8e572015-09-15 14:59:14 -05003696 PreCreateShaderModule(device, pCreateInfo);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003697 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Michael Lentine03d8e572015-09-15 14:59:14 -05003698 PostCreateShaderModule(device, pShaderModule, result);
3699 return result;
3700}
3701
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003702bool PreCreatePipelineCache(
3703 VkDevice device,
3704 const VkPipelineCacheCreateInfo* pCreateInfo)
3705{
3706 if(pCreateInfo != nullptr)
3707 {
3708 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO)
3709 {
3710 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3711 "vkCreatePipelineCache parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
3712 return false;
3713 }
3714 if(pCreateInfo->pInitialData != nullptr)
3715 {
3716 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003717 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003718
3719 return true;
3720}
3721
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003722bool PostCreatePipelineCache(
3723 VkDevice device,
3724 VkPipelineCache* pPipelineCache,
3725 VkResult result)
3726{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003727
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003728 if(pPipelineCache != nullptr)
3729 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003730 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003731
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003732 if(result < VK_SUCCESS)
3733 {
3734 std::string reason = "vkCreatePipelineCache parameter, VkResult result, is " + EnumeratorString(result);
3735 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Tony Barbourdd6e32e2015-07-10 15:29:03 -06003736 return false;
3737 }
3738
3739 return true;
3740}
3741
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003742VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineCache(
3743 VkDevice device,
3744 const VkPipelineCacheCreateInfo* pCreateInfo,
3745 const VkAllocationCallbacks* pAllocator,
3746 VkPipelineCache* pPipelineCache)
3747{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003748 PreCreatePipelineCache(device, pCreateInfo);
3749
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003750 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003751
3752 PostCreatePipelineCache(device, pPipelineCache, result);
3753
3754 return result;
3755}
3756
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003757bool PostGetPipelineCacheData(
3758 VkDevice device,
3759 VkPipelineCache pipelineCache,
3760 size_t* pDataSize,
3761 void* pData,
3762 VkResult result)
3763{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003764
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003765
3766 if(pDataSize != nullptr)
3767 {
Chia-I Wub16facd2015-10-26 19:17:06 +08003768 }
3769
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003770 if(pData != nullptr)
3771 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003772 }
3773
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003774 if(result < VK_SUCCESS)
3775 {
3776 std::string reason = "vkGetPipelineCacheData parameter, VkResult result, is " + EnumeratorString(result);
3777 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003778 return false;
3779 }
3780
3781 return true;
3782}
3783
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003784VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPipelineCacheData(
3785 VkDevice device,
3786 VkPipelineCache pipelineCache,
3787 size_t* pDataSize,
3788 void* pData)
3789{
3790 VkResult result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003791
Chia-I Wub16facd2015-10-26 19:17:06 +08003792 PostGetPipelineCacheData(device, pipelineCache, pDataSize, pData, result);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003793
3794 return result;
3795}
3796
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003797bool PreMergePipelineCaches(
3798 VkDevice device,
3799 const VkPipelineCache* pSrcCaches)
3800{
3801 if(pSrcCaches != nullptr)
3802 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003803 }
3804
3805 return true;
3806}
3807
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003808bool PostMergePipelineCaches(
3809 VkDevice device,
3810 VkPipelineCache dstCache,
3811 uint32_t srcCacheCount,
3812 VkResult result)
3813{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003814
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003815
3816
3817 if(result < VK_SUCCESS)
3818 {
3819 std::string reason = "vkMergePipelineCaches parameter, VkResult result, is " + EnumeratorString(result);
3820 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003821 return false;
3822 }
3823
3824 return true;
3825}
3826
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003827VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkMergePipelineCaches(
3828 VkDevice device,
3829 VkPipelineCache dstCache,
3830 uint32_t srcCacheCount,
3831 const VkPipelineCache* pSrcCaches)
3832{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003833 PreMergePipelineCaches(device, pSrcCaches);
3834
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003835 VkResult result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003836
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003837 PostMergePipelineCaches(device, dstCache, srcCacheCount, result);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003838
3839 return result;
3840}
3841
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003842bool PreCreateGraphicsPipelines(
3843 VkDevice device,
3844 const VkGraphicsPipelineCreateInfo* pCreateInfos)
3845{
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003846 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3847
3848 // TODO: Handle count
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003849 if(pCreateInfos != nullptr)
3850 {
3851 if(pCreateInfos->sType != VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO)
3852 {
3853 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3854 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->sType, is an invalid enumerator");
3855 return false;
3856 }
3857 if(pCreateInfos->pStages != nullptr)
3858 {
3859 if(pCreateInfos->pStages->sType != VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO)
3860 {
3861 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3862 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pStages->sType, is an invalid enumerator");
3863 return false;
3864 }
3865 if(pCreateInfos->pStages->pSpecializationInfo != nullptr)
3866 {
3867 if(pCreateInfos->pStages->pSpecializationInfo->pMapEntries != nullptr)
3868 {
3869 }
3870 if(pCreateInfos->pStages->pSpecializationInfo->pData != nullptr)
3871 {
3872 }
3873 }
3874 }
3875 if(pCreateInfos->pVertexInputState != nullptr)
3876 {
3877 if(pCreateInfos->pVertexInputState->sType != VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO)
3878 {
3879 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3880 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pVertexInputState->sType, is an invalid enumerator");
3881 return false;
3882 }
3883 if(pCreateInfos->pVertexInputState->pVertexBindingDescriptions != nullptr)
3884 {
3885 if(pCreateInfos->pVertexInputState->pVertexBindingDescriptions->inputRate < VK_VERTEX_INPUT_RATE_BEGIN_RANGE ||
3886 pCreateInfos->pVertexInputState->pVertexBindingDescriptions->inputRate > VK_VERTEX_INPUT_RATE_END_RANGE)
3887 {
3888 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3889 "vkCreateGraphicsPipelines parameter, VkVertexInputRate pCreateInfos->pVertexInputState->pVertexBindingDescriptions->inputRate, is an unrecognized enumerator");
3890 return false;
3891 }
3892 }
3893 if(pCreateInfos->pVertexInputState->pVertexAttributeDescriptions != nullptr)
3894 {
3895 if(pCreateInfos->pVertexInputState->pVertexAttributeDescriptions->format < VK_FORMAT_BEGIN_RANGE ||
3896 pCreateInfos->pVertexInputState->pVertexAttributeDescriptions->format > VK_FORMAT_END_RANGE)
3897 {
3898 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3899 "vkCreateGraphicsPipelines parameter, VkFormat pCreateInfos->pVertexInputState->pVertexAttributeDescriptions->format, is an unrecognized enumerator");
3900 return false;
3901 }
3902 }
3903 }
3904 if(pCreateInfos->pInputAssemblyState != nullptr)
3905 {
3906 if(pCreateInfos->pInputAssemblyState->sType != VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO)
3907 {
3908 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3909 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pInputAssemblyState->sType, is an invalid enumerator");
3910 return false;
3911 }
3912 if(pCreateInfos->pInputAssemblyState->topology < VK_PRIMITIVE_TOPOLOGY_BEGIN_RANGE ||
3913 pCreateInfos->pInputAssemblyState->topology > VK_PRIMITIVE_TOPOLOGY_END_RANGE)
3914 {
3915 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3916 "vkCreateGraphicsPipelines parameter, VkPrimitiveTopology pCreateInfos->pInputAssemblyState->topology, is an unrecognized enumerator");
3917 return false;
3918 }
3919 }
3920 if(pCreateInfos->pTessellationState != nullptr)
3921 {
3922 if(pCreateInfos->pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO)
3923 {
3924 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3925 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pTessellationState->sType, is an invalid enumerator");
3926 return false;
3927 }
3928 }
3929 if(pCreateInfos->pViewportState != nullptr)
3930 {
3931 if(pCreateInfos->pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO)
3932 {
3933 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3934 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pViewportState->sType, is an invalid enumerator");
3935 return false;
3936 }
3937 }
3938 if(pCreateInfos->pRasterizationState != nullptr)
3939 {
3940 if(pCreateInfos->pRasterizationState->sType != VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO)
3941 {
3942 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3943 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pRasterizationState->sType, is an invalid enumerator");
3944 return false;
3945 }
3946 if(pCreateInfos->pRasterizationState->polygonMode < VK_POLYGON_MODE_BEGIN_RANGE ||
3947 pCreateInfos->pRasterizationState->polygonMode > VK_POLYGON_MODE_END_RANGE)
3948 {
3949 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3950 "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode, is an unrecognized enumerator");
3951 return false;
3952 }
3953 if(pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK)
3954 {
3955 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3956 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an unrecognized enumerator");
3957 return false;
3958 }
3959 if(pCreateInfos->pRasterizationState->frontFace < VK_FRONT_FACE_BEGIN_RANGE ||
3960 pCreateInfos->pRasterizationState->frontFace > VK_FRONT_FACE_END_RANGE)
3961 {
3962 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3963 "vkCreateGraphicsPipelines parameter, VkFrontFace pCreateInfos->pRasterizationState->frontFace, is an unrecognized enumerator");
3964 return false;
3965 }
3966 }
3967 if(pCreateInfos->pMultisampleState != nullptr)
3968 {
3969 if(pCreateInfos->pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO)
3970 {
3971 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3972 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pMultisampleState->sType, is an invalid enumerator");
3973 return false;
3974 }
3975 }
3976 if(pCreateInfos->pDepthStencilState != nullptr)
3977 {
3978 if(pCreateInfos->pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO)
3979 {
3980 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3981 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pDepthStencilState->sType, is an invalid enumerator");
3982 return false;
3983 }
3984 if(pCreateInfos->pDepthStencilState->depthCompareOp < VK_COMPARE_OP_BEGIN_RANGE ||
3985 pCreateInfos->pDepthStencilState->depthCompareOp > VK_COMPARE_OP_END_RANGE)
3986 {
3987 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3988 "vkCreateGraphicsPipelines parameter, VkCompareOp pCreateInfos->pDepthStencilState->depthCompareOp, is an unrecognized enumerator");
3989 return false;
3990 }
3991 if(pCreateInfos->pDepthStencilState->front.failOp < VK_STENCIL_OP_BEGIN_RANGE ||
3992 pCreateInfos->pDepthStencilState->front.failOp > VK_STENCIL_OP_END_RANGE)
3993 {
3994 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3995 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->front.failOp, is an unrecognized enumerator");
3996 return false;
3997 }
3998 if(pCreateInfos->pDepthStencilState->front.passOp < VK_STENCIL_OP_BEGIN_RANGE ||
3999 pCreateInfos->pDepthStencilState->front.passOp > VK_STENCIL_OP_END_RANGE)
4000 {
4001 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4002 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->front.passOp, is an unrecognized enumerator");
4003 return false;
4004 }
4005 if(pCreateInfos->pDepthStencilState->front.depthFailOp < VK_STENCIL_OP_BEGIN_RANGE ||
4006 pCreateInfos->pDepthStencilState->front.depthFailOp > VK_STENCIL_OP_END_RANGE)
4007 {
4008 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4009 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->front.depthFailOp, is an unrecognized enumerator");
4010 return false;
4011 }
4012 if(pCreateInfos->pDepthStencilState->front.compareOp < VK_COMPARE_OP_BEGIN_RANGE ||
4013 pCreateInfos->pDepthStencilState->front.compareOp > VK_COMPARE_OP_END_RANGE)
4014 {
4015 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4016 "vkCreateGraphicsPipelines parameter, VkCompareOp pCreateInfos->pDepthStencilState->front.compareOp, is an unrecognized enumerator");
4017 return false;
4018 }
4019 if(pCreateInfos->pDepthStencilState->back.failOp < VK_STENCIL_OP_BEGIN_RANGE ||
4020 pCreateInfos->pDepthStencilState->back.failOp > VK_STENCIL_OP_END_RANGE)
4021 {
4022 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4023 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->back.failOp, is an unrecognized enumerator");
4024 return false;
4025 }
4026 if(pCreateInfos->pDepthStencilState->back.passOp < VK_STENCIL_OP_BEGIN_RANGE ||
4027 pCreateInfos->pDepthStencilState->back.passOp > VK_STENCIL_OP_END_RANGE)
4028 {
4029 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4030 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->back.passOp, is an unrecognized enumerator");
4031 return false;
4032 }
4033 if(pCreateInfos->pDepthStencilState->back.depthFailOp < VK_STENCIL_OP_BEGIN_RANGE ||
4034 pCreateInfos->pDepthStencilState->back.depthFailOp > VK_STENCIL_OP_END_RANGE)
4035 {
4036 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4037 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->back.depthFailOp, is an unrecognized enumerator");
4038 return false;
4039 }
4040 if(pCreateInfos->pDepthStencilState->back.compareOp < VK_COMPARE_OP_BEGIN_RANGE ||
4041 pCreateInfos->pDepthStencilState->back.compareOp > VK_COMPARE_OP_END_RANGE)
4042 {
4043 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4044 "vkCreateGraphicsPipelines parameter, VkCompareOp pCreateInfos->pDepthStencilState->back.compareOp, is an unrecognized enumerator");
4045 return false;
4046 }
4047 }
4048 if(pCreateInfos->pColorBlendState != nullptr)
4049 {
4050 if(pCreateInfos->pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO)
4051 {
4052 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4053 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pColorBlendState->sType, is an invalid enumerator");
4054 return false;
4055 }
Michael Lentine0a369f62016-02-03 16:51:46 -06004056 if (pCreateInfos->pColorBlendState->logicOpEnable == VK_TRUE &&
4057 (pCreateInfos->pColorBlendState->logicOp < VK_LOGIC_OP_BEGIN_RANGE ||
4058 pCreateInfos->pColorBlendState->logicOp > VK_LOGIC_OP_END_RANGE)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004059 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4060 "vkCreateGraphicsPipelines parameter, VkLogicOp pCreateInfos->pColorBlendState->logicOp, is an unrecognized enumerator");
4061 return false;
4062 }
4063 if(pCreateInfos->pColorBlendState->pAttachments != nullptr && pCreateInfos->pColorBlendState->pAttachments->blendEnable == VK_TRUE)
4064 {
4065 if(pCreateInfos->pColorBlendState->pAttachments->srcColorBlendFactor < VK_BLEND_FACTOR_BEGIN_RANGE ||
4066 pCreateInfos->pColorBlendState->pAttachments->srcColorBlendFactor > VK_BLEND_FACTOR_END_RANGE)
4067 {
4068 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4069 "vkCreateGraphicsPipelines parameter, VkBlendFactor pCreateInfos->pColorBlendState->pAttachments->srcColorBlendFactor, is an unrecognized enumerator");
4070 return false;
4071 }
4072 if(pCreateInfos->pColorBlendState->pAttachments->dstColorBlendFactor < VK_BLEND_FACTOR_BEGIN_RANGE ||
4073 pCreateInfos->pColorBlendState->pAttachments->dstColorBlendFactor > VK_BLEND_FACTOR_END_RANGE)
4074 {
4075 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4076 "vkCreateGraphicsPipelines parameter, VkBlendFactor pCreateInfos->pColorBlendState->pAttachments->dstColorBlendFactor, is an unrecognized enumerator");
4077 return false;
4078 }
4079 if(pCreateInfos->pColorBlendState->pAttachments->colorBlendOp < VK_BLEND_OP_BEGIN_RANGE ||
4080 pCreateInfos->pColorBlendState->pAttachments->colorBlendOp > VK_BLEND_OP_END_RANGE)
4081 {
4082 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4083 "vkCreateGraphicsPipelines parameter, VkBlendOp pCreateInfos->pColorBlendState->pAttachments->colorBlendOp, is an unrecognized enumerator");
4084 return false;
4085 }
4086 if(pCreateInfos->pColorBlendState->pAttachments->srcAlphaBlendFactor < VK_BLEND_FACTOR_BEGIN_RANGE ||
4087 pCreateInfos->pColorBlendState->pAttachments->srcAlphaBlendFactor > VK_BLEND_FACTOR_END_RANGE)
4088 {
4089 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4090 "vkCreateGraphicsPipelines parameter, VkBlendFactor pCreateInfos->pColorBlendState->pAttachments->srcAlphaBlendFactor, is an unrecognized enumerator");
4091 return false;
4092 }
4093 if(pCreateInfos->pColorBlendState->pAttachments->dstAlphaBlendFactor < VK_BLEND_FACTOR_BEGIN_RANGE ||
4094 pCreateInfos->pColorBlendState->pAttachments->dstAlphaBlendFactor > VK_BLEND_FACTOR_END_RANGE)
4095 {
4096 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4097 "vkCreateGraphicsPipelines parameter, VkBlendFactor pCreateInfos->pColorBlendState->pAttachments->dstAlphaBlendFactor, is an unrecognized enumerator");
4098 return false;
4099 }
4100 if(pCreateInfos->pColorBlendState->pAttachments->alphaBlendOp < VK_BLEND_OP_BEGIN_RANGE ||
4101 pCreateInfos->pColorBlendState->pAttachments->alphaBlendOp > VK_BLEND_OP_END_RANGE)
4102 {
4103 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4104 "vkCreateGraphicsPipelines parameter, VkBlendOp pCreateInfos->pColorBlendState->pAttachments->alphaBlendOp, is an unrecognized enumerator");
4105 return false;
4106 }
4107 }
4108 }
4109 if(pCreateInfos->renderPass == VK_NULL_HANDLE)
4110 {
4111 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4112 "vkCreateGraphicsPipelines parameter, VkRenderPass pCreateInfos->renderPass, is null pointer");
4113 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004114
4115 int i = 0;
4116 for (auto j = 0; j < pCreateInfos[i].stageCount; j++) {
4117 validate_string(data, "vkCreateGraphicsPipelines()", "pCreateInfos[i].pStages[j].pName", pCreateInfos[i].pStages[j].pName);
4118 }
4119
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004120 }
4121
4122 return true;
4123}
4124
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004125bool PostCreateGraphicsPipelines(
4126 VkDevice device,
4127 VkPipelineCache pipelineCache,
4128 uint32_t count,
4129 VkPipeline* pPipelines,
4130 VkResult result)
4131{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004132
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004133
4134
4135 if(pPipelines != nullptr)
4136 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004137 }
4138
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004139 if(result < VK_SUCCESS)
4140 {
4141 std::string reason = "vkCreateGraphicsPipelines parameter, VkResult result, is " + EnumeratorString(result);
4142 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004143 return false;
4144 }
4145
4146 return true;
4147}
4148
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004149VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateGraphicsPipelines(
4150 VkDevice device,
4151 VkPipelineCache pipelineCache,
4152 uint32_t count,
4153 const VkGraphicsPipelineCreateInfo* pCreateInfos,
4154 const VkAllocationCallbacks* pAllocator,
4155 VkPipeline* pPipelines)
4156{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004157 PreCreateGraphicsPipelines(device, pCreateInfos);
4158
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004159 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateGraphicsPipelines(device, pipelineCache, count, pCreateInfos, pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004160
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004161 PostCreateGraphicsPipelines(device, pipelineCache, count, pPipelines, result);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004162
4163 return result;
4164}
4165
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004166bool PreCreateComputePipelines(
4167 VkDevice device,
4168 const VkComputePipelineCreateInfo* pCreateInfos)
4169{
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004170 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4171
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004172 if(pCreateInfos != nullptr)
4173 {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004174 // TODO: Handle count!
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004175 if(pCreateInfos->sType != VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO)
4176 {
4177 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4178 "vkCreateComputePipelines parameter, VkStructureType pCreateInfos->sType, is an invalid enumerator");
4179 return false;
4180 }
4181 if(pCreateInfos->stage.sType != VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO)
4182 {
4183 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4184 "vkCreateComputePipelines parameter, VkStructureType pCreateInfos->cs.sType, is an invalid enumerator");
4185 return false;
4186 }
4187 if(pCreateInfos->stage.pSpecializationInfo != nullptr)
4188 {
4189 if(pCreateInfos->stage.pSpecializationInfo->pMapEntries != nullptr)
4190 {
4191 }
4192 if(pCreateInfos->stage.pSpecializationInfo->pData != nullptr)
4193 {
4194 }
4195 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004196
4197 int i = 0;
4198 validate_string(data, "vkCreateComputePipelines()", "pCreateInfos[i].stage.pName", pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004199 }
4200
4201 return true;
4202}
4203
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004204bool PostCreateComputePipelines(
4205 VkDevice device,
4206 VkPipelineCache pipelineCache,
4207 uint32_t count,
4208 VkPipeline* pPipelines,
4209 VkResult result)
4210{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004211
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004212
4213
4214 if(pPipelines != nullptr)
4215 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004216 }
4217
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004218 if(result < VK_SUCCESS)
4219 {
4220 std::string reason = "vkCreateComputePipelines parameter, VkResult result, is " + EnumeratorString(result);
4221 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004222 return false;
4223 }
4224
4225 return true;
4226}
4227
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004228VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateComputePipelines(
4229 VkDevice device,
4230 VkPipelineCache pipelineCache,
4231 uint32_t count,
4232 const VkComputePipelineCreateInfo* pCreateInfos,
4233 const VkAllocationCallbacks* pAllocator,
4234 VkPipeline* pPipelines)
4235{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004236 PreCreateComputePipelines(device, pCreateInfos);
4237
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004238 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateComputePipelines(device, pipelineCache, count, pCreateInfos, pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004239
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004240 PostCreateComputePipelines(device, pipelineCache, count, pPipelines, result);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004241
4242 return result;
4243}
4244
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004245bool PreCreatePipelineLayout(
4246 VkDevice device,
4247 const VkPipelineLayoutCreateInfo* pCreateInfo)
4248{
4249 if(pCreateInfo != nullptr)
4250 {
4251 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO)
4252 {
4253 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4254 "vkCreatePipelineLayout parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
4255 return false;
4256 }
4257 if(pCreateInfo->pSetLayouts != nullptr)
4258 {
4259 }
4260 if(pCreateInfo->pPushConstantRanges != nullptr)
4261 {
4262 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004263 }
4264
4265 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004266}
4267
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004268bool PostCreatePipelineLayout(
4269 VkDevice device,
4270 VkPipelineLayout* pPipelineLayout,
4271 VkResult result)
4272{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004273
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004274 if(pPipelineLayout != nullptr)
4275 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004276 }
4277
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004278 if(result < VK_SUCCESS)
4279 {
4280 std::string reason = "vkCreatePipelineLayout parameter, VkResult result, is " + EnumeratorString(result);
4281 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004282 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004283 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004284
4285 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004286}
4287
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004288VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineLayout(
4289 VkDevice device,
4290 const VkPipelineLayoutCreateInfo* pCreateInfo,
4291 const VkAllocationCallbacks* pAllocator,
4292 VkPipelineLayout* pPipelineLayout)
4293{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004294 PreCreatePipelineLayout(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004295
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004296 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004297
4298 PostCreatePipelineLayout(device, pPipelineLayout, result);
4299
4300 return result;
4301}
4302
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004303bool PreCreateSampler(
4304 VkDevice device,
4305 const VkSamplerCreateInfo* pCreateInfo)
4306{
4307 if(pCreateInfo != nullptr)
4308 {
4309 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO)
4310 {
4311 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4312 "vkCreateSampler parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
4313 return false;
4314 }
4315 if(pCreateInfo->magFilter < VK_FILTER_BEGIN_RANGE ||
4316 pCreateInfo->magFilter > VK_FILTER_END_RANGE)
4317 {
4318 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4319 "vkCreateSampler parameter, VkFilter pCreateInfo->magFilter, is an unrecognized enumerator");
4320 return false;
4321 }
4322 if(pCreateInfo->minFilter < VK_FILTER_BEGIN_RANGE ||
4323 pCreateInfo->minFilter > VK_FILTER_END_RANGE)
4324 {
4325 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4326 "vkCreateSampler parameter, VkFilter pCreateInfo->minFilter, is an unrecognized enumerator");
4327 return false;
4328 }
4329 if(pCreateInfo->mipmapMode < VK_SAMPLER_MIPMAP_MODE_BEGIN_RANGE ||
4330 pCreateInfo->mipmapMode > VK_SAMPLER_MIPMAP_MODE_END_RANGE)
4331 {
4332 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4333 "vkCreateSampler parameter, VkSamplerMipmapMode pCreateInfo->mipmapMode, is an unrecognized enumerator");
4334 return false;
4335 }
4336 if(pCreateInfo->addressModeU < VK_SAMPLER_ADDRESS_MODE_BEGIN_RANGE ||
4337 pCreateInfo->addressModeU > VK_SAMPLER_ADDRESS_MODE_END_RANGE)
4338 {
4339 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4340 "vkCreateSampler parameter, VkTexAddress pCreateInfo->addressModeU, is an unrecognized enumerator");
4341 return false;
4342 }
4343 if(pCreateInfo->addressModeV < VK_SAMPLER_ADDRESS_MODE_BEGIN_RANGE ||
4344 pCreateInfo->addressModeV > VK_SAMPLER_ADDRESS_MODE_END_RANGE)
4345 {
4346 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4347 "vkCreateSampler parameter, VkTexAddress pCreateInfo->addressModeV, is an unrecognized enumerator");
4348 return false;
4349 }
4350 if(pCreateInfo->addressModeW < VK_SAMPLER_ADDRESS_MODE_BEGIN_RANGE ||
4351 pCreateInfo->addressModeW > VK_SAMPLER_ADDRESS_MODE_END_RANGE)
4352 {
4353 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4354 "vkCreateSampler parameter, VkTexAddress pCreateInfo->addressModeW, is an unrecognized enumerator");
4355 return false;
4356 }
4357 if(pCreateInfo->compareEnable)
4358 {
4359 if(pCreateInfo->compareOp < VK_COMPARE_OP_BEGIN_RANGE ||
4360 pCreateInfo->compareOp > VK_COMPARE_OP_END_RANGE)
4361 {
4362 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4363 "vkCreateSampler parameter, VkCompareOp pCreateInfo->compareOp, is an unrecognized enumerator");
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004364 return false;
4365 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004366 }
4367 if(pCreateInfo->borderColor < VK_BORDER_COLOR_BEGIN_RANGE ||
4368 pCreateInfo->borderColor > VK_BORDER_COLOR_END_RANGE)
4369 {
4370 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4371 "vkCreateSampler parameter, VkBorderColor pCreateInfo->borderColor, is an unrecognized enumerator");
4372 return false;
4373 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004374 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004375
4376 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004377}
4378
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004379bool PostCreateSampler(
4380 VkDevice device,
4381 VkSampler* pSampler,
4382 VkResult result)
4383{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004384
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004385 if(pSampler != nullptr)
4386 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004387 }
4388
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004389 if(result < VK_SUCCESS)
4390 {
4391 std::string reason = "vkCreateSampler parameter, VkResult result, is " + EnumeratorString(result);
4392 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004393 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004394 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004395
4396 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004397}
4398
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004399VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSampler(
4400 VkDevice device,
4401 const VkSamplerCreateInfo* pCreateInfo,
4402 const VkAllocationCallbacks* pAllocator,
4403 VkSampler* pSampler)
4404{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004405 PreCreateSampler(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004406
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004407 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004408
4409 PostCreateSampler(device, pSampler, result);
4410
4411 return result;
4412}
4413
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004414bool PreCreateDescriptorSetLayout(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004415 VkDevice device,
4416 const VkDescriptorSetLayoutCreateInfo* pCreateInfo)
4417{
4418 if(pCreateInfo != nullptr)
4419 {
4420 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO)
4421 {
4422 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4423 "vkCreateDescriptorSetLayout parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
4424 return false;
4425 }
4426 if(pCreateInfo->pBindings != nullptr)
4427 {
4428 if(pCreateInfo->pBindings->descriptorType < VK_DESCRIPTOR_TYPE_BEGIN_RANGE ||
4429 pCreateInfo->pBindings->descriptorType > VK_DESCRIPTOR_TYPE_END_RANGE)
4430 {
4431 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4432 "vkCreateDescriptorSetLayout parameter, VkDescriptorType pCreateInfo->pBindings->descriptorType, is an unrecognized enumerator");
4433 return false;
4434 }
4435 if(pCreateInfo->pBindings->pImmutableSamplers != nullptr)
4436 {
4437 }
4438 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004439 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004440
4441 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004442}
4443
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004444bool PostCreateDescriptorSetLayout(
4445 VkDevice device,
4446 VkDescriptorSetLayout* pSetLayout,
4447 VkResult result)
4448{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004449
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004450 if(pSetLayout != nullptr)
4451 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004452 }
4453
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004454 if(result < VK_SUCCESS)
4455 {
4456 std::string reason = "vkCreateDescriptorSetLayout parameter, VkResult result, is " + EnumeratorString(result);
4457 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004458 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004459 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004460
4461 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004462}
4463
Chia-I Wu9ab61502015-11-06 06:42:02 +08004464VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorSetLayout(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004465 VkDevice device,
4466 const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
4467 const VkAllocationCallbacks* pAllocator,
4468 VkDescriptorSetLayout* pSetLayout)
4469{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004470 PreCreateDescriptorSetLayout(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004471
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004472 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004473
4474 PostCreateDescriptorSetLayout(device, pSetLayout, result);
4475
4476 return result;
4477}
4478
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004479bool PreCreateDescriptorPool(
4480 VkDevice device,
4481 const VkDescriptorPoolCreateInfo* pCreateInfo)
4482{
4483 if(pCreateInfo != nullptr)
4484 {
4485 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO)
4486 {
4487 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4488 "vkCreateDescriptorPool parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
4489 return false;
4490 }
4491 if(pCreateInfo->pPoolSizes != nullptr)
4492 {
4493 if(pCreateInfo->pPoolSizes->type < VK_DESCRIPTOR_TYPE_BEGIN_RANGE ||
4494 pCreateInfo->pPoolSizes->type > VK_DESCRIPTOR_TYPE_END_RANGE)
4495 {
4496 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4497 "vkCreateDescriptorPool parameter, VkDescriptorType pCreateInfo->pTypeCount->type, is an unrecognized enumerator");
4498 return false;
4499 }
4500 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004501 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004502
4503 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004504}
4505
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004506bool PostCreateDescriptorPool(
4507 VkDevice device,
4508 uint32_t maxSets,
4509 VkDescriptorPool* pDescriptorPool,
4510 VkResult result)
4511{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004512
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004513 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
Jeremy Hayes99a96322015-06-26 12:48:09 -06004514
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004515 if(pDescriptorPool != nullptr)
4516 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004517 }
4518
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004519 if(result < VK_SUCCESS)
4520 {
4521 std::string reason = "vkCreateDescriptorPool parameter, VkResult result, is " + EnumeratorString(result);
4522 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004523 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004524 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004525
4526 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004527}
4528
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004529VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorPool(
4530 VkDevice device,
4531 const VkDescriptorPoolCreateInfo* pCreateInfo,
4532 const VkAllocationCallbacks* pAllocator,
4533 VkDescriptorPool* pDescriptorPool)
4534{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004535 PreCreateDescriptorPool(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004536
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004537 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004538
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004539 PostCreateDescriptorPool(device, pCreateInfo->maxSets, pDescriptorPool, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004540
4541 return result;
4542}
4543
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004544bool PostResetDescriptorPool(
4545 VkDevice device,
4546 VkDescriptorPool descriptorPool,
4547 VkResult result)
4548{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004549
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004550
4551 if(result < VK_SUCCESS)
4552 {
4553 std::string reason = "vkResetDescriptorPool parameter, VkResult result, is " + EnumeratorString(result);
4554 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004555 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004556 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004557
4558 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004559}
4560
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004561VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetDescriptorPool(
4562 VkDevice device,
4563 VkDescriptorPool descriptorPool,
4564 VkDescriptorPoolResetFlags flags)
4565{
4566 VkResult result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004567
4568 PostResetDescriptorPool(device, descriptorPool, result);
4569
4570 return result;
4571}
4572
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004573bool PreAllocateDescriptorSets(
4574 VkDevice device,
4575 const VkDescriptorSetLayout* pSetLayouts)
4576{
4577 if(pSetLayouts != nullptr)
4578 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004579 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004580
4581 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004582}
4583
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004584bool PostAllocateDescriptorSets(
4585 VkDevice device,
4586 VkDescriptorPool descriptorPool,
4587 uint32_t count,
4588 VkDescriptorSet* pDescriptorSets,
4589 VkResult result)
4590{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004591
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004592
4593 if(pDescriptorSets != nullptr)
4594 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004595 }
4596
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004597 if(result < VK_SUCCESS)
4598 {
4599 std::string reason = "vkAllocateDescriptorSets parameter, VkResult result, is " + EnumeratorString(result);
4600 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004601 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004602 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004603
4604 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004605}
4606
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004607VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateDescriptorSets(
4608 VkDevice device,
4609 const VkDescriptorSetAllocateInfo* pAllocateInfo,
4610 VkDescriptorSet* pDescriptorSets)
4611{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004612 PreAllocateDescriptorSets(device, pAllocateInfo->pSetLayouts);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004613
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004614 VkResult result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004615
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004616 PostAllocateDescriptorSets(device, pAllocateInfo->descriptorPool, pAllocateInfo->descriptorSetCount, pDescriptorSets, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004617
4618 return result;
4619}
4620
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004621bool PreFreeDescriptorSets(
4622 VkDevice device,
4623 const VkDescriptorSet* pDescriptorSets)
4624{
4625 if(pDescriptorSets != nullptr)
4626 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004627 }
4628
4629 return true;
4630}
4631
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004632bool PostFreeDescriptorSets(
4633 VkDevice device,
4634 VkDescriptorPool descriptorPool,
4635 uint32_t count,
4636 VkResult result)
4637{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004638
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004639
4640
4641 if(result < VK_SUCCESS)
4642 {
4643 std::string reason = "vkFreeDescriptorSets parameter, VkResult result, is " + EnumeratorString(result);
4644 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004645 return false;
4646 }
4647
4648 return true;
4649}
4650
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004651VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFreeDescriptorSets(
4652 VkDevice device,
4653 VkDescriptorPool descriptorPool,
4654 uint32_t count,
4655 const VkDescriptorSet* pDescriptorSets)
4656{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004657 PreFreeDescriptorSets(device, pDescriptorSets);
4658
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004659 VkResult result = get_dispatch_table(pc_device_table_map, device)->FreeDescriptorSets(device, descriptorPool, count, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004660
4661 PostFreeDescriptorSets(device, descriptorPool, count, result);
4662
4663 return result;
4664}
4665
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004666bool PreUpdateDescriptorSets(
4667 VkDevice device,
4668 const VkWriteDescriptorSet* pDescriptorWrites,
4669 const VkCopyDescriptorSet* pDescriptorCopies)
4670{
4671 if(pDescriptorWrites != nullptr)
4672 {
4673 if(pDescriptorWrites->sType != VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET)
4674 {
4675 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4676 "vkUpdateDescriptorSets parameter, VkStructureType pDescriptorWrites->sType, is an invalid enumerator");
4677 return false;
4678 }
4679 if(pDescriptorWrites->descriptorType < VK_DESCRIPTOR_TYPE_BEGIN_RANGE ||
4680 pDescriptorWrites->descriptorType > VK_DESCRIPTOR_TYPE_END_RANGE)
4681 {
4682 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4683 "vkUpdateDescriptorSets parameter, VkDescriptorType pDescriptorWrites->descriptorType, is an unrecognized enumerator");
4684 return false;
4685 }
4686 /* TODO: Validate other parts of pImageInfo, pBufferInfo, pTexelBufferView? */
4687 /* TODO: This test should probably only be done if descriptorType is correct type of descriptor */
4688 if(pDescriptorWrites->pImageInfo != nullptr)
4689 {
4690 if (((pDescriptorWrites->pImageInfo->imageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
4691 (pDescriptorWrites->pImageInfo->imageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4692 (pDescriptorWrites->pImageInfo->imageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
4693 {
4694 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4695 "vkUpdateDescriptorSets parameter, VkImageLayout pDescriptorWrites->pDescriptors->imageLayout, is an unrecognized enumerator");
4696 return false;
4697 }
4698 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004699 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004700
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004701 if(pDescriptorCopies != nullptr)
4702 {
4703 if(pDescriptorCopies->sType != VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET)
4704 {
4705 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4706 "vkUpdateDescriptorSets parameter, VkStructureType pDescriptorCopies->sType, is an invalid enumerator");
4707 return false;
4708 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004709 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004710
4711 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004712}
4713
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004714VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkUpdateDescriptorSets(
4715 VkDevice device,
4716 uint32_t descriptorWriteCount,
4717 const VkWriteDescriptorSet* pDescriptorWrites,
4718 uint32_t descriptorCopyCount,
4719 const VkCopyDescriptorSet* pDescriptorCopies)
4720{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004721 PreUpdateDescriptorSets(device, pDescriptorWrites, pDescriptorCopies);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004722
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004723 get_dispatch_table(pc_device_table_map, device)->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004724}
4725
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004726bool PreCreateFramebuffer(
4727 VkDevice device,
4728 const VkFramebufferCreateInfo* pCreateInfo)
4729{
4730 if(pCreateInfo != nullptr)
4731 {
4732 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO)
4733 {
4734 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4735 "vkCreateFramebuffer parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
4736 return false;
4737 }
4738 if(pCreateInfo->pAttachments != nullptr)
4739 {
4740 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004741 }
4742
4743 return true;
4744}
4745
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004746bool PostCreateFramebuffer(
4747 VkDevice device,
4748 VkFramebuffer* pFramebuffer,
4749 VkResult result)
4750{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004751
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004752 if(pFramebuffer != nullptr)
4753 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004754 }
4755
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004756 if(result < VK_SUCCESS)
4757 {
4758 std::string reason = "vkCreateFramebuffer parameter, VkResult result, is " + EnumeratorString(result);
4759 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004760 return false;
4761 }
4762
4763 return true;
4764}
4765
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004766VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateFramebuffer(
4767 VkDevice device,
4768 const VkFramebufferCreateInfo* pCreateInfo,
4769 const VkAllocationCallbacks* pAllocator,
4770 VkFramebuffer* pFramebuffer)
4771{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004772 PreCreateFramebuffer(device, pCreateInfo);
4773
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004774 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004775
4776 PostCreateFramebuffer(device, pFramebuffer, result);
4777
4778 return result;
4779}
4780
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004781bool PreCreateRenderPass(
4782 VkDevice device,
4783 const VkRenderPassCreateInfo* pCreateInfo)
4784{
4785 if(pCreateInfo != nullptr)
4786 {
4787 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO)
4788 {
4789 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4790 "vkCreateRenderPass parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
4791 return false;
4792 }
4793 if(pCreateInfo->pAttachments != nullptr)
4794 {
4795 if(pCreateInfo->pAttachments->format < VK_FORMAT_BEGIN_RANGE ||
4796 pCreateInfo->pAttachments->format > VK_FORMAT_END_RANGE)
4797 {
4798 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4799 "vkCreateRenderPass parameter, VkFormat pCreateInfo->pAttachments->format, is an unrecognized enumerator");
4800 return false;
4801 }
4802 if(pCreateInfo->pAttachments->loadOp < VK_ATTACHMENT_LOAD_OP_BEGIN_RANGE ||
4803 pCreateInfo->pAttachments->loadOp > VK_ATTACHMENT_LOAD_OP_END_RANGE)
4804 {
4805 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4806 "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->pAttachments->loadOp, is an unrecognized enumerator");
4807 return false;
4808 }
4809 if(pCreateInfo->pAttachments->storeOp < VK_ATTACHMENT_STORE_OP_BEGIN_RANGE ||
4810 pCreateInfo->pAttachments->storeOp > VK_ATTACHMENT_STORE_OP_END_RANGE)
4811 {
4812 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4813 "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->pAttachments->storeOp, is an unrecognized enumerator");
4814 return false;
4815 }
4816 if(pCreateInfo->pAttachments->stencilLoadOp < VK_ATTACHMENT_LOAD_OP_BEGIN_RANGE ||
4817 pCreateInfo->pAttachments->stencilLoadOp > VK_ATTACHMENT_LOAD_OP_END_RANGE)
4818 {
4819 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4820 "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->pAttachments->stencilLoadOp, is an unrecognized enumerator");
4821 return false;
4822 }
4823 if(pCreateInfo->pAttachments->stencilStoreOp < VK_ATTACHMENT_STORE_OP_BEGIN_RANGE ||
4824 pCreateInfo->pAttachments->stencilStoreOp > VK_ATTACHMENT_STORE_OP_END_RANGE)
4825 {
4826 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4827 "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->pAttachments->stencilStoreOp, is an unrecognized enumerator");
4828 return false;
4829 }
4830 if (((pCreateInfo->pAttachments->initialLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
4831 (pCreateInfo->pAttachments->initialLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4832 (pCreateInfo->pAttachments->initialLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
4833 {
4834 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4835 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pAttachments->initialLayout, is an unrecognized enumerator");
4836 return false;
4837 }
4838 if (((pCreateInfo->pAttachments->initialLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
4839 (pCreateInfo->pAttachments->initialLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4840 (pCreateInfo->pAttachments->initialLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
4841 {
4842 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4843 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pAttachments->finalLayout, is an unrecognized enumerator");
4844 return false;
4845 }
4846 }
4847 if(pCreateInfo->pSubpasses != nullptr)
4848 {
4849 if(pCreateInfo->pSubpasses->pipelineBindPoint < VK_PIPELINE_BIND_POINT_BEGIN_RANGE ||
4850 pCreateInfo->pSubpasses->pipelineBindPoint > VK_PIPELINE_BIND_POINT_END_RANGE)
4851 {
4852 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4853 "vkCreateRenderPass parameter, VkPipelineBindPoint pCreateInfo->pSubpasses->pipelineBindPoint, is an unrecognized enumerator");
4854 return false;
4855 }
4856 if(pCreateInfo->pSubpasses->pInputAttachments != nullptr)
4857 {
4858 if (((pCreateInfo->pSubpasses->pInputAttachments->layout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
4859 (pCreateInfo->pSubpasses->pInputAttachments->layout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4860 (pCreateInfo->pSubpasses->pInputAttachments->layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
4861 {
4862 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4863 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pSubpasses->pInputAttachments->layout, is an unrecognized enumerator");
4864 return false;
4865 }
4866 }
4867 if(pCreateInfo->pSubpasses->pColorAttachments != nullptr)
4868 {
4869 if (((pCreateInfo->pSubpasses->pColorAttachments->layout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
4870 (pCreateInfo->pSubpasses->pColorAttachments->layout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4871 (pCreateInfo->pSubpasses->pColorAttachments->layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
4872 {
4873 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4874 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pSubpasses->pColorAttachments->layout, is an unrecognized enumerator");
4875 return false;
4876 }
4877 }
4878 if(pCreateInfo->pSubpasses->pResolveAttachments != nullptr)
4879 {
4880 if (((pCreateInfo->pSubpasses->pResolveAttachments->layout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
4881 (pCreateInfo->pSubpasses->pResolveAttachments->layout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4882 (pCreateInfo->pSubpasses->pResolveAttachments->layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
4883 {
4884 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4885 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pSubpasses->pResolveAttachments->layout, is an unrecognized enumerator");
4886 return false;
4887 }
4888 }
4889 if(pCreateInfo->pSubpasses->pDepthStencilAttachment &&
4890 ((pCreateInfo->pSubpasses->pDepthStencilAttachment->layout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
4891 (pCreateInfo->pSubpasses->pDepthStencilAttachment->layout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4892 (pCreateInfo->pSubpasses->pDepthStencilAttachment->layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
4893 {
4894 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4895 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pSubpasses->pDepthStencilAttachment->layout, is an unrecognized enumerator");
4896 return false;
4897 }
4898 }
4899 if(pCreateInfo->pDependencies != nullptr)
4900 {
4901 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004902 }
4903
4904 return true;
4905}
4906
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004907bool PostCreateRenderPass(
4908 VkDevice device,
4909 VkRenderPass* pRenderPass,
4910 VkResult result)
4911{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004912
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004913 if(pRenderPass != nullptr)
4914 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004915 }
4916
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004917 if(result < VK_SUCCESS)
4918 {
4919 std::string reason = "vkCreateRenderPass parameter, VkResult result, is " + EnumeratorString(result);
4920 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004921 return false;
4922 }
4923
4924 return true;
4925}
4926
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004927VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(
4928 VkDevice device,
4929 const VkRenderPassCreateInfo* pCreateInfo,
4930 const VkAllocationCallbacks* pAllocator,
4931 VkRenderPass* pRenderPass)
4932{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004933 PreCreateRenderPass(device, pCreateInfo);
4934
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004935 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004936
4937 PostCreateRenderPass(device, pRenderPass, result);
4938
4939 return result;
4940}
4941
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004942bool PostGetRenderAreaGranularity(
4943 VkDevice device,
4944 VkRenderPass renderPass,
4945 VkExtent2D* pGranularity)
4946{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004947
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004948
4949 if(pGranularity != nullptr)
4950 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004951 }
4952
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004953 return true;
4954}
4955
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004956VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetRenderAreaGranularity(
4957 VkDevice device,
4958 VkRenderPass renderPass,
4959 VkExtent2D* pGranularity)
4960{
4961 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004962
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06004963 PostGetRenderAreaGranularity(device, renderPass, pGranularity);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004964}
4965
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004966bool PreCreateCommandPool(
4967 VkDevice device,
4968 const VkCommandPoolCreateInfo* pCreateInfo)
4969{
4970 if(pCreateInfo != nullptr)
4971 {
4972 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO)
4973 {
4974 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4975 "vkCreateCommandPool parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
4976 return false;
4977 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004978 }
4979
4980 return true;
4981}
4982
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004983bool PostCreateCommandPool(
4984 VkDevice device,
4985 VkCommandPool* pCommandPool,
4986 VkResult result)
4987{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004988
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004989 if(pCommandPool != nullptr)
4990 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004991 }
4992
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004993 if(result < VK_SUCCESS)
4994 {
4995 std::string reason = "vkCreateCommandPool parameter, VkResult result, is " + EnumeratorString(result);
4996 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004997 return false;
4998 }
4999
5000 return true;
5001}
5002
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005003VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool(
5004 VkDevice device,
5005 const VkCommandPoolCreateInfo* pCreateInfo,
5006 const VkAllocationCallbacks* pAllocator,
5007 VkCommandPool* pCommandPool)
5008{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005009 PreCreateCommandPool(device, pCreateInfo);
5010
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005011 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005012
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005013 PostCreateCommandPool(device, pCommandPool, result);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005014
5015 return result;
5016}
5017
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005018bool PostResetCommandPool(
5019 VkDevice device,
5020 VkCommandPool commandPool,
5021 VkCommandPoolResetFlags flags,
5022 VkResult result)
5023{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005024
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005025
5026
5027 if(result < VK_SUCCESS)
5028 {
5029 std::string reason = "vkResetCommandPool parameter, VkResult result, is " + EnumeratorString(result);
5030 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005031 return false;
5032 }
5033
5034 return true;
5035}
5036
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005037VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetCommandPool(
5038 VkDevice device,
5039 VkCommandPool commandPool,
5040 VkCommandPoolResetFlags flags)
5041{
5042 VkResult result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005043
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005044 PostResetCommandPool(device, commandPool, flags, result);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005045
5046 return result;
5047}
5048
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005049bool PreCreateCommandBuffer(
5050 VkDevice device,
5051 const VkCommandBufferAllocateInfo* pCreateInfo)
5052{
5053 if(pCreateInfo != nullptr)
5054 {
5055 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO)
5056 {
5057 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5058 "vkAllocateCommandBuffers parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
5059 return false;
5060 }
5061 if(pCreateInfo->level < VK_COMMAND_BUFFER_LEVEL_BEGIN_RANGE ||
5062 pCreateInfo->level > VK_COMMAND_BUFFER_LEVEL_END_RANGE)
5063 {
5064 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5065 "vkAllocateCommandBuffers parameter, VkCommandBufferLevel pCreateInfo->level, is an unrecognized enumerator");
5066 return false;
5067 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005068 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005069
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005070 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005071}
5072
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005073bool PostCreateCommandBuffer(
5074 VkDevice device,
5075 VkCommandBuffer* pCommandBuffer,
5076 VkResult result)
5077{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005078
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005079 if(pCommandBuffer != nullptr)
5080 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005081 }
5082
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005083 if(result < VK_SUCCESS)
5084 {
5085 std::string reason = "vkAllocateCommandBuffers parameter, VkResult result, is " + EnumeratorString(result);
5086 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005087 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005088 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005089
5090 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005091}
5092
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005093VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateCommandBuffers(
5094 VkDevice device,
5095 const VkCommandBufferAllocateInfo* pCreateInfo,
5096 VkCommandBuffer* pCommandBuffer)
5097{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005098 PreCreateCommandBuffer(device, pCreateInfo);
5099
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005100 VkResult result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pCreateInfo, pCommandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005101
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005102 PostCreateCommandBuffer(device, pCommandBuffer, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005103
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005104 return result;
5105}
5106
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005107bool PreBeginCommandBuffer(
5108 VkCommandBuffer commandBuffer,
5109 const VkCommandBufferBeginInfo* pBeginInfo)
5110{
5111 if(pBeginInfo != nullptr)
5112 {
5113 if(pBeginInfo->sType != VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO)
5114 {
5115 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5116 "vkBeginCommandBuffer parameter, VkStructureType pBeginInfo->sType, is an invalid enumerator");
5117 return false;
5118 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06005119 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005120
5121 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005122}
5123
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005124bool PostBeginCommandBuffer(
5125 VkCommandBuffer commandBuffer,
5126 VkResult result)
5127{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005128
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005129 if(result < VK_SUCCESS)
5130 {
5131 std::string reason = "vkBeginCommandBuffer parameter, VkResult result, is " + EnumeratorString(result);
5132 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005133 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005134 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005135
5136 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005137}
5138
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005139VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBeginCommandBuffer(
5140 VkCommandBuffer commandBuffer,
5141 const VkCommandBufferBeginInfo* pBeginInfo)
5142{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005143 PreBeginCommandBuffer(commandBuffer, pBeginInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005144
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005145 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005146
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005147 PostBeginCommandBuffer(commandBuffer, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005148
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005149 return result;
5150}
5151
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005152bool PostEndCommandBuffer(
5153 VkCommandBuffer commandBuffer,
5154 VkResult result)
5155{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005156
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005157 if(result < VK_SUCCESS)
5158 {
5159 std::string reason = "vkEndCommandBuffer parameter, VkResult result, is " + EnumeratorString(result);
5160 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005161 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005162 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005163
5164 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005165}
5166
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005167VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer(
5168 VkCommandBuffer commandBuffer)
5169{
5170 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005171
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005172 PostEndCommandBuffer(commandBuffer, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005173
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005174 return result;
5175}
5176
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005177bool PostResetCommandBuffer(
5178 VkCommandBuffer commandBuffer,
5179 VkCommandBufferResetFlags flags,
5180 VkResult result)
5181{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005182
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005183
5184 if(result < VK_SUCCESS)
5185 {
5186 std::string reason = "vkResetCommandBuffer parameter, VkResult result, is " + EnumeratorString(result);
5187 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK", "%s", reason.c_str());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005188 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005189 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005190
5191 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005192}
5193
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005194VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetCommandBuffer(
5195 VkCommandBuffer commandBuffer,
5196 VkCommandBufferResetFlags flags)
5197{
5198 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005199
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005200 PostResetCommandBuffer(commandBuffer, flags, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005201
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005202 return result;
5203}
5204
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005205bool PostCmdBindPipeline(
5206 VkCommandBuffer commandBuffer,
5207 VkPipelineBindPoint pipelineBindPoint,
5208 VkPipeline pipeline)
5209{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005210
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005211 if(pipelineBindPoint < VK_PIPELINE_BIND_POINT_BEGIN_RANGE ||
5212 pipelineBindPoint > VK_PIPELINE_BIND_POINT_END_RANGE)
5213 {
5214 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5215 "vkCmdBindPipeline parameter, VkPipelineBindPoint pipelineBindPoint, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005216 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005217 }
5218
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005219
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005220 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005221}
5222
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005223VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindPipeline(
5224 VkCommandBuffer commandBuffer,
5225 VkPipelineBindPoint pipelineBindPoint,
5226 VkPipeline pipeline)
5227{
5228 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005229
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005230 PostCmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005231}
5232
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005233VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport* pViewports)
5234{
5235 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06005236}
5237
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005238VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D* pScissors)
5239{
5240 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005241}
5242
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005243VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth)
5244{
5245 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005246}
5247
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005248VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor)
5249{
5250 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005251}
5252
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005253VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4])
5254{
5255 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
Cody Northrop12365112015-08-17 11:10:49 -06005256}
5257
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005258VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds)
5259{
5260 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06005261}
5262
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005263VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask)
5264{
5265 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005266}
5267
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005268VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask)
5269{
5270 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005271}
5272
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005273VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference)
5274{
5275 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005276}
5277
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005278bool PreCmdBindDescriptorSets(
5279 VkCommandBuffer commandBuffer,
5280 const VkDescriptorSet* pDescriptorSets,
5281 const uint32_t* pDynamicOffsets)
5282{
5283 if(pDescriptorSets != nullptr)
5284 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005285 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005286
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005287 if(pDynamicOffsets != nullptr)
5288 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005289 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005290
5291 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005292}
5293
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005294bool PostCmdBindDescriptorSets(
5295 VkCommandBuffer commandBuffer,
5296 VkPipelineBindPoint pipelineBindPoint,
5297 VkPipelineLayout layout,
5298 uint32_t firstSet,
5299 uint32_t setCount,
5300 uint32_t dynamicOffsetCount)
5301{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005302
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005303 if(pipelineBindPoint < VK_PIPELINE_BIND_POINT_BEGIN_RANGE ||
5304 pipelineBindPoint > VK_PIPELINE_BIND_POINT_END_RANGE)
5305 {
5306 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5307 "vkCmdBindDescriptorSets parameter, VkPipelineBindPoint pipelineBindPoint, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005308 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005309 }
5310
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005311
5312
5313
5314
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005315 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005316}
5317
Chia-I Wu9ab61502015-11-06 06:42:02 +08005318VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorSets(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005319 VkCommandBuffer commandBuffer,
5320 VkPipelineBindPoint pipelineBindPoint,
5321 VkPipelineLayout layout,
5322 uint32_t firstSet,
5323 uint32_t setCount,
5324 const VkDescriptorSet* pDescriptorSets,
5325 uint32_t dynamicOffsetCount,
5326 const uint32_t* pDynamicOffsets)
5327{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005328 PreCmdBindDescriptorSets(commandBuffer, pDescriptorSets, pDynamicOffsets);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005329
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005330 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, setCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005331
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005332 PostCmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, setCount, dynamicOffsetCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005333}
5334
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005335bool PostCmdBindIndexBuffer(
5336 VkCommandBuffer commandBuffer,
5337 VkBuffer buffer,
5338 VkDeviceSize offset,
5339 VkIndexType indexType)
5340{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005341
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005342
5343
5344 if(indexType < VK_INDEX_TYPE_BEGIN_RANGE ||
5345 indexType > VK_INDEX_TYPE_END_RANGE)
5346 {
5347 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5348 "vkCmdBindIndexBuffer parameter, VkIndexType indexType, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005349 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005350 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005351
5352 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005353}
5354
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005355VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindIndexBuffer(
5356 VkCommandBuffer commandBuffer,
5357 VkBuffer buffer,
5358 VkDeviceSize offset,
5359 VkIndexType indexType)
5360{
5361 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005362
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005363 PostCmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005364}
5365
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005366bool PreCmdBindVertexBuffers(
5367 VkCommandBuffer commandBuffer,
5368 const VkBuffer* pBuffers,
5369 const VkDeviceSize* pOffsets)
5370{
5371 if(pBuffers != nullptr)
5372 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005373 }
5374
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005375 if(pOffsets != nullptr)
5376 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005377 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005378
5379 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005380}
5381
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005382bool PostCmdBindVertexBuffers(
5383 VkCommandBuffer commandBuffer,
5384 uint32_t firstBinding,
5385 uint32_t bindingCount)
5386{
5387
5388
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005389
5390 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005391}
5392
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005393VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers(
5394 VkCommandBuffer commandBuffer,
5395 uint32_t firstBinding,
5396 uint32_t bindingCount,
5397 const VkBuffer* pBuffers,
5398 const VkDeviceSize* pOffsets)
5399{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005400 PreCmdBindVertexBuffers(commandBuffer, pBuffers, pOffsets);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005401
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005402 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005403
Jon Ashburn19d3bf12015-12-30 14:06:55 -07005404 PostCmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005405}
5406
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005407bool PreCmdDraw(
5408 VkCommandBuffer commandBuffer,
5409 uint32_t vertexCount,
5410 uint32_t instanceCount,
5411 uint32_t firstVertex,
5412 uint32_t firstInstance)
5413{
Michael Lentine55a913f2015-11-24 09:48:23 -06005414 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005415 // 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 -07005416 // this an error or leave as is.
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005417 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARN_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5418 "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06005419 return false;
5420 }
5421
5422 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005423 // 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 -07005424 // this an error or leave as is.
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005425 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARN_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5426 "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06005427 return false;
5428 }
5429
5430 return true;
5431}
5432
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005433bool PostCmdDraw(
5434 VkCommandBuffer commandBuffer,
5435 uint32_t firstVertex,
5436 uint32_t vertexCount,
5437 uint32_t firstInstance,
5438 uint32_t instanceCount)
5439{
5440
5441
5442
5443
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005444
5445 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005446}
5447
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005448VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDraw(
5449 VkCommandBuffer commandBuffer,
5450 uint32_t vertexCount,
5451 uint32_t instanceCount,
5452 uint32_t firstVertex,
5453 uint32_t firstInstance)
5454{
5455 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06005456
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005457 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005458
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005459 PostCmdDraw(commandBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005460}
5461
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005462bool PostCmdDrawIndexed(
5463 VkCommandBuffer commandBuffer,
5464 uint32_t firstIndex,
5465 uint32_t indexCount,
5466 int32_t vertexOffset,
5467 uint32_t firstInstance,
5468 uint32_t instanceCount)
5469{
5470
5471
5472
5473
5474
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005475
5476 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005477}
5478
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005479VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexed(
5480 VkCommandBuffer commandBuffer,
5481 uint32_t indexCount,
5482 uint32_t instanceCount,
5483 uint32_t firstIndex,
5484 int32_t vertexOffset,
5485 uint32_t firstInstance)
5486{
5487 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005488
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005489 PostCmdDrawIndexed(commandBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005490}
5491
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005492bool PostCmdDrawIndirect(
5493 VkCommandBuffer commandBuffer,
5494 VkBuffer buffer,
5495 VkDeviceSize offset,
5496 uint32_t count,
5497 uint32_t stride)
5498{
5499
5500
5501
5502
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005503
5504 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005505}
5506
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005507VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirect(
5508 VkCommandBuffer commandBuffer,
5509 VkBuffer buffer,
5510 VkDeviceSize offset,
5511 uint32_t count,
5512 uint32_t stride)
5513{
5514 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005515
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005516 PostCmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005517}
5518
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005519bool PostCmdDrawIndexedIndirect(
5520 VkCommandBuffer commandBuffer,
5521 VkBuffer buffer,
5522 VkDeviceSize offset,
5523 uint32_t count,
5524 uint32_t stride)
5525{
5526
5527
5528
5529
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005530
5531 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005532}
5533
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005534VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirect(
5535 VkCommandBuffer commandBuffer,
5536 VkBuffer buffer,
5537 VkDeviceSize offset,
5538 uint32_t count,
5539 uint32_t stride)
5540{
5541 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005542
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005543 PostCmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005544}
5545
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005546bool PostCmdDispatch(
5547 VkCommandBuffer commandBuffer,
5548 uint32_t x,
5549 uint32_t y,
5550 uint32_t z)
5551{
5552
5553
5554
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005555
5556 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005557}
5558
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005559VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDispatch(
5560 VkCommandBuffer commandBuffer,
5561 uint32_t x,
5562 uint32_t y,
5563 uint32_t z)
5564{
5565 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005566
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005567 PostCmdDispatch(commandBuffer, x, y, z);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005568}
5569
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005570bool PostCmdDispatchIndirect(
5571 VkCommandBuffer commandBuffer,
5572 VkBuffer buffer,
5573 VkDeviceSize offset)
5574{
5575
5576
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005577
5578 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005579}
5580
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005581VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDispatchIndirect(
5582 VkCommandBuffer commandBuffer,
5583 VkBuffer buffer,
5584 VkDeviceSize offset)
5585{
5586 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005587
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005588 PostCmdDispatchIndirect(commandBuffer, buffer, offset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005589}
5590
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005591bool PreCmdCopyBuffer(
5592 VkCommandBuffer commandBuffer,
5593 const VkBufferCopy* pRegions)
5594{
5595 if(pRegions != nullptr)
5596 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005597 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005598
5599 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005600}
5601
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005602bool PostCmdCopyBuffer(
5603 VkCommandBuffer commandBuffer,
5604 VkBuffer srcBuffer,
5605 VkBuffer dstBuffer,
5606 uint32_t regionCount)
5607{
5608
5609
5610
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005611
5612 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005613}
5614
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005615VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer(
5616 VkCommandBuffer commandBuffer,
5617 VkBuffer srcBuffer,
5618 VkBuffer dstBuffer,
5619 uint32_t regionCount,
5620 const VkBufferCopy* pRegions)
5621{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005622 PreCmdCopyBuffer(commandBuffer, pRegions);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005623
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005624 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005625
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005626 PostCmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005627}
5628
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005629bool PreCmdCopyImage(
5630 VkCommandBuffer commandBuffer,
5631 const VkImageCopy* pRegions)
5632{
5633 if(pRegions != nullptr)
5634 {
5635 if ((pRegions->srcSubresource.aspectMask &
5636 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
5637 {
5638 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5639 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
5640 return false;
5641 }
5642 if ((pRegions->dstSubresource.aspectMask &
5643 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
5644 {
5645 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5646 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
5647 return false;
5648 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005649 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005650
5651 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005652}
5653
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005654bool PostCmdCopyImage(
5655 VkCommandBuffer commandBuffer,
5656 VkImage srcImage,
5657 VkImageLayout srcImageLayout,
5658 VkImage dstImage,
5659 VkImageLayout dstImageLayout,
5660 uint32_t regionCount)
5661{
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07005662 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005663 (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5664 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5665 {
5666 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5667 "vkCmdCopyImage parameter, VkImageLayout srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005668 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005669 }
5670
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005671
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07005672 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005673 (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5674 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5675 {
5676 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5677 "vkCmdCopyImage parameter, VkImageLayout dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005678 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005679 }
5680
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005681
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005682 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005683}
5684
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005685VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImage(
5686 VkCommandBuffer commandBuffer,
5687 VkImage srcImage,
5688 VkImageLayout srcImageLayout,
5689 VkImage dstImage,
5690 VkImageLayout dstImageLayout,
5691 uint32_t regionCount,
5692 const VkImageCopy* pRegions)
5693{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005694 PreCmdCopyImage(commandBuffer, pRegions);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005695
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005696 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005697
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005698 PostCmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005699}
5700
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005701bool PreCmdBlitImage(
5702 VkCommandBuffer commandBuffer,
5703 const VkImageBlit* pRegions)
5704{
5705 if(pRegions != nullptr)
5706 {
5707 if ((pRegions->srcSubresource.aspectMask &
5708 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
5709 {
5710 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5711 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
5712 return false;
5713 }
5714 if ((pRegions->dstSubresource.aspectMask &
5715 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
5716 {
5717 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5718 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
5719 return false;
5720 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005721 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005722
5723 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005724}
5725
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005726bool PostCmdBlitImage(
5727 VkCommandBuffer commandBuffer,
5728 VkImage srcImage,
5729 VkImageLayout srcImageLayout,
5730 VkImage dstImage,
5731 VkImageLayout dstImageLayout,
5732 uint32_t regionCount,
5733 VkFilter filter)
5734{
5735
Jeremy Hayes99a96322015-06-26 12:48:09 -06005736
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07005737 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005738 (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5739 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5740 {
5741 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5742 "vkCmdBlitImage parameter, VkImageLayout srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005743 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005744 }
5745
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005746
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07005747 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005748 (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5749 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5750 {
5751 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5752 "vkCmdBlitImage parameter, VkImageLayout dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005753 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005754 }
5755
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005756
5757 if(filter < VK_FILTER_BEGIN_RANGE ||
5758 filter > VK_FILTER_END_RANGE)
5759 {
5760 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5761 "vkCmdBlitImage parameter, VkFilter filter, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005762 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005763 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005764
5765 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005766}
5767
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005768VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBlitImage(
5769 VkCommandBuffer commandBuffer,
5770 VkImage srcImage,
5771 VkImageLayout srcImageLayout,
5772 VkImage dstImage,
5773 VkImageLayout dstImageLayout,
5774 uint32_t regionCount,
5775 const VkImageBlit* pRegions,
5776 VkFilter filter)
5777{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005778 PreCmdBlitImage(commandBuffer, pRegions);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005779
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005780 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005781
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005782 PostCmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005783}
5784
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005785bool PreCmdCopyBufferToImage(
5786 VkCommandBuffer commandBuffer,
5787 const VkBufferImageCopy* pRegions)
5788{
5789 if(pRegions != nullptr)
5790 {
5791 if ((pRegions->imageSubresource.aspectMask &
5792 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
5793 {
5794 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5795 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized enumerator");
5796 return false;
5797 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005798 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005799
5800 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005801}
5802
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005803bool PostCmdCopyBufferToImage(
5804 VkCommandBuffer commandBuffer,
5805 VkBuffer srcBuffer,
5806 VkImage dstImage,
5807 VkImageLayout dstImageLayout,
5808 uint32_t regionCount)
5809{
5810
5811
Jeremy Hayes99a96322015-06-26 12:48:09 -06005812
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07005813 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005814 (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5815 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5816 {
5817 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5818 "vkCmdCopyBufferToImage parameter, VkImageLayout dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005819 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005820 }
5821
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005822
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005823 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005824}
5825
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005826VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage(
5827 VkCommandBuffer commandBuffer,
5828 VkBuffer srcBuffer,
5829 VkImage dstImage,
5830 VkImageLayout dstImageLayout,
5831 uint32_t regionCount,
5832 const VkBufferImageCopy* pRegions)
5833{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005834 PreCmdCopyBufferToImage(commandBuffer, pRegions);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005835
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005836 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005837
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005838 PostCmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005839}
5840
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005841bool PreCmdCopyImageToBuffer(
5842 VkCommandBuffer commandBuffer,
5843 const VkBufferImageCopy* pRegions)
5844{
5845 if(pRegions != nullptr)
5846 {
5847 if ((pRegions->imageSubresource.aspectMask &
5848 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
5849 {
5850 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5851 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized enumerator");
5852 return false;
5853 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005854 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005855
5856 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005857}
5858
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005859bool PostCmdCopyImageToBuffer(
5860 VkCommandBuffer commandBuffer,
5861 VkImage srcImage,
5862 VkImageLayout srcImageLayout,
5863 VkBuffer dstBuffer,
5864 uint32_t regionCount)
5865{
5866
Jeremy Hayes99a96322015-06-26 12:48:09 -06005867
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07005868 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005869 (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5870 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5871 {
5872 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5873 "vkCmdCopyImageToBuffer parameter, VkImageLayout srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005874 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005875 }
5876
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005877
5878
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005879 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005880}
5881
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005882VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer(
5883 VkCommandBuffer commandBuffer,
5884 VkImage srcImage,
5885 VkImageLayout srcImageLayout,
5886 VkBuffer dstBuffer,
5887 uint32_t regionCount,
5888 const VkBufferImageCopy* pRegions)
5889{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005890 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005891
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005892 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005893
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005894 PostCmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005895}
5896
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005897bool PreCmdUpdateBuffer(
5898 VkCommandBuffer commandBuffer,
5899 const uint32_t* pData)
5900{
5901 if(pData != nullptr)
5902 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005903 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005904
5905 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005906}
5907
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005908bool PostCmdUpdateBuffer(
5909 VkCommandBuffer commandBuffer,
5910 VkBuffer dstBuffer,
5911 VkDeviceSize dstOffset,
5912 VkDeviceSize dataSize)
5913{
5914
5915
5916
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005917
5918 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005919}
5920
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005921VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer(
5922 VkCommandBuffer commandBuffer,
5923 VkBuffer dstBuffer,
5924 VkDeviceSize dstOffset,
5925 VkDeviceSize dataSize,
5926 const uint32_t* pData)
5927{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005928 PreCmdUpdateBuffer(commandBuffer, pData);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005929
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005930 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005931
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005932 PostCmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005933}
5934
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005935bool PostCmdFillBuffer(
5936 VkCommandBuffer commandBuffer,
5937 VkBuffer dstBuffer,
5938 VkDeviceSize dstOffset,
5939 VkDeviceSize size,
5940 uint32_t data)
5941{
5942
5943
5944
5945
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005946
5947 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005948}
5949
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005950VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdFillBuffer(
5951 VkCommandBuffer commandBuffer,
5952 VkBuffer dstBuffer,
5953 VkDeviceSize dstOffset,
5954 VkDeviceSize size,
5955 uint32_t data)
5956{
5957 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005958
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005959 PostCmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005960}
5961
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005962bool PreCmdClearColorImage(
5963 VkCommandBuffer commandBuffer,
5964 const VkClearColorValue* pColor,
5965 const VkImageSubresourceRange* pRanges)
5966{
5967 if(pColor != nullptr)
5968 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005969 }
5970
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005971 if(pRanges != nullptr)
5972 {
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -06005973 /* TODO: How should we validate pRanges->aspectMask */
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005974 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005975
5976 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005977}
5978
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005979bool PostCmdClearColorImage(
5980 VkCommandBuffer commandBuffer,
5981 VkImage image,
5982 VkImageLayout imageLayout,
5983 uint32_t rangeCount)
5984{
5985
Jeremy Hayes99a96322015-06-26 12:48:09 -06005986
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07005987 if (((imageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005988 (imageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5989 (imageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5990 {
5991 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5992 "vkCmdClearColorImage parameter, VkImageLayout imageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005993 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005994 }
5995
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005996
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005997 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005998}
5999
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006000VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(
6001 VkCommandBuffer commandBuffer,
6002 VkImage image,
6003 VkImageLayout imageLayout,
6004 const VkClearColorValue* pColor,
6005 uint32_t rangeCount,
6006 const VkImageSubresourceRange* pRanges)
6007{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006008 PreCmdClearColorImage(commandBuffer, pColor, pRanges);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006009
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006010 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006011
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006012 PostCmdClearColorImage(commandBuffer, image, imageLayout, rangeCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006013}
6014
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006015bool PreCmdClearDepthStencilImage(
6016 VkCommandBuffer commandBuffer,
6017 const VkImageSubresourceRange* pRanges)
6018{
6019 if(pRanges != nullptr)
6020 {
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -06006021 /*
6022 * TODO: How do we validation pRanges->aspectMask?
6023 * Allows values are: VK_IMAGE_ASPECT_DEPTH_BIT and
6024 * VK_IMAGE_ASPECT_STENCIL_BIT.
6025 */
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006026 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006027
6028 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006029}
6030
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006031bool PostCmdClearDepthStencilImage(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006032 VkCommandBuffer commandBuffer,
6033 VkImage image,
6034 VkImageLayout imageLayout,
6035 const VkClearDepthStencilValue* pDepthStencil,
6036 uint32_t rangeCount)
6037{
6038
Jeremy Hayes99a96322015-06-26 12:48:09 -06006039
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006040 if (((imageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006041 (imageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6042 (imageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6043 {
6044 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6045 "vkCmdClearDepthStencilImage parameter, VkImageLayout imageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006046 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006047 }
6048
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006049
6050
6051
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006052 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006053}
6054
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006055VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearDepthStencilImage(
6056 VkCommandBuffer commandBuffer,
6057 VkImage image,
6058 VkImageLayout imageLayout,
6059 const VkClearDepthStencilValue* pDepthStencil,
6060 uint32_t rangeCount,
6061 const VkImageSubresourceRange* pRanges)
6062{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006063 PreCmdClearDepthStencilImage(commandBuffer, pRanges);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006064
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006065 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006066
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006067 PostCmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006068}
6069
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006070bool PreCmdClearAttachments(
6071 VkCommandBuffer commandBuffer,
6072 const VkClearColorValue* pColor,
6073 const VkClearRect* pRects)
6074{
6075 if(pColor != nullptr)
6076 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006077 }
6078
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006079 if(pRects != nullptr)
6080 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006081 }
6082
6083 return true;
6084}
6085
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006086VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearAttachments(
6087 VkCommandBuffer commandBuffer,
6088 uint32_t attachmentCount,
6089 const VkClearAttachment* pAttachments,
6090 uint32_t rectCount,
6091 const VkClearRect* pRects)
6092{
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06006093 for (uint32_t i = 0; i < attachmentCount; i++) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006094 PreCmdClearAttachments(commandBuffer, &pAttachments[i].clearValue.color, pRects);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006095 }
6096
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006097 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006098}
6099
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006100bool PreCmdResolveImage(
6101 VkCommandBuffer commandBuffer,
6102 const VkImageResolve* pRegions)
6103{
6104 if(pRegions != nullptr)
6105 {
6106 if ((pRegions->srcSubresource.aspectMask &
6107 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
6108 {
6109 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6110 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
6111 return false;
6112 }
6113 if ((pRegions->dstSubresource.aspectMask &
6114 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
6115 {
6116 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6117 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
6118 return false;
6119 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006120 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006121
6122 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006123}
6124
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006125bool PostCmdResolveImage(
6126 VkCommandBuffer commandBuffer,
6127 VkImage srcImage,
6128 VkImageLayout srcImageLayout,
6129 VkImage dstImage,
6130 VkImageLayout dstImageLayout,
6131 uint32_t regionCount)
6132{
6133
Jeremy Hayes99a96322015-06-26 12:48:09 -06006134
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006135 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006136 (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6137 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6138 {
6139 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6140 "vkCmdResolveImage parameter, VkImageLayout srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006141 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006142 }
6143
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006144
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006145 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006146 (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6147 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6148 {
6149 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6150 "vkCmdResolveImage parameter, VkImageLayout dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006151 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006152 }
6153
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006154
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006155 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006156}
6157
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006158VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdResolveImage(
6159 VkCommandBuffer commandBuffer,
6160 VkImage srcImage,
6161 VkImageLayout srcImageLayout,
6162 VkImage dstImage,
6163 VkImageLayout dstImageLayout,
6164 uint32_t regionCount,
6165 const VkImageResolve* pRegions)
6166{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006167 PreCmdResolveImage(commandBuffer, pRegions);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006168
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006169 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006170
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006171 PostCmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006172}
6173
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006174bool PostCmdSetEvent(
6175 VkCommandBuffer commandBuffer,
6176 VkEvent event,
6177 VkPipelineStageFlags stageMask)
6178{
6179
6180
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006181
6182 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006183}
6184
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006185VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetEvent(
6186 VkCommandBuffer commandBuffer,
6187 VkEvent event,
6188 VkPipelineStageFlags stageMask)
6189{
6190 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006191
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006192 PostCmdSetEvent(commandBuffer, event, stageMask);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006193}
6194
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006195bool PostCmdResetEvent(
6196 VkCommandBuffer commandBuffer,
6197 VkEvent event,
6198 VkPipelineStageFlags stageMask)
6199{
6200
6201
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006202
6203 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006204}
6205
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006206VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdResetEvent(
6207 VkCommandBuffer commandBuffer,
6208 VkEvent event,
6209 VkPipelineStageFlags stageMask)
6210{
6211 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006212
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006213 PostCmdResetEvent(commandBuffer, event, stageMask);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006214}
6215
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006216bool PreCmdWaitEvents(
6217 VkCommandBuffer commandBuffer,
6218 const VkEvent* pEvents,
6219 uint32_t memoryBarrierCount,
6220 const VkMemoryBarrier *pMemoryBarriers,
6221 uint32_t bufferMemoryBarrierCount,
6222 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
6223 uint32_t imageMemoryBarrierCount,
6224 const VkImageMemoryBarrier *pImageMemoryBarriers)
6225{
6226 if(pEvents != nullptr)
6227 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06006228 }
6229
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006230 if(pMemoryBarriers != nullptr)
6231 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06006232 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006233
6234 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006235}
6236
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006237bool PostCmdWaitEvents(
6238 VkCommandBuffer commandBuffer,
6239 uint32_t eventCount,
6240 VkPipelineStageFlags srcStageMask,
6241 VkPipelineStageFlags dstStageMask,
6242 uint32_t memoryBarrierCount)
6243{
6244
6245
6246
6247
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006248
6249 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006250}
6251
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006252VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWaitEvents(
6253 VkCommandBuffer commandBuffer,
6254 uint32_t eventCount,
6255 const VkEvent *pEvents,
6256 VkPipelineStageFlags srcStageMask,
6257 VkPipelineStageFlags dstStageMask,
6258 uint32_t memoryBarrierCount,
6259 const VkMemoryBarrier *pMemoryBarriers,
6260 uint32_t bufferMemoryBarrierCount,
6261 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
6262 uint32_t imageMemoryBarrierCount,
6263 const VkImageMemoryBarrier *pImageMemoryBarriers)
6264{
6265 PreCmdWaitEvents(commandBuffer, pEvents, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006266
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006267 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006268
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006269 PostCmdWaitEvents(commandBuffer, eventCount, srcStageMask, dstStageMask, memoryBarrierCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006270}
6271
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006272bool PreCmdPipelineBarrier(
6273 VkCommandBuffer commandBuffer,
6274 uint32_t memoryBarrierCount,
6275 const VkMemoryBarrier *pMemoryBarriers,
6276 uint32_t bufferMemoryBarrierCount,
6277 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
6278 uint32_t imageMemoryBarrierCount,
6279 const VkImageMemoryBarrier *pImageMemoryBarriers)
6280{
6281 if(pMemoryBarriers != nullptr)
6282 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06006283 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006284
6285 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006286}
6287
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006288bool PostCmdPipelineBarrier(
6289 VkCommandBuffer commandBuffer,
6290 VkPipelineStageFlags srcStageMask,
6291 VkPipelineStageFlags dstStageMask,
6292 VkDependencyFlags dependencyFlags,
6293 uint32_t memoryBarrierCount)
6294{
6295
6296
6297
6298
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006299
6300 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006301}
6302
Chia-I Wu9ab61502015-11-06 06:42:02 +08006303VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPipelineBarrier(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006304 VkCommandBuffer commandBuffer,
6305 VkPipelineStageFlags srcStageMask,
6306 VkPipelineStageFlags dstStageMask,
6307 VkDependencyFlags dependencyFlags,
6308 uint32_t memoryBarrierCount,
6309 const VkMemoryBarrier *pMemoryBarriers,
6310 uint32_t bufferMemoryBarrierCount,
Jon Ashburnf19916e2016-01-11 13:12:43 -07006311 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006312 uint32_t imageMemoryBarrierCount,
6313 const VkImageMemoryBarrier *pImageMemoryBarriers)
6314{
6315 PreCmdPipelineBarrier(commandBuffer, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006316
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006317 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006318
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006319 PostCmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006320}
6321
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006322bool PostCmdBeginQuery(
6323 VkCommandBuffer commandBuffer,
6324 VkQueryPool queryPool,
6325 uint32_t slot,
6326 VkQueryControlFlags flags)
6327{
6328
6329
6330
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006331
6332 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006333}
6334
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006335VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBeginQuery(
6336 VkCommandBuffer commandBuffer,
6337 VkQueryPool queryPool,
6338 uint32_t slot,
6339 VkQueryControlFlags flags)
6340{
6341 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006342
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006343 PostCmdBeginQuery(commandBuffer, queryPool, slot, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006344}
6345
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006346bool PostCmdEndQuery(
6347 VkCommandBuffer commandBuffer,
6348 VkQueryPool queryPool,
6349 uint32_t slot)
6350{
6351
6352
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006353
6354 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006355}
6356
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006357VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndQuery(
6358 VkCommandBuffer commandBuffer,
6359 VkQueryPool queryPool,
6360 uint32_t slot)
6361{
6362 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006363
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006364 PostCmdEndQuery(commandBuffer, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006365}
6366
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006367bool PostCmdResetQueryPool(
6368 VkCommandBuffer commandBuffer,
6369 VkQueryPool queryPool,
6370 uint32_t firstQuery,
6371 uint32_t queryCount)
6372{
6373
6374
6375
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006376
6377 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006378}
6379
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006380VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdResetQueryPool(
6381 VkCommandBuffer commandBuffer,
6382 VkQueryPool queryPool,
6383 uint32_t firstQuery,
6384 uint32_t queryCount)
6385{
6386 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006387
Jon Ashburn19d3bf12015-12-30 14:06:55 -07006388 PostCmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006389}
6390
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006391bool PostCmdWriteTimestamp(
6392 VkCommandBuffer commandBuffer,
6393 VkPipelineStageFlagBits pipelineStage,
6394 VkQueryPool queryPool,
6395 uint32_t slot)
6396{
Jeremy Hayes99a96322015-06-26 12:48:09 -06006397
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08006398 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006399
6400 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006401}
6402
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006403VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp(
6404 VkCommandBuffer commandBuffer,
6405 VkPipelineStageFlagBits pipelineStage,
6406 VkQueryPool queryPool,
6407 uint32_t slot)
6408{
6409 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006410
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006411 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006412}
6413
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006414bool PostCmdCopyQueryPoolResults(
6415 VkCommandBuffer commandBuffer,
6416 VkQueryPool queryPool,
6417 uint32_t firstQuery,
6418 uint32_t queryCount,
6419 VkBuffer dstBuffer,
6420 VkDeviceSize dstOffset,
6421 VkDeviceSize stride,
6422 VkQueryResultFlags flags)
6423{
6424
6425
6426
6427
6428
6429
6430
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006431
6432 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006433}
6434
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006435VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyQueryPoolResults(
6436 VkCommandBuffer commandBuffer,
6437 VkQueryPool queryPool,
6438 uint32_t firstQuery,
6439 uint32_t queryCount,
6440 VkBuffer dstBuffer,
6441 VkDeviceSize dstOffset,
6442 VkDeviceSize stride,
6443 VkQueryResultFlags flags)
6444{
6445 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006446
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006447 PostCmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
Jeremy Hayesad367152015-04-17 10:36:53 -06006448}
6449
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006450bool PreCmdPushConstants(
6451 VkCommandBuffer commandBuffer,
6452 const void* pValues)
6453{
6454 if(pValues != nullptr)
6455 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06006456 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006457
6458 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006459}
6460
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006461bool PostCmdPushConstants(
6462 VkCommandBuffer commandBuffer,
6463 VkPipelineLayout layout,
6464 VkShaderStageFlags stageFlags,
6465 uint32_t offset,
6466 uint32_t size)
6467{
6468
6469
6470
6471
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006472
6473 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006474}
6475
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006476VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants(
6477 VkCommandBuffer commandBuffer,
6478 VkPipelineLayout layout,
6479 VkShaderStageFlags stageFlags,
6480 uint32_t offset,
6481 uint32_t size,
6482 const void* pValues)
6483{
Chia-I Wuce9b1772015-11-12 06:09:22 +08006484 PreCmdPushConstants(commandBuffer, pValues);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006485
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006486 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006487
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006488 PostCmdPushConstants(commandBuffer, layout, stageFlags, offset, size);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006489}
6490
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006491bool PreCmdBeginRenderPass(
6492 VkCommandBuffer commandBuffer,
6493 const VkRenderPassBeginInfo* pRenderPassBegin)
6494{
6495 if(pRenderPassBegin != nullptr)
6496 {
6497 if(pRenderPassBegin->sType != VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO)
6498 {
6499 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6500 "vkCmdBeginRenderPass parameter, VkStructureType pRenderPassBegin->sType, is an invalid enumerator");
6501 return false;
6502 }
6503 if(pRenderPassBegin->pClearValues != nullptr)
6504 {
6505 }
Jon Ashburne68a9ff2015-05-25 14:11:37 -06006506 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006507
6508 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006509}
6510
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006511bool PostCmdBeginRenderPass(
6512 VkCommandBuffer commandBuffer,
6513 VkSubpassContents contents)
6514{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006515
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006516 if(contents < VK_SUBPASS_CONTENTS_BEGIN_RANGE ||
6517 contents > VK_SUBPASS_CONTENTS_END_RANGE)
6518 {
6519 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6520 "vkCmdBeginRenderPass parameter, VkSubpassContents contents, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006521 return false;
6522 }
6523
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006524 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006525}
6526
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006527VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBeginRenderPass(
6528 VkCommandBuffer commandBuffer,
6529 const VkRenderPassBeginInfo* pRenderPassBegin,
6530 VkSubpassContents contents)
6531{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006532 PreCmdBeginRenderPass(commandBuffer, pRenderPassBegin);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006533
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006534 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006535
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006536 PostCmdBeginRenderPass(commandBuffer, contents);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006537}
6538
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006539bool PostCmdNextSubpass(
6540 VkCommandBuffer commandBuffer,
6541 VkSubpassContents contents)
6542{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006543
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006544 if(contents < VK_SUBPASS_CONTENTS_BEGIN_RANGE ||
6545 contents > VK_SUBPASS_CONTENTS_END_RANGE)
6546 {
6547 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6548 "vkCmdNextSubpass parameter, VkSubpassContents contents, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006549 return false;
Chia-I Wu08accc62015-07-07 11:50:03 +08006550 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006551
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006552 return true;
Chia-I Wu08accc62015-07-07 11:50:03 +08006553}
6554
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006555VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass(
6556 VkCommandBuffer commandBuffer,
6557 VkSubpassContents contents)
6558{
6559 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
Chia-I Wu08accc62015-07-07 11:50:03 +08006560
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006561 PostCmdNextSubpass(commandBuffer, contents);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006562}
6563
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006564bool PostCmdEndRenderPass(
6565 VkCommandBuffer commandBuffer)
6566{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006567
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006568 return true;
6569}
6570
6571VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass(
6572 VkCommandBuffer commandBuffer)
6573{
6574 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006575
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006576 PostCmdEndRenderPass(commandBuffer);
Chia-I Wu08accc62015-07-07 11:50:03 +08006577}
6578
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006579bool PreCmdExecuteCommands(
6580 VkCommandBuffer commandBuffer,
6581 const VkCommandBuffer* pCommandBuffers)
6582{
6583 if(pCommandBuffers != nullptr)
6584 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006585 }
6586
6587 return true;
6588}
6589
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006590bool PostCmdExecuteCommands(
6591 VkCommandBuffer commandBuffer,
6592 uint32_t commandBuffersCount)
6593{
6594
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006595
6596 return true;
6597}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006598
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006599VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdExecuteCommands(
6600 VkCommandBuffer commandBuffer,
6601 uint32_t commandBuffersCount,
6602 const VkCommandBuffer* pCommandBuffers)
6603{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006604 PreCmdExecuteCommands(commandBuffer, pCommandBuffers);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006605
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006606 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdExecuteCommands(commandBuffer, commandBuffersCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08006607
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006608 PostCmdExecuteCommands(commandBuffer, commandBuffersCount);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06006609}
6610
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006611VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char* funcName)
6612{
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07006613 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
6614
6615 if (validate_string(data, "vkGetDeviceProcAddr()", "funcName", funcName) == VK_TRUE) {
6616 return NULL;
6617 }
6618
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006619 if (!strcmp(funcName, "vkGetDeviceProcAddr"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006620 return (PFN_vkVoidFunction) vkGetDeviceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006621 if (!strcmp(funcName, "vkDestroyDevice"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006622 return (PFN_vkVoidFunction) vkDestroyDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006623 if (!strcmp(funcName, "vkGetDeviceQueue"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006624 return (PFN_vkVoidFunction) vkGetDeviceQueue;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006625 if (!strcmp(funcName, "vkQueueSubmit"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006626 return (PFN_vkVoidFunction) vkQueueSubmit;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006627 if (!strcmp(funcName, "vkQueueWaitIdle"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006628 return (PFN_vkVoidFunction) vkQueueWaitIdle;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006629 if (!strcmp(funcName, "vkDeviceWaitIdle"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006630 return (PFN_vkVoidFunction) vkDeviceWaitIdle;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006631 if (!strcmp(funcName, "vkAllocateMemory"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006632 return (PFN_vkVoidFunction) vkAllocateMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006633 if (!strcmp(funcName, "vkMapMemory"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006634 return (PFN_vkVoidFunction) vkMapMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006635 if (!strcmp(funcName, "vkFlushMappedMemoryRanges"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006636 return (PFN_vkVoidFunction) vkFlushMappedMemoryRanges;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006637 if (!strcmp(funcName, "vkInvalidateMappedMemoryRanges"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006638 return (PFN_vkVoidFunction) vkInvalidateMappedMemoryRanges;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006639 if (!strcmp(funcName, "vkCreateFence"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006640 return (PFN_vkVoidFunction) vkCreateFence;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006641 if (!strcmp(funcName, "vkResetFences"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006642 return (PFN_vkVoidFunction) vkResetFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006643 if (!strcmp(funcName, "vkGetFenceStatus"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006644 return (PFN_vkVoidFunction) vkGetFenceStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006645 if (!strcmp(funcName, "vkWaitForFences"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006646 return (PFN_vkVoidFunction) vkWaitForFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006647 if (!strcmp(funcName, "vkCreateSemaphore"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006648 return (PFN_vkVoidFunction) vkCreateSemaphore;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006649 if (!strcmp(funcName, "vkCreateEvent"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006650 return (PFN_vkVoidFunction) vkCreateEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006651 if (!strcmp(funcName, "vkGetEventStatus"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006652 return (PFN_vkVoidFunction) vkGetEventStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006653 if (!strcmp(funcName, "vkSetEvent"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006654 return (PFN_vkVoidFunction) vkSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006655 if (!strcmp(funcName, "vkResetEvent"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006656 return (PFN_vkVoidFunction) vkResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006657 if (!strcmp(funcName, "vkCreateQueryPool"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006658 return (PFN_vkVoidFunction) vkCreateQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006659 if (!strcmp(funcName, "vkGetQueryPoolResults"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006660 return (PFN_vkVoidFunction) vkGetQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006661 if (!strcmp(funcName, "vkCreateBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006662 return (PFN_vkVoidFunction) vkCreateBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006663 if (!strcmp(funcName, "vkCreateBufferView"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006664 return (PFN_vkVoidFunction) vkCreateBufferView;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006665 if (!strcmp(funcName, "vkCreateImage"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006666 return (PFN_vkVoidFunction) vkCreateImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006667 if (!strcmp(funcName, "vkGetImageSubresourceLayout"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006668 return (PFN_vkVoidFunction) vkGetImageSubresourceLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006669 if (!strcmp(funcName, "vkCreateImageView"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006670 return (PFN_vkVoidFunction) vkCreateImageView;
Michael Lentine03d8e572015-09-15 14:59:14 -05006671 if (!strcmp(funcName, "vkCreateShaderModule"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006672 return (PFN_vkVoidFunction) vkCreateShaderModule;
Jon Ashburnc669cc62015-07-09 15:02:25 -06006673 if (!strcmp(funcName, "vkCreateGraphicsPipelines"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006674 return (PFN_vkVoidFunction) vkCreateGraphicsPipelines;
Jon Ashburnc669cc62015-07-09 15:02:25 -06006675 if (!strcmp(funcName, "vkCreateComputePipelines"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006676 return (PFN_vkVoidFunction) vkCreateComputePipelines;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006677 if (!strcmp(funcName, "vkCreatePipelineLayout"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006678 return (PFN_vkVoidFunction) vkCreatePipelineLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006679 if (!strcmp(funcName, "vkCreateSampler"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006680 return (PFN_vkVoidFunction) vkCreateSampler;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006681 if (!strcmp(funcName, "vkCreateDescriptorSetLayout"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006682 return (PFN_vkVoidFunction) vkCreateDescriptorSetLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006683 if (!strcmp(funcName, "vkCreateDescriptorPool"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006684 return (PFN_vkVoidFunction) vkCreateDescriptorPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006685 if (!strcmp(funcName, "vkResetDescriptorPool"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006686 return (PFN_vkVoidFunction) vkResetDescriptorPool;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006687 if (!strcmp(funcName, "vkAllocateDescriptorSets"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006688 return (PFN_vkVoidFunction) vkAllocateDescriptorSets;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06006689 if (!strcmp(funcName, "vkCmdSetViewport"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006690 return (PFN_vkVoidFunction) vkCmdSetViewport;
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06006691 if (!strcmp(funcName, "vkCmdSetScissor"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006692 return (PFN_vkVoidFunction) vkCmdSetScissor;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06006693 if (!strcmp(funcName, "vkCmdSetLineWidth"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006694 return (PFN_vkVoidFunction) vkCmdSetLineWidth;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06006695 if (!strcmp(funcName, "vkCmdSetDepthBias"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006696 return (PFN_vkVoidFunction) vkCmdSetDepthBias;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06006697 if (!strcmp(funcName, "vkCmdSetBlendConstants"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006698 return (PFN_vkVoidFunction) vkCmdSetBlendConstants;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06006699 if (!strcmp(funcName, "vkCmdSetDepthBounds"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006700 return (PFN_vkVoidFunction) vkCmdSetDepthBounds;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06006701 if (!strcmp(funcName, "vkCmdSetStencilCompareMask"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006702 return (PFN_vkVoidFunction) vkCmdSetStencilCompareMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06006703 if (!strcmp(funcName, "vkCmdSetStencilWriteMask"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006704 return (PFN_vkVoidFunction) vkCmdSetStencilWriteMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06006705 if (!strcmp(funcName, "vkCmdSetStencilReference"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006706 return (PFN_vkVoidFunction) vkCmdSetStencilReference;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006707 if (!strcmp(funcName, "vkAllocateCommandBuffers"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006708 return (PFN_vkVoidFunction) vkAllocateCommandBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006709 if (!strcmp(funcName, "vkBeginCommandBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006710 return (PFN_vkVoidFunction) vkBeginCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006711 if (!strcmp(funcName, "vkEndCommandBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006712 return (PFN_vkVoidFunction) vkEndCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006713 if (!strcmp(funcName, "vkResetCommandBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006714 return (PFN_vkVoidFunction) vkResetCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006715 if (!strcmp(funcName, "vkCmdBindPipeline"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006716 return (PFN_vkVoidFunction) vkCmdBindPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006717 if (!strcmp(funcName, "vkCmdBindDescriptorSets"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006718 return (PFN_vkVoidFunction) vkCmdBindDescriptorSets;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006719 if (!strcmp(funcName, "vkCmdBindVertexBuffers"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006720 return (PFN_vkVoidFunction) vkCmdBindVertexBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006721 if (!strcmp(funcName, "vkCmdBindIndexBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006722 return (PFN_vkVoidFunction) vkCmdBindIndexBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006723 if (!strcmp(funcName, "vkCmdDraw"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006724 return (PFN_vkVoidFunction) vkCmdDraw;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006725 if (!strcmp(funcName, "vkCmdDrawIndexed"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006726 return (PFN_vkVoidFunction) vkCmdDrawIndexed;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006727 if (!strcmp(funcName, "vkCmdDrawIndirect"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006728 return (PFN_vkVoidFunction) vkCmdDrawIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006729 if (!strcmp(funcName, "vkCmdDrawIndexedIndirect"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006730 return (PFN_vkVoidFunction) vkCmdDrawIndexedIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006731 if (!strcmp(funcName, "vkCmdDispatch"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006732 return (PFN_vkVoidFunction) vkCmdDispatch;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006733 if (!strcmp(funcName, "vkCmdDispatchIndirect"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006734 return (PFN_vkVoidFunction) vkCmdDispatchIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006735 if (!strcmp(funcName, "vkCmdCopyBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006736 return (PFN_vkVoidFunction) vkCmdCopyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006737 if (!strcmp(funcName, "vkCmdCopyImage"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006738 return (PFN_vkVoidFunction) vkCmdCopyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006739 if (!strcmp(funcName, "vkCmdBlitImage"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006740 return (PFN_vkVoidFunction) vkCmdBlitImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006741 if (!strcmp(funcName, "vkCmdCopyBufferToImage"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006742 return (PFN_vkVoidFunction) vkCmdCopyBufferToImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006743 if (!strcmp(funcName, "vkCmdCopyImageToBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006744 return (PFN_vkVoidFunction) vkCmdCopyImageToBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006745 if (!strcmp(funcName, "vkCmdUpdateBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006746 return (PFN_vkVoidFunction) vkCmdUpdateBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006747 if (!strcmp(funcName, "vkCmdFillBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006748 return (PFN_vkVoidFunction) vkCmdFillBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006749 if (!strcmp(funcName, "vkCmdClearColorImage"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006750 return (PFN_vkVoidFunction) vkCmdClearColorImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006751 if (!strcmp(funcName, "vkCmdResolveImage"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006752 return (PFN_vkVoidFunction) vkCmdResolveImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006753 if (!strcmp(funcName, "vkCmdSetEvent"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006754 return (PFN_vkVoidFunction) vkCmdSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006755 if (!strcmp(funcName, "vkCmdResetEvent"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006756 return (PFN_vkVoidFunction) vkCmdResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006757 if (!strcmp(funcName, "vkCmdWaitEvents"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006758 return (PFN_vkVoidFunction) vkCmdWaitEvents;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006759 if (!strcmp(funcName, "vkCmdPipelineBarrier"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006760 return (PFN_vkVoidFunction) vkCmdPipelineBarrier;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006761 if (!strcmp(funcName, "vkCmdBeginQuery"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006762 return (PFN_vkVoidFunction) vkCmdBeginQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006763 if (!strcmp(funcName, "vkCmdEndQuery"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006764 return (PFN_vkVoidFunction) vkCmdEndQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006765 if (!strcmp(funcName, "vkCmdResetQueryPool"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006766 return (PFN_vkVoidFunction) vkCmdResetQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006767 if (!strcmp(funcName, "vkCmdWriteTimestamp"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006768 return (PFN_vkVoidFunction) vkCmdWriteTimestamp;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006769 if (!strcmp(funcName, "vkCmdCopyQueryPoolResults"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006770 return (PFN_vkVoidFunction) vkCmdCopyQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006771 if (!strcmp(funcName, "vkCreateFramebuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006772 return (PFN_vkVoidFunction) vkCreateFramebuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006773 if (!strcmp(funcName, "vkCreateRenderPass"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006774 return (PFN_vkVoidFunction) vkCreateRenderPass;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006775 if (!strcmp(funcName, "vkCmdBeginRenderPass"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006776 return (PFN_vkVoidFunction) vkCmdBeginRenderPass;
Chia-I Wu08accc62015-07-07 11:50:03 +08006777 if (!strcmp(funcName, "vkCmdNextSubpass"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006778 return (PFN_vkVoidFunction) vkCmdNextSubpass;
Jon Ashburneab34492015-06-01 09:37:38 -06006779
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006780 if (device == NULL) {
6781 return NULL;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006782 }
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006783
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006784 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006785 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006786 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006787}
6788
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006789VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char* funcName)
6790{
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006791 if (!strcmp(funcName, "vkGetInstanceProcAddr"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006792 return (PFN_vkVoidFunction) vkGetInstanceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006793 if (!strcmp(funcName, "vkCreateInstance"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006794 return (PFN_vkVoidFunction) vkCreateInstance;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006795 if (!strcmp(funcName, "vkDestroyInstance"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006796 return (PFN_vkVoidFunction) vkDestroyInstance;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006797 if (!strcmp(funcName, "vkCreateDevice"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006798 return (PFN_vkVoidFunction) vkCreateDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006799 if (!strcmp(funcName, "vkEnumeratePhysicalDevices"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006800 return (PFN_vkVoidFunction) vkEnumeratePhysicalDevices;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006801 if (!strcmp(funcName, "vkGetPhysicalDeviceProperties"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006802 return (PFN_vkVoidFunction) vkGetPhysicalDeviceProperties;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006803 if (!strcmp(funcName, "vkGetPhysicalDeviceFeatures"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006804 return (PFN_vkVoidFunction) vkGetPhysicalDeviceFeatures;
Courtney Goeltzenleuchter2caec862015-07-12 12:52:09 -06006805 if (!strcmp(funcName, "vkGetPhysicalDeviceFormatProperties"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006806 return (PFN_vkVoidFunction) vkGetPhysicalDeviceFormatProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06006807 if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006808 return (PFN_vkVoidFunction) vkEnumerateInstanceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06006809 if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006810 return (PFN_vkVoidFunction) vkEnumerateInstanceExtensionProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06006811 if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006812 return (PFN_vkVoidFunction) vkEnumerateDeviceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06006813 if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006814 return (PFN_vkVoidFunction) vkEnumerateDeviceExtensionProperties;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06006815
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006816 if (instance == NULL) {
6817 return NULL;
6818 }
6819
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006820 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07006821
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006822 PFN_vkVoidFunction fptr = debug_report_get_instance_proc_addr(data->report_data, funcName);
6823 if(fptr)
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06006824 return fptr;
6825
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006826 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006827 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006828 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06006829}