blob: 692723b951ada594454c0889aa644182990fc739 [file] [log] [blame]
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -07001/* Copyright (c) 2015-2016 The Khronos Group Inc.
2 * Copyright (c) 2015-2016 Valve Corporation
3 * Copyright (c) 2015-2016 LunarG, Inc.
4 * Copyright (C) 2015-2016 Google Inc.
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005 *
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -07006 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and/or associated documentation files (the "Materials"), to
8 * deal in the Materials without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Materials, and to permit persons to whom the Materials
11 * are furnished to do so, subject to the following conditions:
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060012 *
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070013 * The above copyright notice(s) and this permission notice shall be included
14 * in all copies or substantial portions of the Materials.
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060015 *
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070016 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060017 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070018 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19 *
20 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
21 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
22 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
23 * USE OR OTHER DEALINGS IN THE MATERIALS
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060024 *
25 * Author: Jeremy Hayes <jeremy@lunarg.com>
26 * Author: Tony Barbour <tony@LunarG.com>
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070027 * Author: Mark Lobodzinski <mark@LunarG.com>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060028 */
29
30#include <stdio.h>
31#include <stdlib.h>
32#include <string.h>
33
34#include <iostream>
35#include <string>
36#include <sstream>
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050037#include <unordered_map>
Michael Lentine157a2ec2016-01-27 11:25:05 -060038#include <unordered_set>
Jeremy Hayes99a96322015-06-26 12:48:09 -060039#include <vector>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060040
Tobin Ehlisb835d1b2015-07-03 10:34:49 -060041#include "vk_loader_platform.h"
David Pinedo9316d3b2015-11-06 12:54:48 -070042#include "vulkan/vk_layer.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060043#include "vk_layer_config.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060044#include "vk_enum_validate_helper.h"
45#include "vk_struct_validate_helper.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060046
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060047#include "vk_layer_table.h"
48#include "vk_layer_data.h"
49#include "vk_layer_logging.h"
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -060050#include "vk_layer_extension_utils.h"
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070051#include "vk_layer_utils.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060052
Cody Northrop55443ef2015-09-28 15:09:32 -060053struct layer_data {
Jeremy Hayes99a96322015-06-26 12:48:09 -060054 debug_report_data *report_data;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070055 std::vector<VkDebugReportCallbackEXT> logging_callback;
Cody Northrop55443ef2015-09-28 15:09:32 -060056
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070057 //TODO: Split instance/device structs
58 //Device Data
59 //Map for queue family index to queue count
Michael Lentinebdf744f2016-01-27 15:43:43 -060060 std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
61
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070062 layer_data() :
63 report_data(nullptr)
64 {};
Cody Northrop55443ef2015-09-28 15:09:32 -060065};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050066
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070067static std::unordered_map<void*, layer_data*> layer_data_map;
Jeremy Hayes99a96322015-06-26 12:48:09 -060068static device_table_map pc_device_table_map;
69static instance_table_map pc_instance_table_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060070
Jeremy Hayes99a96322015-06-26 12:48:09 -060071// "my instance data"
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070072debug_report_data *mid(VkInstance object)
73{
Jeremy Hayes99a96322015-06-26 12:48:09 -060074 dispatch_key key = get_dispatch_key(object);
Tobin Ehlisbfbac252015-09-01 11:46:36 -060075 layer_data *data = get_my_data_ptr(key, layer_data_map);
Jeremy Hayes99a96322015-06-26 12:48:09 -060076#if DISPATCH_MAP_DEBUG
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070077 fprintf(stderr, "MID: map: %p, object: %p, key: %p, data: %p\n", &layer_data_map, object, key, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -060078#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060079 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060080
81 return data->report_data;
82}
83
84// "my device data"
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070085debug_report_data *mdd(void* object)
86{
Jeremy Hayes99a96322015-06-26 12:48:09 -060087 dispatch_key key = get_dispatch_key(object);
88 layer_data *data = get_my_data_ptr(key, layer_data_map);
89#if DISPATCH_MAP_DEBUG
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070090 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 -060091#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060092 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060093 return data->report_data;
94}
95
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070096static void InitParamChecker(layer_data *data, const VkAllocationCallbacks *pAllocator)
97{
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070098 VkDebugReportCallbackEXT callback;
Jeremy Hayes99a96322015-06-26 12:48:09 -060099 uint32_t report_flags = getLayerOptionFlags("ParamCheckerReportFlags", 0);
100
101 uint32_t debug_action = 0;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700102 getLayerOptionEnum("ParamCheckerDebugAction", (uint32_t *) &debug_action);
103 if(debug_action & VK_DBG_LAYER_ACTION_LOG_MSG)
104 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600105 FILE *log_output = NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700106 const char* option_str = getLayerOption("ParamCheckerLogFilename");
Tobin Ehlisb1df55e2015-09-15 09:55:54 -0600107 log_output = getLayerLogOutput(option_str, "ParamChecker");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700108 VkDebugReportCallbackCreateInfoEXT dbgCreateInfo;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700109 memset(&dbgCreateInfo, 0, sizeof(dbgCreateInfo));
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700110 dbgCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700111 dbgCreateInfo.flags = report_flags;
112 dbgCreateInfo.pfnCallback = log_callback;
113 dbgCreateInfo.pUserData = log_output;
114
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700115 layer_create_msg_callback(data->report_data, &dbgCreateInfo, pAllocator, &callback);
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -0600116 data->logging_callback.push_back(callback);
117 }
118
119 if (debug_action & VK_DBG_LAYER_ACTION_DEBUG_OUTPUT) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700120 VkDebugReportCallbackCreateInfoEXT dbgCreateInfo;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700121 memset(&dbgCreateInfo, 0, sizeof(dbgCreateInfo));
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700122 dbgCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700123 dbgCreateInfo.flags = report_flags;
124 dbgCreateInfo.pfnCallback = win32_debug_output_msg;
125 dbgCreateInfo.pUserData = NULL;
126
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700127 layer_create_msg_callback(data->report_data, &dbgCreateInfo, pAllocator, &callback);
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -0600128 data->logging_callback.push_back(callback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600129 }
130}
131
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700132VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700133 VkInstance instance,
134 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700135 const VkAllocationCallbacks *pAllocator,
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700136 VkDebugReportCallbackEXT* pMsgCallback)
137{
138 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
139 VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600140
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700141 if (result == VK_SUCCESS)
142 {
143 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
144 result = layer_create_msg_callback(data->report_data, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600145 }
146
147 return result;
148}
149
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700150VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(
151 VkInstance instance,
152 VkDebugReportCallbackEXT msgCallback,
153 const VkAllocationCallbacks *pAllocator)
154{
155 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700156 pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600157
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700158 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700159 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600160}
161
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700162VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(
163 VkInstance instance,
164 VkDebugReportFlagsEXT flags,
165 VkDebugReportObjectTypeEXT objType,
166 uint64_t object,
167 size_t location,
168 int32_t msgCode,
169 const char* pLayerPrefix,
170 const char* pMsg)
171{
172 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
173 pTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700174}
175
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700176static const VkExtensionProperties instance_extensions[] = {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700177 {
178 VK_EXT_DEBUG_REPORT_EXTENSION_NAME,
179 VK_EXT_DEBUG_REPORT_SPEC_VERSION
180 }
181};
Tony Barbour59a47322015-06-24 16:06:58 -0600182
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700183VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(
184 const char *pLayerName,
185 uint32_t *pCount,
186 VkExtensionProperties* pProperties)
187{
188 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600189}
190
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700191static const VkLayerProperties pc_global_layers[] = {
192 {
193 "VK_LAYER_LUNARG_param_checker",
194 VK_API_VERSION,
Courtney Goeltzenleuchterf6ca21c2016-02-06 17:22:25 -0700195 1,
Courtney Goeltzenleuchtera4784fb2016-02-12 13:22:04 -0700196 "LunarG Validation Layer",
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700197 }
198};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700199
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700200VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(
201 uint32_t *pCount,
202 VkLayerProperties* pProperties)
203{
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -0600204 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers),
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700205 pc_global_layers,
206 pCount, pProperties);
Tony Barbour59a47322015-06-24 16:06:58 -0600207}
208
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700209VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(
210 VkPhysicalDevice physicalDevice,
211 const char* pLayerName,
212 uint32_t* pCount,
213 VkExtensionProperties* pProperties)
214{
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -0600215 /* ParamChecker does not have any physical device extensions */
Jon Ashburn751c4842015-11-02 17:37:20 -0700216 if (pLayerName == NULL) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700217 return get_dispatch_table(pc_instance_table_map, physicalDevice)->EnumerateDeviceExtensionProperties(
218 physicalDevice,
219 NULL,
220 pCount,
221 pProperties);
Jon Ashburn751c4842015-11-02 17:37:20 -0700222 } else {
223 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
224 }
Jeremy Hayesad367152015-04-17 10:36:53 -0600225}
226
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700227VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(
228 VkPhysicalDevice physicalDevice,
229 uint32_t* pCount,
230 VkLayerProperties* pProperties)
231{
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -0700232
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -0600233 /* ParamChecker's physical device layers are the same as global */
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700234 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers,
235 pCount, pProperties);
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -0600236}
Jeremy Hayes99a96322015-06-26 12:48:09 -0600237
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700238static
239std::string EnumeratorString(VkResult const& enumerator)
240{
241 switch(enumerator)
242 {
243 case VK_RESULT_MAX_ENUM:
244 {
245 return "VK_RESULT_MAX_ENUM";
246 break;
247 }
248 case VK_ERROR_LAYER_NOT_PRESENT:
249 {
250 return "VK_ERROR_LAYER_NOT_PRESENT";
251 break;
252 }
253 case VK_ERROR_INCOMPATIBLE_DRIVER:
254 {
255 return "VK_ERROR_INCOMPATIBLE_DRIVER";
256 break;
257 }
258 case VK_ERROR_MEMORY_MAP_FAILED:
259 {
260 return "VK_ERROR_MEMORY_MAP_FAILED";
261 break;
262 }
263 case VK_INCOMPLETE:
264 {
265 return "VK_INCOMPLETE";
266 break;
267 }
268 case VK_ERROR_OUT_OF_HOST_MEMORY:
269 {
270 return "VK_ERROR_OUT_OF_HOST_MEMORY";
271 break;
272 }
273 case VK_ERROR_INITIALIZATION_FAILED:
274 {
275 return "VK_ERROR_INITIALIZATION_FAILED";
276 break;
277 }
278 case VK_NOT_READY:
279 {
280 return "VK_NOT_READY";
281 break;
282 }
283 case VK_ERROR_OUT_OF_DEVICE_MEMORY:
284 {
285 return "VK_ERROR_OUT_OF_DEVICE_MEMORY";
286 break;
287 }
288 case VK_EVENT_SET:
289 {
290 return "VK_EVENT_SET";
291 break;
292 }
293 case VK_TIMEOUT:
294 {
295 return "VK_TIMEOUT";
296 break;
297 }
298 case VK_EVENT_RESET:
299 {
300 return "VK_EVENT_RESET";
301 break;
302 }
303 case VK_SUCCESS:
304 {
305 return "VK_SUCCESS";
306 break;
307 }
308 case VK_ERROR_EXTENSION_NOT_PRESENT:
309 {
310 return "VK_ERROR_EXTENSION_NOT_PRESENT";
311 break;
312 }
313 case VK_ERROR_DEVICE_LOST:
314 {
315 return "VK_ERROR_DEVICE_LOST";
316 break;
317 }
318 default:
319 {
320 return "unrecognized enumerator";
321 break;
322 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600323 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600324}
325
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700326static
327bool ValidateEnumerator(VkFormatFeatureFlagBits const& enumerator)
328{
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600329 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600330 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT |
331 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
332 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT |
333 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
334 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT |
335 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT |
336 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
337 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT |
338 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
Cody Northrop61d6dd62015-08-18 14:58:29 -0600339 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT |
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700340 VK_FORMAT_FEATURE_BLIT_SRC_BIT |
341 VK_FORMAT_FEATURE_BLIT_DST_BIT |
Jon Ashburn766866a2016-01-22 15:39:20 -0700342 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700343 if(enumerator & (~allFlags))
344 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600345 return false;
346 }
347
348 return true;
349}
350
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700351static
352std::string EnumeratorString(VkFormatFeatureFlagBits const& enumerator)
353{
354 if(!ValidateEnumerator(enumerator))
355 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600356 return "unrecognized enumerator";
357 }
358
359 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700360 if(enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT)
361 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600362 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
363 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700364 if(enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT)
365 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600366 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
367 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700368 if(enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT)
369 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600370 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
371 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700372 if(enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT)
373 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600374 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
375 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700376 if(enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)
377 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600378 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
379 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700380 if(enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT)
381 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600382 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
383 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700384 if(enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)
385 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600386 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
387 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700388 if(enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT)
389 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600390 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
391 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700392 if(enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT)
393 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600394 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
395 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700396 if(enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)
397 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600398 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
399 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700400 if(enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT)
401 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800402 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600403 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700404 if(enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT)
405 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800406 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600407 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700408 if(enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT)
409 {
Jon Ashburn766866a2016-01-22 15:39:20 -0700410 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
411 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600412
413 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700414 for(auto const& string : strings)
415 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600416 enumeratorString += string;
417
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700418 if(string != strings.back())
419 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600420 enumeratorString += '|';
421 }
422 }
423
424 return enumeratorString;
425}
426
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700427static
428bool ValidateEnumerator(VkImageUsageFlagBits const& enumerator)
429{
430 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT |
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600431 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700432 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
433 VK_IMAGE_USAGE_STORAGE_BIT |
434 VK_IMAGE_USAGE_SAMPLED_BIT |
435 VK_IMAGE_USAGE_TRANSFER_DST_BIT |
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600436 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT |
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800437 VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700438 if(enumerator & (~allFlags))
439 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600440 return false;
441 }
442
443 return true;
444}
445
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700446static
447std::string EnumeratorString(VkImageUsageFlagBits const& enumerator)
448{
449 if(!ValidateEnumerator(enumerator))
450 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600451 return "unrecognized enumerator";
452 }
453
454 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700455 if(enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT)
456 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600457 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
458 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700459 if(enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
460 {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600461 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600462 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700463 if(enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)
464 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600465 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
466 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700467 if(enumerator & VK_IMAGE_USAGE_STORAGE_BIT)
468 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600469 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
470 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700471 if(enumerator & VK_IMAGE_USAGE_SAMPLED_BIT)
472 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600473 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
474 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700475 if(enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT)
476 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800477 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600478 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700479 if(enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT)
480 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600481 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
482 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700483 if(enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT)
484 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800485 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600486 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600487
488 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700489 for(auto const& string : strings)
490 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600491 enumeratorString += string;
492
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700493 if(string != strings.back())
494 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600495 enumeratorString += '|';
496 }
497 }
498
499 return enumeratorString;
500}
501
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700502static
503bool ValidateEnumerator(VkQueueFlagBits const& enumerator)
504{
505 VkQueueFlagBits allFlags = (VkQueueFlagBits)(
506 VK_QUEUE_TRANSFER_BIT |
507 VK_QUEUE_COMPUTE_BIT |
508 VK_QUEUE_SPARSE_BINDING_BIT |
509 VK_QUEUE_GRAPHICS_BIT);
510 if(enumerator & (~allFlags))
511 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600512 return false;
513 }
514
515 return true;
516}
517
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700518static
519std::string EnumeratorString(VkQueueFlagBits const& enumerator)
520{
521 if(!ValidateEnumerator(enumerator))
522 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600523 return "unrecognized enumerator";
524 }
525
526 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700527 if(enumerator & VK_QUEUE_TRANSFER_BIT)
528 {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800529 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600530 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700531 if(enumerator & VK_QUEUE_COMPUTE_BIT)
532 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600533 strings.push_back("VK_QUEUE_COMPUTE_BIT");
534 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700535 if(enumerator & VK_QUEUE_SPARSE_BINDING_BIT)
536 {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800537 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600538 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700539 if(enumerator & VK_QUEUE_GRAPHICS_BIT)
540 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600541 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
542 }
543
544 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700545 for(auto const& string : strings)
546 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600547 enumeratorString += string;
548
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700549 if(string != strings.back())
550 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600551 enumeratorString += '|';
552 }
553 }
554
555 return enumeratorString;
556}
557
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700558static
559bool ValidateEnumerator(VkMemoryPropertyFlagBits const& enumerator)
560{
561 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT |
562 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT |
563 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
564 VK_MEMORY_PROPERTY_HOST_CACHED_BIT |
565 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
566 if(enumerator & (~allFlags))
567 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600568 return false;
569 }
570
571 return true;
572}
573
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700574static
575std::string EnumeratorString(VkMemoryPropertyFlagBits const& enumerator)
576{
577 if(!ValidateEnumerator(enumerator))
578 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600579 return "unrecognized enumerator";
580 }
581
582 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700583 if(enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT)
584 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600585 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
586 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700587 if(enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
588 {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800589 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600590 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700591 if(enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)
592 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600593 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
594 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700595 if(enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT)
596 {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800597 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600598 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700599 if(enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)
600 {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800601 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600602 }
603
604 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700605 for(auto const& string : strings)
606 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600607 enumeratorString += string;
608
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700609 if(string != strings.back())
610 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600611 enumeratorString += '|';
612 }
613 }
614
615 return enumeratorString;
616}
617
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700618static
619bool ValidateEnumerator(VkMemoryHeapFlagBits const& enumerator)
620{
621 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
622 if(enumerator & (~allFlags))
623 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600624 return false;
625 }
626
627 return true;
628}
629
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700630static
631std::string EnumeratorString(VkMemoryHeapFlagBits const& enumerator)
632{
633 if(!ValidateEnumerator(enumerator))
634 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600635 return "unrecognized enumerator";
636 }
637
638 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700639 if(enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT)
640 {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800641 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600642 }
643
644 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700645 for(auto const& string : strings)
646 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600647 enumeratorString += string;
648
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700649 if(string != strings.back())
650 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600651 enumeratorString += '|';
652 }
653 }
654
655 return enumeratorString;
656}
657
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700658static
659bool ValidateEnumerator(VkSparseImageFormatFlagBits const& enumerator)
660{
661 VkSparseImageFormatFlagBits allFlags = (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800662 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT |
663 VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700664 if(enumerator & (~allFlags))
665 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600666 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600667 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600668
669 return true;
670}
671
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700672static
673std::string EnumeratorString(VkSparseImageFormatFlagBits const& enumerator)
674{
675 if(!ValidateEnumerator(enumerator))
676 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600677 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600678 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600679
680 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700681 if(enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT)
682 {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800683 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600684 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700685 if(enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT)
686 {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800687 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600688 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700689 if(enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT)
690 {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800691 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600692 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600693
694 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700695 for(auto const& string : strings)
696 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600697 enumeratorString += string;
698
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700699 if(string != strings.back())
700 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600701 enumeratorString += '|';
702 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600703 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600704
705 return enumeratorString;
706}
707
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700708static
709bool ValidateEnumerator(VkFenceCreateFlagBits const& enumerator)
710{
711 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
712 if(enumerator & (~allFlags))
713 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600714 return false;
715 }
716
717 return true;
718}
719
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700720static
721std::string EnumeratorString(VkFenceCreateFlagBits const& enumerator)
722{
723 if(!ValidateEnumerator(enumerator))
724 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600725 return "unrecognized enumerator";
726 }
727
728 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700729 if(enumerator & VK_FENCE_CREATE_SIGNALED_BIT)
730 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600731 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
732 }
733
734 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700735 for(auto const& string : strings)
736 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600737 enumeratorString += string;
738
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700739 if(string != strings.back())
740 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600741 enumeratorString += '|';
742 }
743 }
744
745 return enumeratorString;
746}
747
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700748static
749bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const& enumerator)
750{
751 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600752 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
753 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT |
754 VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
755 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT |
756 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
757 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT |
758 VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
759 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
760 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
761 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700762 if(enumerator & (~allFlags))
763 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600764 return false;
765 }
766
767 return true;
768}
769
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700770static
771std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const& enumerator)
772{
773 if(!ValidateEnumerator(enumerator))
774 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600775 return "unrecognized enumerator";
776 }
777
778 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700779 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT)
780 {
781 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600782 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700783 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT)
784 {
785 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_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_PRIMITIVES_BIT)
788 {
789 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600790 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700791 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT)
792 {
793 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600794 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700795 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT)
796 {
797 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600798 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700799 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT)
800 {
801 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600802 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700803 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT)
804 {
805 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600806 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700807 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT)
808 {
809 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600810 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700811 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT)
812 {
813 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600814 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700815 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT)
816 {
817 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600818 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700819 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT)
820 {
821 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600822 }
823
824 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700825 for(auto const& string : strings)
826 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600827 enumeratorString += string;
828
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700829 if(string != strings.back())
830 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600831 enumeratorString += '|';
832 }
833 }
834
835 return enumeratorString;
836}
837
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700838static
839bool ValidateEnumerator(VkQueryResultFlagBits const& enumerator)
840{
841 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT |
842 VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
843 VK_QUERY_RESULT_WAIT_BIT |
844 VK_QUERY_RESULT_64_BIT);
845 if(enumerator & (~allFlags))
846 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600847 return false;
848 }
849
850 return true;
851}
852
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700853static
854std::string EnumeratorString(VkQueryResultFlagBits const& enumerator)
855{
856 if(!ValidateEnumerator(enumerator))
857 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600858 return "unrecognized enumerator";
859 }
860
861 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700862 if(enumerator & VK_QUERY_RESULT_PARTIAL_BIT)
863 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600864 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
865 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700866 if(enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT)
867 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600868 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
869 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700870 if(enumerator & VK_QUERY_RESULT_WAIT_BIT)
871 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600872 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
873 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700874 if(enumerator & VK_QUERY_RESULT_64_BIT)
875 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600876 strings.push_back("VK_QUERY_RESULT_64_BIT");
877 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600878
879 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700880 for(auto const& string : strings)
881 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600882 enumeratorString += string;
883
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700884 if(string != strings.back())
885 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600886 enumeratorString += '|';
887 }
888 }
889
890 return enumeratorString;
891}
892
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700893static
894bool ValidateEnumerator(VkBufferUsageFlagBits const& enumerator)
895{
896 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT |
897 VK_BUFFER_USAGE_INDEX_BUFFER_BIT |
Jeremy Hayes99a96322015-06-26 12:48:09 -0600898 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
899 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT |
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700900 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
901 VK_BUFFER_USAGE_TRANSFER_DST_BIT |
Jeremy Hayes99a96322015-06-26 12:48:09 -0600902 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT |
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700903 VK_BUFFER_USAGE_TRANSFER_SRC_BIT |
904 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
905 if(enumerator & (~allFlags))
906 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600907 return false;
908 }
909
910 return true;
911}
912
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700913static
914std::string EnumeratorString(VkBufferUsageFlagBits const& enumerator)
915{
916 if(!ValidateEnumerator(enumerator))
917 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600918 return "unrecognized enumerator";
919 }
920
921 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700922 if(enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT)
923 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600924 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
925 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700926 if(enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT)
927 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600928 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
929 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700930 if(enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT)
931 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600932 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
933 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700934 if(enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT)
935 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600936 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
937 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700938 if(enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)
939 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600940 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
941 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700942 if(enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT)
943 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800944 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600945 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700946 if(enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)
947 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600948 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
949 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700950 if(enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT)
951 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800952 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600953 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700954 if(enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)
955 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600956 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
957 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600958
959 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700960 for(auto const& string : strings)
961 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600962 enumeratorString += string;
963
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700964 if(string != strings.back())
965 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600966 enumeratorString += '|';
967 }
968 }
969
970 return enumeratorString;
971}
972
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700973static
974bool ValidateEnumerator(VkBufferCreateFlagBits const& enumerator)
975{
976 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(VK_BUFFER_CREATE_SPARSE_ALIASED_BIT |
977 VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT |
978 VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
979 if(enumerator & (~allFlags))
980 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600981 return false;
982 }
983
984 return true;
985}
986
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700987static
988std::string EnumeratorString(VkBufferCreateFlagBits const& enumerator)
989{
990 if(!ValidateEnumerator(enumerator))
991 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600992 return "unrecognized enumerator";
993 }
994
995 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700996 if(enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT)
997 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -0600998 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
999 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001000 if(enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT)
1001 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001002 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
1003 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001004 if(enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT)
1005 {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -06001006 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001007 }
1008
1009 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001010 for(auto const& string : strings)
1011 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001012 enumeratorString += string;
1013
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001014 if(string != strings.back())
1015 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001016 enumeratorString += '|';
1017 }
1018 }
1019
1020 return enumeratorString;
1021}
1022
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001023static
1024bool ValidateEnumerator(VkImageCreateFlagBits const& enumerator)
1025{
1026 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT |
1027 VK_IMAGE_CREATE_SPARSE_ALIASED_BIT |
1028 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
1029 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT |
1030 VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
1031 if(enumerator & (~allFlags))
1032 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001033 return false;
1034 }
1035
1036 return true;
1037}
1038
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001039static
1040std::string EnumeratorString(VkImageCreateFlagBits const& enumerator)
1041{
1042 if(!ValidateEnumerator(enumerator))
1043 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001044 return "unrecognized enumerator";
1045 }
1046
1047 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001048 if(enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT)
1049 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001050 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
1051 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001052 if(enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)
1053 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001054 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
1055 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001056 if(enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT)
1057 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001058 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
1059 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001060 if(enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT)
1061 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001062 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
1063 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001064 if(enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT)
1065 {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -06001066 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001067 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001068
1069 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001070 for(auto const& string : strings)
1071 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001072 enumeratorString += string;
1073
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001074 if(string != strings.back())
1075 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001076 enumeratorString += '|';
1077 }
1078 }
1079
1080 return enumeratorString;
1081}
1082
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001083static
1084bool ValidateEnumerator(VkColorComponentFlagBits const& enumerator)
1085{
1086 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT |
1087 VK_COLOR_COMPONENT_B_BIT |
1088 VK_COLOR_COMPONENT_G_BIT |
1089 VK_COLOR_COMPONENT_R_BIT);
1090 if(enumerator & (~allFlags))
1091 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001092 return false;
1093 }
1094
1095 return true;
1096}
1097
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001098static
1099std::string EnumeratorString(VkColorComponentFlagBits const& enumerator)
1100{
1101 if(!ValidateEnumerator(enumerator))
1102 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001103 return "unrecognized enumerator";
1104 }
1105
1106 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001107 if(enumerator & VK_COLOR_COMPONENT_A_BIT)
1108 {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001109 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001110 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001111 if(enumerator & VK_COLOR_COMPONENT_B_BIT)
1112 {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001113 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001114 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001115 if(enumerator & VK_COLOR_COMPONENT_G_BIT)
1116 {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001117 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001118 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001119 if(enumerator & VK_COLOR_COMPONENT_R_BIT)
1120 {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001121 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001122 }
1123
1124 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001125 for(auto const& string : strings)
1126 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001127 enumeratorString += string;
1128
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001129 if(string != strings.back())
1130 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001131 enumeratorString += '|';
1132 }
1133 }
1134
1135 return enumeratorString;
1136}
1137
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001138static
1139bool ValidateEnumerator(VkPipelineCreateFlagBits const& enumerator)
1140{
1141 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(VK_PIPELINE_CREATE_DERIVATIVE_BIT |
1142 VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT |
1143 VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
1144 if(enumerator & (~allFlags))
1145 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001146 return false;
1147 }
1148
1149 return true;
1150}
1151
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001152static
1153std::string EnumeratorString(VkPipelineCreateFlagBits const& enumerator)
1154{
1155 if(!ValidateEnumerator(enumerator))
1156 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001157 return "unrecognized enumerator";
1158 }
1159
1160 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001161 if(enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT)
1162 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001163 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
1164 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001165 if(enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT)
1166 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001167 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
1168 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001169 if(enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT)
1170 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001171 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001172 }
1173
1174 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001175 for(auto const& string : strings)
1176 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001177 enumeratorString += string;
1178
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001179 if(string != strings.back())
1180 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001181 enumeratorString += '|';
1182 }
1183 }
1184
1185 return enumeratorString;
1186}
1187
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001188static
1189bool ValidateEnumerator(VkShaderStageFlagBits const& enumerator)
1190{
1191 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(VK_SHADER_STAGE_ALL |
1192 VK_SHADER_STAGE_FRAGMENT_BIT |
1193 VK_SHADER_STAGE_GEOMETRY_BIT |
1194 VK_SHADER_STAGE_COMPUTE_BIT |
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -06001195 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT |
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001196 VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT |
1197 VK_SHADER_STAGE_VERTEX_BIT);
1198 if(enumerator & (~allFlags))
1199 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001200 return false;
1201 }
1202
1203 return true;
1204}
1205
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001206static
1207std::string EnumeratorString(VkShaderStageFlagBits const& enumerator)
1208{
1209 if(!ValidateEnumerator(enumerator))
1210 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001211 return "unrecognized enumerator";
1212 }
1213
1214 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001215 if(enumerator & VK_SHADER_STAGE_ALL)
1216 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001217 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001218 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001219 if(enumerator & VK_SHADER_STAGE_FRAGMENT_BIT)
1220 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001221 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001222 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001223 if(enumerator & VK_SHADER_STAGE_GEOMETRY_BIT)
1224 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001225 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
1226 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001227 if(enumerator & VK_SHADER_STAGE_COMPUTE_BIT)
1228 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001229 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
1230 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001231 if(enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT)
1232 {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -06001233 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001234 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001235 if(enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT)
1236 {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -06001237 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001238 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001239 if(enumerator & VK_SHADER_STAGE_VERTEX_BIT)
1240 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001241 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001242 }
1243
1244 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001245 for(auto const& string : strings)
1246 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001247 enumeratorString += string;
1248
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001249 if(string != strings.back())
1250 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001251 enumeratorString += '|';
1252 }
1253 }
1254
1255 return enumeratorString;
1256}
1257
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001258static
1259bool ValidateEnumerator(VkPipelineStageFlagBits const& enumerator)
1260{
Chia-I Wu89d0f942015-10-31 00:31:16 +08001261 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Chia-I Wu89d0f942015-10-31 00:31:16 +08001262 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT |
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001263 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT |
1264 VK_PIPELINE_STAGE_HOST_BIT |
1265 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT |
1266 VK_PIPELINE_STAGE_TRANSFER_BIT |
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001267 VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
Jon Ashburn4bf8ba42015-12-31 12:14:37 -07001268 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001269 VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
Jon Ashburn4bf8ba42015-12-31 12:14:37 -07001270 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
1271 VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT |
1272 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
1273 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT |
1274 VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
1275 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
1276 VK_PIPELINE_STAGE_VERTEX_INPUT_BIT |
1277 VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
1278 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001279 if(enumerator & (~allFlags))
1280 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001281 return false;
1282 }
1283
1284 return true;
1285}
1286
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001287static
1288std::string EnumeratorString(VkPipelineStageFlagBits const& enumerator)
1289{
1290 if(!ValidateEnumerator(enumerator))
1291 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001292 return "unrecognized enumerator";
1293 }
1294
1295 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001296 if(enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT)
1297 {
Chia-I Wu89d0f942015-10-31 00:31:16 +08001298 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
1299 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001300 if(enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT)
1301 {
Chia-I Wu89d0f942015-10-31 00:31:16 +08001302 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001303 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001304 if(enumerator & VK_PIPELINE_STAGE_HOST_BIT)
1305 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001306 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001307 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001308 if(enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT)
1309 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001310 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001311 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001312 if(enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT)
1313 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001314 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001315 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001316 if(enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
1317 {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -07001318 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001319 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001320 if(enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT)
1321 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001322 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001323 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001324 if(enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT)
1325 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001326 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001327 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001328 if(enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT)
1329 {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -06001330 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001331 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001332 if(enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT)
1333 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001334 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001335 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001336 if(enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT)
1337 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001338 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
1339 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001340 if(enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT)
1341 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001342 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
1343 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001344 if(enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT)
1345 {
1346 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001347 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001348 if(enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT)
1349 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001350 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
1351 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001352 if(enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT)
1353 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001354 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
1355 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001356 if(enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT)
1357 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001358 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
1359 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001360 if(enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT)
1361 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001362 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001363 }
1364
1365 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001366 for(auto const& string : strings)
1367 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001368 enumeratorString += string;
1369
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001370 if(string != strings.back())
1371 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001372 enumeratorString += '|';
1373 }
1374 }
1375
1376 return enumeratorString;
1377}
1378
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001379static
1380bool ValidateEnumerator(VkAccessFlagBits const& enumerator)
1381{
Chia-I Wua4594202015-10-27 19:54:37 +08001382 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001383 VK_ACCESS_INDIRECT_COMMAND_READ_BIT |
1384 VK_ACCESS_INDEX_READ_BIT |
1385 VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
1386 VK_ACCESS_UNIFORM_READ_BIT |
1387 VK_ACCESS_INPUT_ATTACHMENT_READ_BIT |
1388 VK_ACCESS_SHADER_READ_BIT |
1389 VK_ACCESS_SHADER_WRITE_BIT |
1390 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
1391 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
1392 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
1393 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
1394 VK_ACCESS_TRANSFER_READ_BIT |
1395 VK_ACCESS_TRANSFER_WRITE_BIT |
1396 VK_ACCESS_HOST_READ_BIT |
1397 VK_ACCESS_HOST_WRITE_BIT |
1398 VK_ACCESS_MEMORY_READ_BIT |
1399 VK_ACCESS_MEMORY_WRITE_BIT);
Chia-I Wua4594202015-10-27 19:54:37 +08001400
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001401 if(enumerator & (~allFlags))
1402 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001403 return false;
1404 }
1405
1406 return true;
1407}
1408
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001409static
1410std::string EnumeratorString(VkAccessFlagBits const& enumerator)
1411{
1412 if(!ValidateEnumerator(enumerator))
1413 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001414 return "unrecognized enumerator";
1415 }
1416
1417 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001418 if(enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT)
1419 {
Chia-I Wua4594202015-10-27 19:54:37 +08001420 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001421 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001422 if(enumerator & VK_ACCESS_INDEX_READ_BIT)
1423 {
Chia-I Wua4594202015-10-27 19:54:37 +08001424 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001425 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001426 if(enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT)
1427 {
Chia-I Wua4594202015-10-27 19:54:37 +08001428 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001429 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001430 if(enumerator & VK_ACCESS_UNIFORM_READ_BIT)
1431 {
Chia-I Wua4594202015-10-27 19:54:37 +08001432 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001433 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001434 if(enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT)
1435 {
Chia-I Wua4594202015-10-27 19:54:37 +08001436 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001437 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001438 if(enumerator & VK_ACCESS_SHADER_READ_BIT)
1439 {
Chia-I Wua4594202015-10-27 19:54:37 +08001440 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001441 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001442 if(enumerator & VK_ACCESS_SHADER_WRITE_BIT)
1443 {
Chia-I Wua4594202015-10-27 19:54:37 +08001444 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001445 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001446 if(enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT)
1447 {
Chia-I Wua4594202015-10-27 19:54:37 +08001448 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001449 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001450 if(enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT)
1451 {
Chia-I Wua4594202015-10-27 19:54:37 +08001452 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001453 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001454 if(enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT)
1455 {
Chia-I Wua4594202015-10-27 19:54:37 +08001456 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001457 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001458 if(enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT)
1459 {
Chia-I Wua4594202015-10-27 19:54:37 +08001460 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001461 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001462 if(enumerator & VK_ACCESS_TRANSFER_READ_BIT)
1463 {
Chia-I Wua4594202015-10-27 19:54:37 +08001464 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001465 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001466 if(enumerator & VK_ACCESS_TRANSFER_WRITE_BIT)
1467 {
Chia-I Wua4594202015-10-27 19:54:37 +08001468 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001469 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001470 if(enumerator & VK_ACCESS_HOST_READ_BIT)
1471 {
Chia-I Wua4594202015-10-27 19:54:37 +08001472 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001473 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001474 if(enumerator & VK_ACCESS_HOST_WRITE_BIT)
1475 {
Chia-I Wua4594202015-10-27 19:54:37 +08001476 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001477 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001478 if(enumerator & VK_ACCESS_MEMORY_READ_BIT)
1479 {
Chia-I Wua4594202015-10-27 19:54:37 +08001480 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001481 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001482 if(enumerator & VK_ACCESS_MEMORY_WRITE_BIT)
1483 {
Chia-I Wua4594202015-10-27 19:54:37 +08001484 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001485 }
1486
1487 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001488 for(auto const& string : strings)
1489 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001490 enumeratorString += string;
1491
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001492 if(string != strings.back())
1493 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001494 enumeratorString += '|';
1495 }
1496 }
1497
1498 return enumeratorString;
1499}
1500
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001501static
1502bool ValidateEnumerator(VkCommandPoolCreateFlagBits const& enumerator)
1503{
1504 VkCommandPoolCreateFlagBits allFlags = (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT |
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001505 VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001506 if(enumerator & (~allFlags))
1507 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001508 return false;
1509 }
1510
1511 return true;
1512}
1513
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001514static
1515std::string EnumeratorString(VkCommandPoolCreateFlagBits const& enumerator)
1516{
1517 if(!ValidateEnumerator(enumerator))
1518 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001519 return "unrecognized enumerator";
1520 }
1521
1522 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001523 if(enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT)
1524 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001525 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001526 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001527 if(enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT)
1528 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001529 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001530 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001531
1532 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001533 for(auto const& string : strings)
1534 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001535 enumeratorString += string;
1536
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001537 if(string != strings.back())
1538 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001539 enumeratorString += '|';
1540 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001541 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001542
1543 return enumeratorString;
1544}
1545
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001546static
1547bool ValidateEnumerator(VkCommandPoolResetFlagBits const& enumerator)
1548{
1549 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
1550 if(enumerator & (~allFlags))
1551 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001552 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001553 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001554
1555 return true;
1556}
1557
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001558static
1559std::string EnumeratorString(VkCommandPoolResetFlagBits const& enumerator)
1560{
1561 if(!ValidateEnumerator(enumerator))
1562 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001563 return "unrecognized enumerator";
1564 }
1565
1566 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001567 if(enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT)
1568 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001569 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001570 }
1571
1572 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001573 for(auto const& string : strings)
1574 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001575 enumeratorString += string;
1576
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001577 if(string != strings.back())
1578 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001579 enumeratorString += '|';
1580 }
1581 }
1582
1583 return enumeratorString;
1584}
1585
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001586static
1587bool ValidateEnumerator(VkCommandBufferUsageFlags const& enumerator)
1588{
1589 VkCommandBufferUsageFlags allFlags = (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001590 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1591 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001592 if(enumerator & (~allFlags))
1593 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001594 return false;
1595 }
1596
1597 return true;
1598}
1599
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001600static
1601std::string EnumeratorString(VkCommandBufferUsageFlags const& enumerator)
1602{
1603 if(!ValidateEnumerator(enumerator))
1604 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001605 return "unrecognized enumerator";
1606 }
1607
1608 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001609 if(enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT)
1610 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001611 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001612 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001613 if(enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT)
1614 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001615 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001616 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001617 if(enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT)
1618 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001619 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001620 }
1621
1622 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001623 for(auto const& string : strings)
1624 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001625 enumeratorString += string;
1626
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001627 if(string != strings.back())
1628 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001629 enumeratorString += '|';
1630 }
1631 }
1632
1633 return enumeratorString;
1634}
1635
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001636static
1637bool ValidateEnumerator(VkCommandBufferResetFlagBits const& enumerator)
1638{
1639 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
1640 if(enumerator & (~allFlags))
1641 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001642 return false;
1643 }
1644
1645 return true;
1646}
1647
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001648static
1649std::string EnumeratorString(VkCommandBufferResetFlagBits const& enumerator)
1650{
1651 if(!ValidateEnumerator(enumerator))
1652 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001653 return "unrecognized enumerator";
1654 }
1655
1656 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001657 if(enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT)
1658 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001659 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001660 }
1661
1662 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001663 for(auto const& string : strings)
1664 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001665 enumeratorString += string;
1666
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001667 if(string != strings.back())
1668 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001669 enumeratorString += '|';
1670 }
1671 }
1672
1673 return enumeratorString;
1674}
1675
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001676static
1677bool ValidateEnumerator(VkImageAspectFlagBits const& enumerator)
1678{
1679 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT |
1680 VK_IMAGE_ASPECT_STENCIL_BIT |
1681 VK_IMAGE_ASPECT_DEPTH_BIT |
1682 VK_IMAGE_ASPECT_COLOR_BIT);
1683 if(enumerator & (~allFlags))
1684 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001685 return false;
1686 }
1687
1688 return true;
1689}
1690
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001691static
1692std::string EnumeratorString(VkImageAspectFlagBits const& enumerator)
1693{
1694 if(!ValidateEnumerator(enumerator))
1695 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001696 return "unrecognized enumerator";
1697 }
1698
1699 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001700 if(enumerator & VK_IMAGE_ASPECT_METADATA_BIT)
1701 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001702 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1703 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001704 if(enumerator & VK_IMAGE_ASPECT_STENCIL_BIT)
1705 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001706 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1707 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001708 if(enumerator & VK_IMAGE_ASPECT_DEPTH_BIT)
1709 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001710 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1711 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001712 if(enumerator & VK_IMAGE_ASPECT_COLOR_BIT)
1713 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001714 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1715 }
1716
1717 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001718 for(auto const& string : strings)
1719 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001720 enumeratorString += string;
1721
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001722 if(string != strings.back())
1723 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001724 enumeratorString += '|';
1725 }
1726 }
1727
1728 return enumeratorString;
1729}
1730
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001731static
1732bool ValidateEnumerator(VkQueryControlFlagBits const& enumerator)
1733{
1734 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
1735 if(enumerator & (~allFlags))
1736 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001737 return false;
1738 }
1739
1740 return true;
1741}
1742
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001743static
1744std::string EnumeratorString(VkQueryControlFlagBits const& enumerator)
1745{
1746 if(!ValidateEnumerator(enumerator))
1747 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001748 return "unrecognized enumerator";
1749 }
1750
1751 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001752 if(enumerator & VK_QUERY_CONTROL_PRECISE_BIT)
1753 {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001754 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001755 }
1756
1757 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001758 for(auto const& string : strings)
1759 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001760 enumeratorString += string;
1761
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001762 if(string != strings.back())
1763 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001764 enumeratorString += '|';
1765 }
1766 }
1767
1768 return enumeratorString;
1769}
1770
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001771static const int MaxParamCheckerStringLength = 256;
1772
1773VkBool32 validate_string(layer_data *my_data, const char *apiName, const char *stringName, const char *validateString)
1774{
1775 VkBool32 skipCall = VK_FALSE;
1776
1777 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1778
1779 if (result == VK_STRING_ERROR_NONE) {
1780 return skipCall;
1781 } else if (result & VK_STRING_ERROR_LENGTH) {
1782 skipCall = log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1783 "%s: string %s exceeds max length %d", apiName, stringName, MaxParamCheckerStringLength);
1784 } else if (result & VK_STRING_ERROR_BAD_DATA) {
1785 skipCall = log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1786 "%s: string %s contains invalid characters or is badly formed", apiName, stringName);
1787 }
1788 return skipCall;
1789}
1790
1791
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001792VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(
1793 const VkInstanceCreateInfo* pCreateInfo,
1794 const VkAllocationCallbacks* pAllocator,
1795 VkInstance* pInstance)
1796{
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001797 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1798 VkBool32 skipCall = VK_FALSE;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001799
1800 if (skipCall == VK_FALSE) {
1801 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
1802 assert(chain_info->u.pLayerInfo);
1803 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1804 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance) fpGetInstanceProcAddr(NULL, "vkCreateInstance");
1805 if (fpCreateInstance == NULL) {
1806 return VK_ERROR_INITIALIZATION_FAILED;
1807 }
1808
1809 // Advance the link info for the next element on the chain
1810 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1811
1812 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
1813 if (result != VK_SUCCESS)
1814 return result;
1815
1816 layer_data *my_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1817 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
1818
1819 my_data->report_data = debug_report_create_instance(
1820 pTable,
1821 *pInstance,
1822 pCreateInfo->enabledExtensionCount,
1823 pCreateInfo->ppEnabledExtensionNames);
1824
1825 InitParamChecker(my_data, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001826 }
1827
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001828 // Ordinarily we'd check these before calling down the chain, but none of the layer
1829 // support is in place until now, if we survive we can report the issue now.
1830 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1831 if (pCreateInfo->pApplicationInfo) {
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001832 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1833 skipCall |= validate_string(my_device_data, "vkCreateInstance()", "VkInstanceCreateInfo->VkApplicationInfo->pApplicationName",
1834 pCreateInfo->pApplicationInfo->pApplicationName);
1835 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001836
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001837 if (pCreateInfo->pApplicationInfo->pEngineName) {
1838 skipCall |= validate_string(my_device_data, "vkCreateInstance()", "VkInstanceCreateInfo->VkApplicationInfo->pEngineName",
1839 pCreateInfo->pApplicationInfo->pEngineName);
1840 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001841 }
1842
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001843 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001844}
1845
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001846VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(
1847 VkInstance instance,
1848 const VkAllocationCallbacks* pAllocator)
1849{
Jeremy Hayes99a96322015-06-26 12:48:09 -06001850 // Grab the key before the instance is destroyed.
1851 dispatch_key key = get_dispatch_key(instance);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001852 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Chia-I Wuf7458c52015-10-26 21:10:41 +08001853 pTable->DestroyInstance(instance, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001854
1855 // Clean up logging callback, if any
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001856 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1857 while (my_data->logging_callback.size() > 0) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001858 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -07001859 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001860 my_data->logging_callback.pop_back();
Jeremy Hayes99a96322015-06-26 12:48:09 -06001861 }
1862
1863 layer_debug_report_destroy_instance(mid(instance));
1864 layer_data_map.erase(pTable);
1865
1866 pc_instance_table_map.erase(key);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001867}
1868
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001869bool PostEnumeratePhysicalDevices(
1870 VkInstance instance,
1871 uint32_t* pPhysicalDeviceCount,
1872 VkPhysicalDevice* pPhysicalDevices,
1873 VkResult result)
1874{
Jeremy Hayes99a96322015-06-26 12:48:09 -06001875
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001876 if(pPhysicalDeviceCount != nullptr)
1877 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001878 }
1879
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001880 if(pPhysicalDevices != nullptr)
1881 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001882 }
1883
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001884 if(result < VK_SUCCESS)
1885 {
1886 std::string reason = "vkEnumeratePhysicalDevices parameter, VkResult result, is " + EnumeratorString(result);
1887 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 -06001888 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001889 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001890
1891 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001892}
1893
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001894VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDevices(
1895 VkInstance instance,
1896 uint32_t* pPhysicalDeviceCount,
1897 VkPhysicalDevice* pPhysicalDevices)
1898{
1899 VkResult result = get_dispatch_table(pc_instance_table_map, instance)->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001900
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001901 PostEnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001902
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001903 return result;
1904}
1905
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001906bool PostGetPhysicalDeviceFeatures(
1907 VkPhysicalDevice physicalDevice,
1908 VkPhysicalDeviceFeatures* pFeatures)
1909{
Jeremy Hayes99a96322015-06-26 12:48:09 -06001910
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001911 if(pFeatures != nullptr)
1912 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001913 }
1914
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001915 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001916}
1917
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001918VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFeatures(
1919 VkPhysicalDevice physicalDevice,
1920 VkPhysicalDeviceFeatures* pFeatures)
1921{
1922 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001923
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06001924 PostGetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001925}
1926
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001927bool PostGetPhysicalDeviceFormatProperties(
1928 VkPhysicalDevice physicalDevice,
1929 VkFormat format,
1930 VkFormatProperties* pFormatProperties)
1931{
Jeremy Hayes99a96322015-06-26 12:48:09 -06001932
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001933 if(format < VK_FORMAT_BEGIN_RANGE ||
1934 format > VK_FORMAT_END_RANGE)
1935 {
1936 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1937 "vkGetPhysicalDeviceFormatProperties parameter, VkFormat format, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001938 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001939 }
1940
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001941 if(pFormatProperties != nullptr)
1942 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001943 }
1944
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001945 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001946}
1947
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001948VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFormatProperties(
1949 VkPhysicalDevice physicalDevice,
1950 VkFormat format,
1951 VkFormatProperties* pFormatProperties)
1952{
1953 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001954
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001955 PostGetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001956}
1957
1958bool PostGetPhysicalDeviceImageFormatProperties(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001959 VkPhysicalDevice physicalDevice,
1960 VkFormat format,
1961 VkImageType type,
1962 VkImageTiling tiling,
1963 VkImageUsageFlags usage,
1964 VkImageCreateFlags flags,
1965 VkImageFormatProperties* pImageFormatProperties,
1966 VkResult result)
1967{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001968
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001969 if(format < VK_FORMAT_BEGIN_RANGE ||
1970 format > VK_FORMAT_END_RANGE)
1971 {
1972 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1973 "vkGetPhysicalDeviceImageFormatProperties parameter, VkFormat format, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001974 return false;
1975 }
1976
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001977 if(type < VK_IMAGE_TYPE_BEGIN_RANGE ||
1978 type > VK_IMAGE_TYPE_END_RANGE)
1979 {
1980 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1981 "vkGetPhysicalDeviceImageFormatProperties parameter, VkImageType type, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001982 return false;
1983 }
1984
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001985 if(tiling < VK_IMAGE_TILING_BEGIN_RANGE ||
1986 tiling > VK_IMAGE_TILING_END_RANGE)
1987 {
1988 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1989 "vkGetPhysicalDeviceImageFormatProperties parameter, VkImageTiling tiling, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001990 return false;
1991 }
1992
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001993
1994 if(pImageFormatProperties != nullptr)
1995 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001996 }
1997
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001998 if(result < VK_SUCCESS)
1999 {
2000 std::string reason = "vkGetPhysicalDeviceImageFormatProperties parameter, VkResult result, is " + EnumeratorString(result);
2001 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 +08002002 return false;
2003 }
2004
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002005 return true;
2006}
2007
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002008VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceImageFormatProperties(
2009 VkPhysicalDevice physicalDevice,
2010 VkFormat format,
2011 VkImageType type,
2012 VkImageTiling tiling,
2013 VkImageUsageFlags usage,
2014 VkImageCreateFlags flags,
2015 VkImageFormatProperties* pImageFormatProperties)
2016{
2017 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 -06002018
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002019 PostGetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties, result);
Chia-I Wu17241042015-10-31 00:31:16 +08002020
2021 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002022}
2023
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002024bool PostGetPhysicalDeviceProperties(
2025 VkPhysicalDevice physicalDevice,
2026 VkPhysicalDeviceProperties* pProperties)
2027{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002028
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002029 if(pProperties != nullptr)
2030 {
2031 if(pProperties->deviceType < VK_PHYSICAL_DEVICE_TYPE_BEGIN_RANGE ||
2032 pProperties->deviceType > VK_PHYSICAL_DEVICE_TYPE_END_RANGE)
2033 {
2034 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2035 "vkGetPhysicalDeviceProperties parameter, VkPhysicalDeviceType pProperties->deviceType, is an unrecognized enumerator");
2036 return false;
2037 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002038
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002039 }
2040
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002041 return true;
2042}
2043
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002044VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceProperties(
2045 VkPhysicalDevice physicalDevice,
2046 VkPhysicalDeviceProperties* pProperties)
2047{
2048 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002049
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06002050 PostGetPhysicalDeviceProperties(physicalDevice, pProperties);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002051}
2052
Cody Northropd0802882015-08-03 17:04:53 -06002053bool PostGetPhysicalDeviceQueueFamilyProperties(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002054 VkPhysicalDevice physicalDevice,
2055 uint32_t* pCount,
2056 VkQueueFamilyProperties* pQueueProperties)
2057{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002058
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002059 if(pQueueProperties == nullptr && pCount != nullptr)
2060 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002061 }
2062
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002063 if(pQueueProperties != nullptr)
2064 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002065 }
2066
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002067 return true;
2068}
2069
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002070VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceQueueFamilyProperties(
2071 VkPhysicalDevice physicalDevice,
2072 uint32_t* pCount,
2073 VkQueueFamilyProperties* pQueueProperties)
2074{
2075 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pCount, pQueueProperties);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002076
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002077 PostGetPhysicalDeviceQueueFamilyProperties(physicalDevice, pCount, pQueueProperties);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002078}
2079
2080bool PostGetPhysicalDeviceMemoryProperties(
2081 VkPhysicalDevice physicalDevice,
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002082 VkPhysicalDeviceMemoryProperties* pMemoryProperties)
2083{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002084
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002085 if(pMemoryProperties != nullptr)
2086 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002087 }
2088
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002089 return true;
2090}
2091
Chia-I Wu9ab61502015-11-06 06:42:02 +08002092VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceMemoryProperties(
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002093 VkPhysicalDevice physicalDevice,
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002094 VkPhysicalDeviceMemoryProperties* pMemoryProperties)
2095{
2096 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002097
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06002098 PostGetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002099}
2100
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002101void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06002102 std::unordered_set<uint32_t> set;
2103 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
2104 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002105 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2106 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this structure.", i);
Michael Lentine157a2ec2016-01-27 11:25:05 -06002107 } else {
2108 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
2109 }
Michael Lentine26244832016-01-27 11:40:27 -06002110 if (pCreateInfo->pQueueCreateInfos[i].queueCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002111 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2112 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount, cannot be zero.", i);
Michael Lentinefa71bd52016-01-27 12:50:30 -06002113 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002114 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
Courtney Goeltzenleuchter3ce90b02016-01-29 15:43:49 -07002115 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities == nullptr) {
2116 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2117 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities, must not be NULL.", i);
2118 } else if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f || pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002119 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2120 "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 -06002121 }
Michael Lentine26244832016-01-27 11:40:27 -06002122 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002123 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
2124 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2125 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number of queue families.", i);
2126 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount > properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
2127 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2128 "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 -06002129 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06002130 }
2131}
2132
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002133void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo* pCreateInfo) {
2134 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Michael Lentinebdf744f2016-01-27 15:43:43 -06002135 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
2136 my_device_data->queueFamilyIndexMap.insert(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002137 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
Michael Lentinebdf744f2016-01-27 15:43:43 -06002138 }
2139}
2140
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002141VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(
2142 VkPhysicalDevice physicalDevice,
2143 const VkDeviceCreateInfo* pCreateInfo,
2144 const VkAllocationCallbacks* pAllocator,
2145 VkDevice* pDevice)
2146{
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06002147 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06002148 * NOTE: We do not validate physicalDevice or any dispatchable
2149 * object as the first parameter. We couldn't get here if it was wrong!
2150 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07002151
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002152 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2153 VkBool32 skipCall = VK_FALSE;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002154 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07002155
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002156 for (auto i = 0; i < pCreateInfo->enabledLayerCount; i++) {
2157 skipCall |= validate_string(my_instance_data, "vkCreateDevice()", "VkDeviceCreateInfo->ppEnabledLayerNames",
2158 pCreateInfo->ppEnabledLayerNames[i]);
2159 }
Michael Lentine774704f2016-01-27 13:36:46 -06002160
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002161 for (auto i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
2162 skipCall |= validate_string(my_instance_data, "vkCreateDevice()", "VkDeviceCreateInfo->ppEnabledExtensionNames",
2163 pCreateInfo->ppEnabledExtensionNames[i]);
2164 }
2165
2166 if (skipCall == VK_FALSE) {
2167 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
2168 assert(chain_info->u.pLayerInfo);
2169 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
2170 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
2171 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice) fpGetInstanceProcAddr(NULL, "vkCreateDevice");
2172 if (fpCreateDevice == NULL) {
2173 return VK_ERROR_INITIALIZATION_FAILED;
2174 }
2175
2176 // Advance the link info for the next element on the chain
2177 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
2178
2179 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
2180 if (result != VK_SUCCESS) {
2181 return result;
2182 }
2183
2184 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
2185 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
2186 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
2187
2188 uint32_t count;
2189 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
2190 std::vector<VkQueueFamilyProperties> properties(count);
2191 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
2192
2193 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
2194 storeCreateDeviceData(*pDevice, pCreateInfo);
2195 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06002196
Jeremy Hayes99a96322015-06-26 12:48:09 -06002197 return result;
2198}
2199
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002200VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(
2201 VkDevice device,
2202 const VkAllocationCallbacks* pAllocator)
2203{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002204 layer_debug_report_destroy_device(device);
2205
2206 dispatch_key key = get_dispatch_key(device);
2207#if DISPATCH_MAP_DEBUG
2208 fprintf(stderr, "Device: %p, key: %p\n", device, key);
2209#endif
2210
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002211 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002212 pc_device_table_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002213}
2214
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002215bool PreGetDeviceQueue(
2216 VkDevice device,
2217 uint32_t queueFamilyIndex,
2218 uint32_t queueIndex)
2219{
2220 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2221 auto queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06002222 if (queue_data == my_device_data->queueFamilyIndexMap.end()) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002223 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2224 "VkGetDeviceQueue parameter, uint32_t queueFamilyIndex %d, must have been given when the device was created.", queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06002225 return false;
2226 }
2227 if (queue_data->second <= queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002228 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2229 "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 -06002230 return false;
2231 }
2232 return true;
2233}
2234
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002235bool PostGetDeviceQueue(
2236 VkDevice device,
2237 uint32_t queueFamilyIndex,
2238 uint32_t queueIndex,
2239 VkQueue* pQueue)
2240{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002241
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002242
2243
2244 if(pQueue != nullptr)
2245 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002246 }
2247
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002248 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002249}
2250
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002251VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetDeviceQueue(
2252 VkDevice device,
2253 uint32_t queueFamilyIndex,
2254 uint32_t queueIndex,
2255 VkQueue* pQueue)
2256{
Michael Lentinebdf744f2016-01-27 15:43:43 -06002257 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
2258
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002259 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002260
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06002261 PostGetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002262}
2263
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002264bool PreQueueSubmit(
2265 VkQueue queue,
2266 const VkSubmitInfo* submit)
2267{
2268 if(submit->sType != VK_STRUCTURE_TYPE_SUBMIT_INFO) {
2269 log_msg(mdd(queue), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2270 "vkQueueSubmit parameter, VkStructureType pSubmits->sType, is an invalid enumerator");
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002271 return false;
2272 }
2273
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002274 if(submit->pCommandBuffers != nullptr)
2275 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002276 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002277
2278 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002279}
2280
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002281bool PostQueueSubmit(
2282 VkQueue queue,
2283 uint32_t commandBufferCount,
2284 VkFence fence,
2285 VkResult result)
2286{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002287
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002288
2289
2290 if(result < VK_SUCCESS)
2291 {
2292 std::string reason = "vkQueueSubmit parameter, VkResult result, is " + EnumeratorString(result);
2293 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 -06002294 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002295 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002296
2297 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002298}
2299
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002300VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueSubmit(
2301 VkQueue queue,
2302 uint32_t submitCount,
2303 const VkSubmitInfo* pSubmits,
2304 VkFence fence)
2305{
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002306 for (uint32_t i = 0; i < submitCount; i++) {
Chia-I Wu40cf0ae2015-10-26 17:20:32 +08002307 PreQueueSubmit(queue, &pSubmits[i]);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002308 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002309
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002310 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002311
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002312 PostQueueSubmit(queue, submitCount, fence, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002313
2314 return result;
2315}
2316
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002317bool PostQueueWaitIdle(
2318 VkQueue queue,
2319 VkResult result)
2320{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002321
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002322 if(result < VK_SUCCESS)
2323 {
2324 std::string reason = "vkQueueWaitIdle parameter, VkResult result, is " + EnumeratorString(result);
2325 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 -06002326 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002327 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002328
2329 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002330}
2331
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002332VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueWaitIdle(
2333 VkQueue queue)
2334{
2335 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002336
2337 PostQueueWaitIdle(queue, result);
2338
2339 return result;
2340}
2341
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002342bool PostDeviceWaitIdle(
2343 VkDevice device,
2344 VkResult result)
2345{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002346
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002347 if(result < VK_SUCCESS)
2348 {
2349 std::string reason = "vkDeviceWaitIdle parameter, VkResult result, is " + EnumeratorString(result);
2350 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 -06002351 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002352 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002353
2354 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002355}
2356
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002357VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkDeviceWaitIdle(
2358 VkDevice device)
2359{
2360 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002361
2362 PostDeviceWaitIdle(device, result);
2363
2364 return result;
2365}
2366
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002367bool PreAllocateMemory(
2368 VkDevice device,
2369 const VkMemoryAllocateInfo* pAllocateInfo)
2370{
2371 if(pAllocateInfo != nullptr)
2372 {
2373 if(pAllocateInfo->sType != VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO)
2374 {
2375 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2376 "vkAllocateMemory parameter, VkStructureType pAllocateInfo->sType, is an invalid enumerator");
2377 return false;
2378 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002379 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002380
2381 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002382}
2383
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002384bool PostAllocateMemory(
2385 VkDevice device,
2386 VkDeviceMemory* pMemory,
2387 VkResult result)
2388{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002389
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002390 if(pMemory != nullptr)
2391 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002392 }
2393
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002394 if(result < VK_SUCCESS)
2395 {
2396 std::string reason = "vkAllocateMemory parameter, VkResult result, is " + EnumeratorString(result);
2397 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 -06002398 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002399 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002400
2401 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002402}
2403
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002404VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateMemory(
2405 VkDevice device,
2406 const VkMemoryAllocateInfo* pAllocateInfo,
2407 const VkAllocationCallbacks* pAllocator,
2408 VkDeviceMemory* pMemory)
2409{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002410 PreAllocateMemory(device, pAllocateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002411
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002412 VkResult result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002413
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002414 PostAllocateMemory(device, pMemory, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002415
2416 return result;
2417}
2418
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002419bool PostMapMemory(
2420 VkDevice device,
2421 VkDeviceMemory mem,
2422 VkDeviceSize offset,
2423 VkDeviceSize size,
2424 VkMemoryMapFlags flags,
2425 void** ppData,
2426 VkResult result)
2427{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002428
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002429
2430
2431
2432
2433 if(ppData != nullptr)
2434 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002435 }
2436
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002437 if(result < VK_SUCCESS)
2438 {
2439 std::string reason = "vkMapMemory parameter, VkResult result, is " + EnumeratorString(result);
2440 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 -06002441 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002442 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002443
2444 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002445}
2446
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002447VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkMapMemory(
2448 VkDevice device,
2449 VkDeviceMemory mem,
2450 VkDeviceSize offset,
2451 VkDeviceSize size,
2452 VkMemoryMapFlags flags,
2453 void** ppData)
2454{
2455 VkResult result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, mem, offset, size, flags, ppData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002456
2457 PostMapMemory(device, mem, offset, size, flags, ppData, result);
2458
2459 return result;
2460}
2461
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002462bool PreFlushMappedMemoryRanges(
2463 VkDevice device,
2464 const VkMappedMemoryRange* pMemoryRanges)
2465{
2466 if(pMemoryRanges != nullptr)
2467 {
2468 if(pMemoryRanges->sType != VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE)
2469 {
2470 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2471 "vkFlushMappedMemoryRanges parameter, VkStructureType pMemoryRanges->sType, is an invalid enumerator");
2472 return false;
2473 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002474 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002475
2476 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002477}
2478
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002479bool PostFlushMappedMemoryRanges(
2480 VkDevice device,
2481 uint32_t memoryRangeCount,
2482 VkResult result)
2483{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002484
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002485
2486 if(result < VK_SUCCESS)
2487 {
2488 std::string reason = "vkFlushMappedMemoryRanges parameter, VkResult result, is " + EnumeratorString(result);
2489 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 -06002490 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002491 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002492
2493 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002494}
2495
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002496VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFlushMappedMemoryRanges(
2497 VkDevice device,
2498 uint32_t memoryRangeCount,
2499 const VkMappedMemoryRange* pMemoryRanges)
2500{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002501 PreFlushMappedMemoryRanges(device, pMemoryRanges);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002502
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002503 VkResult result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06002504
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002505 PostFlushMappedMemoryRanges(device, memoryRangeCount, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002506
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06002507 return result;
2508}
2509
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002510bool PreInvalidateMappedMemoryRanges(
2511 VkDevice device,
2512 const VkMappedMemoryRange* pMemoryRanges)
2513{
2514 if(pMemoryRanges != nullptr)
2515 {
2516 if(pMemoryRanges->sType != VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE)
2517 {
2518 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2519 "vkInvalidateMappedMemoryRanges parameter, VkStructureType pMemoryRanges->sType, is an invalid enumerator");
2520 return false;
2521 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002522 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002523
2524 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002525}
2526
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002527bool PostInvalidateMappedMemoryRanges(
2528 VkDevice device,
2529 uint32_t memoryRangeCount,
2530 VkResult result)
2531{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002532
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002533
2534 if(result < VK_SUCCESS)
2535 {
2536 std::string reason = "vkInvalidateMappedMemoryRanges parameter, VkResult result, is " + EnumeratorString(result);
2537 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 -06002538 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002539 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002540
2541 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002542}
2543
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002544VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkInvalidateMappedMemoryRanges(
2545 VkDevice device,
2546 uint32_t memoryRangeCount,
2547 const VkMappedMemoryRange* pMemoryRanges)
2548{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002549 PreInvalidateMappedMemoryRanges(device, pMemoryRanges);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002550
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002551 VkResult result = get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06002552
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002553 PostInvalidateMappedMemoryRanges(device, memoryRangeCount, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002554
Tony Barbourb1250542015-04-16 19:23:13 -06002555 return result;
2556}
2557
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002558bool PostGetDeviceMemoryCommitment(
2559 VkDevice device,
2560 VkDeviceMemory memory,
2561 VkDeviceSize* pCommittedMemoryInBytes)
2562{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002563
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002564
2565 if(pCommittedMemoryInBytes != nullptr)
2566 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002567 }
2568
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002569 return true;
2570}
2571
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002572VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetDeviceMemoryCommitment(
2573 VkDevice device,
2574 VkDeviceMemory memory,
2575 VkDeviceSize* pCommittedMemoryInBytes)
2576{
2577 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06002578
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06002579 PostGetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06002580}
2581
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002582bool PostBindBufferMemory(
2583 VkDevice device,
2584 VkBuffer buffer,
2585 VkDeviceMemory mem,
2586 VkDeviceSize memoryOffset,
2587 VkResult result)
2588{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002589
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002590
2591
2592
2593 if(result < VK_SUCCESS)
2594 {
2595 std::string reason = "vkBindBufferMemory parameter, VkResult result, is " + EnumeratorString(result);
2596 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 -06002597 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002598 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002599
2600 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002601}
2602
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002603VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindBufferMemory(
2604 VkDevice device,
2605 VkBuffer buffer,
2606 VkDeviceMemory mem,
2607 VkDeviceSize memoryOffset)
2608{
2609 VkResult result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, mem, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002610
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002611 PostBindBufferMemory(device, buffer, mem, memoryOffset, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002612
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002613 return result;
2614}
2615
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002616bool PostBindImageMemory(
2617 VkDevice device,
2618 VkImage image,
2619 VkDeviceMemory mem,
2620 VkDeviceSize memoryOffset,
2621 VkResult result)
2622{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002623
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002624
2625
2626
2627 if(result < VK_SUCCESS)
2628 {
2629 std::string reason = "vkBindImageMemory parameter, VkResult result, is " + EnumeratorString(result);
2630 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 -06002631 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002632 }
2633
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002634 return true;
2635}
2636
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002637VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindImageMemory(
2638 VkDevice device,
2639 VkImage image,
2640 VkDeviceMemory mem,
2641 VkDeviceSize memoryOffset)
2642{
2643 VkResult result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, mem, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002644
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002645 PostBindImageMemory(device, image, mem, memoryOffset, result);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002646
2647 return result;
2648}
2649
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002650bool PostGetBufferMemoryRequirements(
2651 VkDevice device,
2652 VkBuffer buffer,
2653 VkMemoryRequirements* pMemoryRequirements)
2654{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002655
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002656
2657 if(pMemoryRequirements != nullptr)
2658 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002659 }
2660
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002661 return true;
2662}
2663
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002664VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetBufferMemoryRequirements(
2665 VkDevice device,
2666 VkBuffer buffer,
2667 VkMemoryRequirements* pMemoryRequirements)
2668{
2669 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002670
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06002671 PostGetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002672}
2673
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002674bool PostGetImageMemoryRequirements(
2675 VkDevice device,
2676 VkImage image,
2677 VkMemoryRequirements* pMemoryRequirements)
2678{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002679
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002680
2681 if(pMemoryRequirements != nullptr)
2682 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002683 }
2684
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002685 return true;
2686}
2687
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002688VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetImageMemoryRequirements(
2689 VkDevice device,
2690 VkImage image,
2691 VkMemoryRequirements* pMemoryRequirements)
2692{
2693 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002694
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06002695 PostGetImageMemoryRequirements(device, image, pMemoryRequirements);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002696}
2697
2698bool PostGetImageSparseMemoryRequirements(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002699 VkDevice device,
2700 VkImage image,
2701 uint32_t* pNumRequirements,
2702 VkSparseImageMemoryRequirements* pSparseMemoryRequirements)
2703{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002704
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002705
2706 if(pNumRequirements != nullptr)
2707 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002708 }
2709
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002710 if(pSparseMemoryRequirements != nullptr)
2711 {
2712 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
2713 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
2714 {
2715 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2716 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
2717 return false;
2718 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002719 }
2720
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002721 return true;
2722}
2723
Chia-I Wu9ab61502015-11-06 06:42:02 +08002724VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetImageSparseMemoryRequirements(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002725 VkDevice device,
2726 VkImage image,
2727 uint32_t* pNumRequirements,
2728 VkSparseImageMemoryRequirements* pSparseMemoryRequirements)
2729{
2730 get_dispatch_table(pc_device_table_map, device)->GetImageSparseMemoryRequirements(device, image, pNumRequirements, pSparseMemoryRequirements);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002731
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002732 PostGetImageSparseMemoryRequirements(device, image, pNumRequirements, pSparseMemoryRequirements);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002733}
2734
2735bool PostGetPhysicalDeviceSparseImageFormatProperties(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002736 VkPhysicalDevice physicalDevice,
2737 VkFormat format,
2738 VkImageType type,
2739 VkSampleCountFlagBits samples,
2740 VkImageUsageFlags usage,
2741 VkImageTiling tiling,
2742 uint32_t* pNumProperties,
2743 VkSparseImageFormatProperties* pProperties)
2744{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002745
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002746 if(format < VK_FORMAT_BEGIN_RANGE ||
2747 format > VK_FORMAT_END_RANGE)
2748 {
2749 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2750 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkFormat format, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002751 return false;
2752 }
2753
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002754 if(type < VK_IMAGE_TYPE_BEGIN_RANGE ||
2755 type > VK_IMAGE_TYPE_END_RANGE)
2756 {
2757 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2758 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageType type, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002759 return false;
2760 }
2761
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002762
2763
2764 if(tiling < VK_IMAGE_TILING_BEGIN_RANGE ||
2765 tiling > VK_IMAGE_TILING_END_RANGE)
2766 {
2767 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2768 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageTiling tiling, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002769 return false;
2770 }
2771
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002772 if(pNumProperties != nullptr)
2773 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002774 }
2775
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002776 if(pProperties != nullptr)
2777 {
2778 if ((pProperties->aspectMask &
2779 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
2780 {
2781 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2782 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an unrecognized enumerator");
2783 return false;
2784 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002785 }
2786
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002787 return true;
2788}
2789
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002790VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceSparseImageFormatProperties(
2791 VkPhysicalDevice physicalDevice,
2792 VkFormat format,
2793 VkImageType type,
2794 VkSampleCountFlagBits samples,
2795 VkImageUsageFlags usage,
2796 VkImageTiling tiling,
2797 uint32_t* pNumProperties,
2798 VkSparseImageFormatProperties* pProperties)
2799{
2800 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pNumProperties, pProperties);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002801
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002802 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pNumProperties, pProperties);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002803}
2804
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002805bool PreQueueBindSparse(
2806 VkQueue queue,
2807 uint32_t bindInfoCount,
2808 const VkBindSparseInfo* pBindInfo)
2809{
2810 if(pBindInfo != nullptr)
2811 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002812 }
2813
2814 return true;
2815}
2816
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002817bool PostQueueBindSparse(
2818 VkQueue queue,
2819 uint32_t bindInfoCount,
2820 const VkBindSparseInfo* pBindInfo,
2821 VkFence fence,
2822 VkResult result)
2823{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002824
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002825
2826
2827 if(result < VK_SUCCESS)
2828 {
2829 std::string reason = "vkQueueBindSparse parameter, VkResult result, is " + EnumeratorString(result);
2830 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 -06002831 return false;
2832 }
2833
2834 return true;
2835}
2836
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002837VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueBindSparse(
2838 VkQueue queue,
2839 uint32_t bindInfoCount,
2840 const VkBindSparseInfo* pBindInfo,
2841 VkFence fence)
2842{
Chia-I Wu1ff4c3d2015-10-26 16:55:27 +08002843 PreQueueBindSparse(queue, bindInfoCount, pBindInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002844
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002845 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002846
Chia-I Wu1ff4c3d2015-10-26 16:55:27 +08002847 PostQueueBindSparse(queue, bindInfoCount, pBindInfo, fence, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002848
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002849 return result;
2850}
2851
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002852bool PreCreateFence(
2853 VkDevice device,
2854 const VkFenceCreateInfo* pCreateInfo)
2855{
2856 if(pCreateInfo != nullptr)
2857 {
2858 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_FENCE_CREATE_INFO)
2859 {
2860 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2861 "vkCreateFence parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
2862 return false;
2863 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002864 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002865
2866 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002867}
2868
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002869bool PostCreateFence(
2870 VkDevice device,
2871 VkFence* pFence,
2872 VkResult result)
2873{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002874
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002875 if(pFence != nullptr)
2876 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002877 }
2878
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002879 if(result < VK_SUCCESS)
2880 {
2881 std::string reason = "vkCreateFence parameter, VkResult result, is " + EnumeratorString(result);
2882 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 -06002883 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002884 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002885
2886 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002887}
2888
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002889VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateFence(
2890 VkDevice device,
2891 const VkFenceCreateInfo* pCreateInfo,
2892 const VkAllocationCallbacks* pAllocator,
2893 VkFence* pFence)
2894{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002895 PreCreateFence(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002896
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002897 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002898
2899 PostCreateFence(device, pFence, result);
2900
2901 return result;
2902}
2903
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002904bool PreResetFences(
2905 VkDevice device,
2906 const VkFence* pFences)
2907{
2908 if(pFences != nullptr)
2909 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002910 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002911
2912 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002913}
2914
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002915bool PostResetFences(
2916 VkDevice device,
2917 uint32_t fenceCount,
2918 VkResult result)
2919{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002920
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002921
2922 if(result < VK_SUCCESS)
2923 {
2924 std::string reason = "vkResetFences parameter, VkResult result, is " + EnumeratorString(result);
2925 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 -06002926 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002927 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002928
2929 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002930}
2931
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002932VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetFences(
2933 VkDevice device,
2934 uint32_t fenceCount,
2935 const VkFence* pFences)
2936{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002937 PreResetFences(device, pFences);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002938
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002939 VkResult result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002940
2941 PostResetFences(device, fenceCount, result);
2942
2943 return result;
2944}
2945
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002946bool PostGetFenceStatus(
2947 VkDevice device,
2948 VkFence fence,
2949 VkResult result)
2950{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002951
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002952
2953 if(result < VK_SUCCESS)
2954 {
2955 std::string reason = "vkGetFenceStatus parameter, VkResult result, is " + EnumeratorString(result);
2956 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 -06002957 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002958 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002959
2960 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002961}
2962
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002963VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceStatus(
2964 VkDevice device,
2965 VkFence fence)
2966{
2967 VkResult result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002968
2969 PostGetFenceStatus(device, fence, result);
2970
2971 return result;
2972}
2973
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002974bool PreWaitForFences(
2975 VkDevice device,
2976 const VkFence* pFences)
2977{
2978 if(pFences != nullptr)
2979 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002980 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002981
2982 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002983}
2984
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002985bool PostWaitForFences(
2986 VkDevice device,
2987 uint32_t fenceCount,
2988 VkBool32 waitAll,
2989 uint64_t timeout,
2990 VkResult result)
2991{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002992
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002993
2994
2995
2996 if(result < VK_SUCCESS)
2997 {
2998 std::string reason = "vkWaitForFences parameter, VkResult result, is " + EnumeratorString(result);
2999 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 -06003000 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003001 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003002
3003 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003004}
3005
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003006VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkWaitForFences(
3007 VkDevice device,
3008 uint32_t fenceCount,
3009 const VkFence* pFences,
3010 VkBool32 waitAll,
3011 uint64_t timeout)
3012{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003013 PreWaitForFences(device, pFences);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003014
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003015 VkResult result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003016
3017 PostWaitForFences(device, fenceCount, waitAll, timeout, result);
3018
3019 return result;
3020}
3021
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003022bool PreCreateSemaphore(
3023 VkDevice device,
3024 const VkSemaphoreCreateInfo* pCreateInfo)
3025{
3026 if(pCreateInfo != nullptr)
3027 {
3028 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO)
3029 {
3030 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3031 "vkCreateSemaphore parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
3032 return false;
3033 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003034 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003035
3036 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003037}
3038
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003039bool PostCreateSemaphore(
3040 VkDevice device,
3041 VkSemaphore* pSemaphore,
3042 VkResult result)
3043{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003044
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003045 if(pSemaphore != nullptr)
3046 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003047 }
3048
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003049 if(result < VK_SUCCESS)
3050 {
3051 std::string reason = "vkCreateSemaphore parameter, VkResult result, is " + EnumeratorString(result);
3052 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 -06003053 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003054 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003055
3056 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003057}
3058
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003059VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSemaphore(
3060 VkDevice device,
3061 const VkSemaphoreCreateInfo* pCreateInfo,
3062 const VkAllocationCallbacks* pAllocator,
3063 VkSemaphore* pSemaphore)
3064{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003065 PreCreateSemaphore(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003066
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003067 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003068
3069 PostCreateSemaphore(device, pSemaphore, result);
3070
3071 return result;
3072}
3073
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003074bool PreCreateEvent(
3075 VkDevice device,
3076 const VkEventCreateInfo* pCreateInfo)
3077{
3078 if(pCreateInfo != nullptr)
3079 {
3080 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_EVENT_CREATE_INFO)
3081 {
3082 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3083 "vkCreateEvent parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
3084 return false;
3085 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003086 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003087
3088 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003089}
3090
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003091bool PostCreateEvent(
3092 VkDevice device,
3093 VkEvent* pEvent,
3094 VkResult result)
3095{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003096
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003097 if(pEvent != nullptr)
3098 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003099 }
3100
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003101 if(result < VK_SUCCESS)
3102 {
3103 std::string reason = "vkCreateEvent parameter, VkResult result, is " + EnumeratorString(result);
3104 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 -06003105 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003106 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003107
3108 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003109}
3110
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003111VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateEvent(
3112 VkDevice device,
3113 const VkEventCreateInfo* pCreateInfo,
3114 const VkAllocationCallbacks* pAllocator,
3115 VkEvent* pEvent)
3116{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003117 PreCreateEvent(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003118
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003119 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003120
3121 PostCreateEvent(device, pEvent, result);
3122
3123 return result;
3124}
3125
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003126bool PostGetEventStatus(
3127 VkDevice device,
3128 VkEvent event,
3129 VkResult result)
3130{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003131
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003132
3133 if(result < VK_SUCCESS)
3134 {
3135 std::string reason = "vkGetEventStatus parameter, VkResult result, is " + EnumeratorString(result);
3136 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 -06003137 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003138 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003139
3140 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003141}
3142
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003143VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetEventStatus(
3144 VkDevice device,
3145 VkEvent event)
3146{
3147 VkResult result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003148
3149 PostGetEventStatus(device, event, result);
3150
3151 return result;
3152}
3153
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003154bool PostSetEvent(
3155 VkDevice device,
3156 VkEvent event,
3157 VkResult result)
3158{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003159
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003160
3161 if(result < VK_SUCCESS)
3162 {
3163 std::string reason = "vkSetEvent parameter, VkResult result, is " + EnumeratorString(result);
3164 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 -06003165 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003166 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003167
3168 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003169}
3170
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003171VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkSetEvent(
3172 VkDevice device,
3173 VkEvent event)
3174{
3175 VkResult result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003176
3177 PostSetEvent(device, event, result);
3178
3179 return result;
3180}
3181
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003182bool PostResetEvent(
3183 VkDevice device,
3184 VkEvent event,
3185 VkResult result)
3186{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003187
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003188
3189 if(result < VK_SUCCESS)
3190 {
3191 std::string reason = "vkResetEvent parameter, VkResult result, is " + EnumeratorString(result);
3192 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 -06003193 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003194 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003195
3196 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003197}
3198
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003199VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetEvent(
3200 VkDevice device,
3201 VkEvent event)
3202{
3203 VkResult result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003204
3205 PostResetEvent(device, event, result);
3206
3207 return result;
3208}
3209
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003210bool PreCreateQueryPool(
3211 VkDevice device,
3212 const VkQueryPoolCreateInfo* pCreateInfo)
3213{
3214 if(pCreateInfo != nullptr)
3215 {
3216 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO)
3217 {
3218 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3219 "vkCreateQueryPool parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
3220 return false;
3221 }
3222 if(pCreateInfo->queryType < VK_QUERY_TYPE_BEGIN_RANGE ||
3223 pCreateInfo->queryType > VK_QUERY_TYPE_END_RANGE)
3224 {
3225 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3226 "vkCreateQueryPool parameter, VkQueryType pCreateInfo->queryType, is an unrecognized enumerator");
3227 return false;
3228 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003229 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003230
3231 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003232}
3233
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003234bool PostCreateQueryPool(
3235 VkDevice device,
3236 VkQueryPool* pQueryPool,
3237 VkResult result)
3238{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003239
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003240 if(pQueryPool != nullptr)
3241 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003242 }
3243
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003244 if(result < VK_SUCCESS)
3245 {
3246 std::string reason = "vkCreateQueryPool parameter, VkResult result, is " + EnumeratorString(result);
3247 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 -06003248 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003249 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003250
3251 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003252}
3253
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003254VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateQueryPool(
3255 VkDevice device,
3256 const VkQueryPoolCreateInfo* pCreateInfo,
3257 const VkAllocationCallbacks* pAllocator,
3258 VkQueryPool* pQueryPool)
3259{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003260 PreCreateQueryPool(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003261
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003262 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003263
3264 PostCreateQueryPool(device, pQueryPool, result);
3265
3266 return result;
3267}
3268
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003269bool PostGetQueryPoolResults(
3270 VkDevice device,
3271 VkQueryPool queryPool,
3272 uint32_t firstQuery,
3273 uint32_t queryCount,
3274 size_t dataSize,
3275 void* pData,
3276 VkDeviceSize stride,
3277 VkQueryResultFlags flags,
3278 VkResult result)
3279{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003280
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003281
3282
3283
3284 if(pData != nullptr)
3285 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003286 }
3287
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003288
3289 if(result < VK_SUCCESS)
3290 {
3291 std::string reason = "vkGetQueryPoolResults parameter, VkResult result, is " + EnumeratorString(result);
3292 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 -06003293 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003294 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003295
3296 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003297}
3298
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003299VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetQueryPoolResults(
3300 VkDevice device,
3301 VkQueryPool queryPool,
3302 uint32_t firstQuery,
3303 uint32_t queryCount,
3304 size_t dataSize,
3305 void* pData,
3306 VkDeviceSize stride,
3307 VkQueryResultFlags flags)
3308{
3309 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 -06003310
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003311 PostGetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003312
3313 return result;
3314}
3315
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003316bool PreCreateBuffer(
3317 VkDevice device,
3318 const VkBufferCreateInfo* pCreateInfo)
3319{
3320 if(pCreateInfo != nullptr)
3321 {
3322 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO)
3323 {
3324 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3325 "vkCreateBuffer parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
3326 return false;
3327 }
3328 if(pCreateInfo->sharingMode < VK_SHARING_MODE_BEGIN_RANGE ||
3329 pCreateInfo->sharingMode > VK_SHARING_MODE_END_RANGE)
3330 {
3331 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3332 "vkCreateBuffer parameter, VkSharingMode pCreateInfo->sharingMode, is an unrecognized enumerator");
3333 return false;
3334 }
3335 if(pCreateInfo->pQueueFamilyIndices != nullptr)
3336 {
3337 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003338 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003339
3340 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003341}
3342
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003343bool PostCreateBuffer(
3344 VkDevice device,
3345 VkBuffer* pBuffer,
3346 VkResult result)
3347{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003348
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003349 if(pBuffer != nullptr)
3350 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003351 }
3352
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003353 if(result < VK_SUCCESS)
3354 {
3355 std::string reason = "vkCreateBuffer parameter, VkResult result, is " + EnumeratorString(result);
3356 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 -06003357 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003358 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003359
3360 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003361}
3362
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003363VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateBuffer(
3364 VkDevice device,
3365 const VkBufferCreateInfo* pCreateInfo,
3366 const VkAllocationCallbacks* pAllocator,
3367 VkBuffer* pBuffer)
3368{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003369 PreCreateBuffer(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003370
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003371 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003372
3373 PostCreateBuffer(device, pBuffer, result);
3374
3375 return result;
3376}
3377
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003378bool PreCreateBufferView(
3379 VkDevice device,
3380 const VkBufferViewCreateInfo* pCreateInfo)
3381{
3382 if(pCreateInfo != nullptr)
3383 {
3384 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO)
3385 {
3386 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3387 "vkCreateBufferView parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
3388 return false;
3389 }
3390 if(pCreateInfo->format < VK_FORMAT_BEGIN_RANGE ||
3391 pCreateInfo->format > VK_FORMAT_END_RANGE)
3392 {
3393 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3394 "vkCreateBufferView parameter, VkFormat pCreateInfo->format, is an unrecognized enumerator");
3395 return false;
3396 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003397 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003398
3399 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003400}
3401
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003402bool PostCreateBufferView(
3403 VkDevice device,
3404 VkBufferView* pView,
3405 VkResult result)
3406{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003407
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003408 if(pView != nullptr)
3409 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003410 }
3411
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003412 if(result < VK_SUCCESS)
3413 {
3414 std::string reason = "vkCreateBufferView parameter, VkResult result, is " + EnumeratorString(result);
3415 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 -06003416 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003417 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003418
3419 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003420}
3421
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003422VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateBufferView(
3423 VkDevice device,
3424 const VkBufferViewCreateInfo* pCreateInfo,
3425 const VkAllocationCallbacks* pAllocator,
3426 VkBufferView* pView)
3427{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003428 PreCreateBufferView(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003429
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003430 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003431
3432 PostCreateBufferView(device, pView, result);
3433
3434 return result;
3435}
3436
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003437bool PreCreateImage(
3438 VkDevice device,
3439 const VkImageCreateInfo* pCreateInfo)
3440{
3441 if(pCreateInfo != nullptr)
3442 {
3443 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO)
3444 {
3445 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3446 "vkCreateImage parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
3447 return false;
3448 }
3449 if(pCreateInfo->imageType < VK_IMAGE_TYPE_BEGIN_RANGE ||
3450 pCreateInfo->imageType > VK_IMAGE_TYPE_END_RANGE)
3451 {
3452 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3453 "vkCreateImage parameter, VkImageType pCreateInfo->imageType, is an unrecognized enumerator");
3454 return false;
3455 }
3456 if(pCreateInfo->format < VK_FORMAT_BEGIN_RANGE ||
3457 pCreateInfo->format > VK_FORMAT_END_RANGE)
3458 {
3459 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3460 "vkCreateImage parameter, VkFormat pCreateInfo->format, is an unrecognized enumerator");
3461 return false;
3462 }
3463 if(pCreateInfo->tiling < VK_IMAGE_TILING_BEGIN_RANGE ||
3464 pCreateInfo->tiling > VK_IMAGE_TILING_END_RANGE)
3465 {
3466 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3467 "vkCreateImage parameter, VkImageTiling pCreateInfo->tiling, is an unrecognized enumerator");
3468 return false;
3469 }
3470 if(pCreateInfo->sharingMode < VK_SHARING_MODE_BEGIN_RANGE ||
3471 pCreateInfo->sharingMode > VK_SHARING_MODE_END_RANGE)
3472 {
3473 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3474 "vkCreateImage parameter, VkSharingMode pCreateInfo->sharingMode, is an unrecognized enumerator");
3475 return false;
3476 }
3477 if(pCreateInfo->pQueueFamilyIndices != nullptr)
3478 {
3479 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003480 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003481
3482 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003483}
3484
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003485bool PostCreateImage(
3486 VkDevice device,
3487 VkImage* pImage,
3488 VkResult result)
3489{
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003490
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003491 if(pImage != nullptr)
3492 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003493 }
3494
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003495 if(result < VK_SUCCESS)
3496 {
3497 std::string reason = "vkCreateImage parameter, VkResult result, is " + EnumeratorString(result);
3498 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 -06003499 return false;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003500 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003501
3502 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003503}
3504
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003505VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImage(
3506 VkDevice device,
3507 const VkImageCreateInfo* pCreateInfo,
3508 const VkAllocationCallbacks* pAllocator,
3509 VkImage* pImage)
3510{
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003511 PreCreateImage(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003512
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003513 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003514
3515 PostCreateImage(device, pImage, result);
3516
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003517 return result;
3518}
3519
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003520bool PreGetImageSubresourceLayout(
3521 VkDevice device,
3522 const VkImageSubresource* pSubresource)
3523{
3524 if(pSubresource != nullptr)
3525 {
3526 if ((pSubresource->aspectMask &
3527 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
3528 {
3529 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3530 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
3531 return false;
3532 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003533 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003534
3535 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003536}
3537
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003538bool PostGetImageSubresourceLayout(
3539 VkDevice device,
3540 VkImage image,
3541 VkSubresourceLayout* pLayout)
3542{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003543
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003544
3545 if(pLayout != nullptr)
3546 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003547 }
3548
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003549 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003550}
3551
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003552VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetImageSubresourceLayout(
3553 VkDevice device,
3554 VkImage image,
3555 const VkImageSubresource* pSubresource,
3556 VkSubresourceLayout* pLayout)
3557{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003558 PreGetImageSubresourceLayout(device, pSubresource);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003559
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003560 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003561
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06003562 PostGetImageSubresourceLayout(device, image, pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003563}
3564
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003565bool PreCreateImageView(
3566 VkDevice device,
3567 const VkImageViewCreateInfo* pCreateInfo)
3568{
3569 if(pCreateInfo != nullptr)
3570 {
3571 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO)
3572 {
3573 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3574 "vkCreateImageView parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
3575 return false;
3576 }
3577 if(pCreateInfo->viewType < VK_IMAGE_VIEW_TYPE_BEGIN_RANGE ||
3578 pCreateInfo->viewType > VK_IMAGE_VIEW_TYPE_END_RANGE)
3579 {
3580 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3581 "vkCreateImageView parameter, VkImageViewType pCreateInfo->viewType, is an unrecognized enumerator");
3582 return false;
3583 }
3584 if(pCreateInfo->format < VK_FORMAT_BEGIN_RANGE ||
3585 pCreateInfo->format > VK_FORMAT_END_RANGE)
3586 {
3587 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3588 "vkCreateImageView parameter, VkFormat pCreateInfo->format, is an unrecognized enumerator");
3589 return false;
3590 }
3591 if(pCreateInfo->components.r < VK_COMPONENT_SWIZZLE_BEGIN_RANGE ||
3592 pCreateInfo->components.r > 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.r, is an unrecognized enumerator");
3596 return false;
3597 }
3598 if(pCreateInfo->components.g < VK_COMPONENT_SWIZZLE_BEGIN_RANGE ||
3599 pCreateInfo->components.g > 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.g, is an unrecognized enumerator");
3603 return false;
3604 }
3605 if(pCreateInfo->components.b < VK_COMPONENT_SWIZZLE_BEGIN_RANGE ||
3606 pCreateInfo->components.b > 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.b, is an unrecognized enumerator");
3610 return false;
3611 }
3612 if(pCreateInfo->components.a < VK_COMPONENT_SWIZZLE_BEGIN_RANGE ||
3613 pCreateInfo->components.a > VK_COMPONENT_SWIZZLE_END_RANGE)
3614 {
3615 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3616 "vkCreateImageView parameter, VkComponentSwizzle pCreateInfo->components.a, is an unrecognized enumerator");
3617 return false;
3618 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003619 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003620
3621 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003622}
3623
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003624bool PostCreateImageView(
3625 VkDevice device,
3626 VkImageView* pView,
3627 VkResult result)
3628{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003629
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003630 if(pView != nullptr)
3631 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003632 }
3633
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003634 if(result < VK_SUCCESS)
3635 {
3636 std::string reason = "vkCreateImageView parameter, VkResult result, is " + EnumeratorString(result);
3637 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 -06003638 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003639 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003640
3641 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003642}
3643
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003644VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImageView(
3645 VkDevice device,
3646 const VkImageViewCreateInfo* pCreateInfo,
3647 const VkAllocationCallbacks* pAllocator,
3648 VkImageView* pView)
3649{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003650 PreCreateImageView(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003651
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003652 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003653
3654 PostCreateImageView(device, pView, result);
3655
3656 return result;
3657}
3658
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003659bool PreCreateShaderModule(
3660 VkDevice device,
3661 const VkShaderModuleCreateInfo* pCreateInfo)
3662{
3663 if(pCreateInfo) {
3664 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO) {
3665 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3666 "vkCreateShaderModule parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
Michael Lentine03d8e572015-09-15 14:59:14 -05003667 return false;
3668 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003669 if(!pCreateInfo->pCode) {
3670 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3671 "vkCreateShaderModule paramter, void* pCreateInfo->pCode, is null");
Michael Lentine03d8e572015-09-15 14:59:14 -05003672 return false;
3673 }
3674 } else {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003675 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3676 "vkCreateShaderModule parameter, VkShaderModuleCreateInfo pCreateInfo, is null");
Michael Lentine03d8e572015-09-15 14:59:14 -05003677 return false;
3678 }
3679
3680 return true;
3681}
3682
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003683bool PostCreateShaderModule(
3684 VkDevice device,
3685 VkShaderModule* pShaderModule,
3686 VkResult result)
3687{
3688 if(result < VK_SUCCESS) {
3689 std::string reason = "vkCreateShaderModule parameter, VkResult result, is " + EnumeratorString(result);
3690 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 -05003691 return false;
3692 }
3693
3694 return true;
3695}
3696
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003697VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateShaderModule(
3698 VkDevice device,
3699 const VkShaderModuleCreateInfo* pCreateInfo,
3700 const VkAllocationCallbacks* pAllocator,
3701 VkShaderModule* pShaderModule)
3702{
Michael Lentine03d8e572015-09-15 14:59:14 -05003703 PreCreateShaderModule(device, pCreateInfo);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003704 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
Michael Lentine03d8e572015-09-15 14:59:14 -05003705 PostCreateShaderModule(device, pShaderModule, result);
3706 return result;
3707}
3708
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003709bool PreCreatePipelineCache(
3710 VkDevice device,
3711 const VkPipelineCacheCreateInfo* pCreateInfo)
3712{
3713 if(pCreateInfo != nullptr)
3714 {
3715 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO)
3716 {
3717 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3718 "vkCreatePipelineCache parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
3719 return false;
3720 }
3721 if(pCreateInfo->pInitialData != nullptr)
3722 {
3723 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003724 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003725
3726 return true;
3727}
3728
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003729bool PostCreatePipelineCache(
3730 VkDevice device,
3731 VkPipelineCache* pPipelineCache,
3732 VkResult result)
3733{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003734
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003735 if(pPipelineCache != nullptr)
3736 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003737 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003738
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003739 if(result < VK_SUCCESS)
3740 {
3741 std::string reason = "vkCreatePipelineCache parameter, VkResult result, is " + EnumeratorString(result);
3742 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 -06003743 return false;
3744 }
3745
3746 return true;
3747}
3748
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003749VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineCache(
3750 VkDevice device,
3751 const VkPipelineCacheCreateInfo* pCreateInfo,
3752 const VkAllocationCallbacks* pAllocator,
3753 VkPipelineCache* pPipelineCache)
3754{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003755 PreCreatePipelineCache(device, pCreateInfo);
3756
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003757 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003758
3759 PostCreatePipelineCache(device, pPipelineCache, result);
3760
3761 return result;
3762}
3763
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003764bool PostGetPipelineCacheData(
3765 VkDevice device,
3766 VkPipelineCache pipelineCache,
3767 size_t* pDataSize,
3768 void* pData,
3769 VkResult result)
3770{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003771
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003772
3773 if(pDataSize != nullptr)
3774 {
Chia-I Wub16facd2015-10-26 19:17:06 +08003775 }
3776
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003777 if(pData != nullptr)
3778 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003779 }
3780
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003781 if(result < VK_SUCCESS)
3782 {
3783 std::string reason = "vkGetPipelineCacheData parameter, VkResult result, is " + EnumeratorString(result);
3784 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 -06003785 return false;
3786 }
3787
3788 return true;
3789}
3790
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003791VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPipelineCacheData(
3792 VkDevice device,
3793 VkPipelineCache pipelineCache,
3794 size_t* pDataSize,
3795 void* pData)
3796{
3797 VkResult result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003798
Chia-I Wub16facd2015-10-26 19:17:06 +08003799 PostGetPipelineCacheData(device, pipelineCache, pDataSize, pData, result);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003800
3801 return result;
3802}
3803
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003804bool PreMergePipelineCaches(
3805 VkDevice device,
3806 const VkPipelineCache* pSrcCaches)
3807{
3808 if(pSrcCaches != nullptr)
3809 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003810 }
3811
3812 return true;
3813}
3814
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003815bool PostMergePipelineCaches(
3816 VkDevice device,
3817 VkPipelineCache dstCache,
3818 uint32_t srcCacheCount,
3819 VkResult result)
3820{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003821
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003822
3823
3824 if(result < VK_SUCCESS)
3825 {
3826 std::string reason = "vkMergePipelineCaches parameter, VkResult result, is " + EnumeratorString(result);
3827 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 -06003828 return false;
3829 }
3830
3831 return true;
3832}
3833
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003834VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkMergePipelineCaches(
3835 VkDevice device,
3836 VkPipelineCache dstCache,
3837 uint32_t srcCacheCount,
3838 const VkPipelineCache* pSrcCaches)
3839{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003840 PreMergePipelineCaches(device, pSrcCaches);
3841
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003842 VkResult result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003843
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003844 PostMergePipelineCaches(device, dstCache, srcCacheCount, result);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003845
3846 return result;
3847}
3848
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003849bool PreCreateGraphicsPipelines(
3850 VkDevice device,
3851 const VkGraphicsPipelineCreateInfo* pCreateInfos)
3852{
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07003853 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3854
3855 // TODO: Handle count
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003856 if(pCreateInfos != nullptr)
3857 {
3858 if(pCreateInfos->sType != VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO)
3859 {
3860 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3861 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->sType, is an invalid enumerator");
3862 return false;
3863 }
3864 if(pCreateInfos->pStages != nullptr)
3865 {
3866 if(pCreateInfos->pStages->sType != VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO)
3867 {
3868 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3869 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pStages->sType, is an invalid enumerator");
3870 return false;
3871 }
3872 if(pCreateInfos->pStages->pSpecializationInfo != nullptr)
3873 {
3874 if(pCreateInfos->pStages->pSpecializationInfo->pMapEntries != nullptr)
3875 {
3876 }
3877 if(pCreateInfos->pStages->pSpecializationInfo->pData != nullptr)
3878 {
3879 }
3880 }
3881 }
3882 if(pCreateInfos->pVertexInputState != nullptr)
3883 {
3884 if(pCreateInfos->pVertexInputState->sType != VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO)
3885 {
3886 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3887 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pVertexInputState->sType, is an invalid enumerator");
3888 return false;
3889 }
3890 if(pCreateInfos->pVertexInputState->pVertexBindingDescriptions != nullptr)
3891 {
3892 if(pCreateInfos->pVertexInputState->pVertexBindingDescriptions->inputRate < VK_VERTEX_INPUT_RATE_BEGIN_RANGE ||
3893 pCreateInfos->pVertexInputState->pVertexBindingDescriptions->inputRate > VK_VERTEX_INPUT_RATE_END_RANGE)
3894 {
3895 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3896 "vkCreateGraphicsPipelines parameter, VkVertexInputRate pCreateInfos->pVertexInputState->pVertexBindingDescriptions->inputRate, is an unrecognized enumerator");
3897 return false;
3898 }
3899 }
3900 if(pCreateInfos->pVertexInputState->pVertexAttributeDescriptions != nullptr)
3901 {
3902 if(pCreateInfos->pVertexInputState->pVertexAttributeDescriptions->format < VK_FORMAT_BEGIN_RANGE ||
3903 pCreateInfos->pVertexInputState->pVertexAttributeDescriptions->format > VK_FORMAT_END_RANGE)
3904 {
3905 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3906 "vkCreateGraphicsPipelines parameter, VkFormat pCreateInfos->pVertexInputState->pVertexAttributeDescriptions->format, is an unrecognized enumerator");
3907 return false;
3908 }
3909 }
3910 }
3911 if(pCreateInfos->pInputAssemblyState != nullptr)
3912 {
3913 if(pCreateInfos->pInputAssemblyState->sType != VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO)
3914 {
3915 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3916 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pInputAssemblyState->sType, is an invalid enumerator");
3917 return false;
3918 }
3919 if(pCreateInfos->pInputAssemblyState->topology < VK_PRIMITIVE_TOPOLOGY_BEGIN_RANGE ||
3920 pCreateInfos->pInputAssemblyState->topology > VK_PRIMITIVE_TOPOLOGY_END_RANGE)
3921 {
3922 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3923 "vkCreateGraphicsPipelines parameter, VkPrimitiveTopology pCreateInfos->pInputAssemblyState->topology, is an unrecognized enumerator");
3924 return false;
3925 }
3926 }
3927 if(pCreateInfos->pTessellationState != nullptr)
3928 {
3929 if(pCreateInfos->pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO)
3930 {
3931 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3932 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pTessellationState->sType, is an invalid enumerator");
3933 return false;
3934 }
3935 }
3936 if(pCreateInfos->pViewportState != nullptr)
3937 {
3938 if(pCreateInfos->pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO)
3939 {
3940 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3941 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pViewportState->sType, is an invalid enumerator");
3942 return false;
3943 }
3944 }
3945 if(pCreateInfos->pRasterizationState != nullptr)
3946 {
3947 if(pCreateInfos->pRasterizationState->sType != VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO)
3948 {
3949 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3950 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pRasterizationState->sType, is an invalid enumerator");
3951 return false;
3952 }
3953 if(pCreateInfos->pRasterizationState->polygonMode < VK_POLYGON_MODE_BEGIN_RANGE ||
3954 pCreateInfos->pRasterizationState->polygonMode > VK_POLYGON_MODE_END_RANGE)
3955 {
3956 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3957 "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode, is an unrecognized enumerator");
3958 return false;
3959 }
3960 if(pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK)
3961 {
3962 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3963 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an unrecognized enumerator");
3964 return false;
3965 }
3966 if(pCreateInfos->pRasterizationState->frontFace < VK_FRONT_FACE_BEGIN_RANGE ||
3967 pCreateInfos->pRasterizationState->frontFace > VK_FRONT_FACE_END_RANGE)
3968 {
3969 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3970 "vkCreateGraphicsPipelines parameter, VkFrontFace pCreateInfos->pRasterizationState->frontFace, is an unrecognized enumerator");
3971 return false;
3972 }
3973 }
3974 if(pCreateInfos->pMultisampleState != nullptr)
3975 {
3976 if(pCreateInfos->pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO)
3977 {
3978 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3979 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pMultisampleState->sType, is an invalid enumerator");
3980 return false;
3981 }
3982 }
3983 if(pCreateInfos->pDepthStencilState != nullptr)
3984 {
3985 if(pCreateInfos->pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO)
3986 {
3987 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3988 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pDepthStencilState->sType, is an invalid enumerator");
3989 return false;
3990 }
3991 if(pCreateInfos->pDepthStencilState->depthCompareOp < VK_COMPARE_OP_BEGIN_RANGE ||
3992 pCreateInfos->pDepthStencilState->depthCompareOp > VK_COMPARE_OP_END_RANGE)
3993 {
3994 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3995 "vkCreateGraphicsPipelines parameter, VkCompareOp pCreateInfos->pDepthStencilState->depthCompareOp, is an unrecognized enumerator");
3996 return false;
3997 }
3998 if(pCreateInfos->pDepthStencilState->front.failOp < VK_STENCIL_OP_BEGIN_RANGE ||
3999 pCreateInfos->pDepthStencilState->front.failOp > 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.failOp, is an unrecognized enumerator");
4003 return false;
4004 }
4005 if(pCreateInfos->pDepthStencilState->front.passOp < VK_STENCIL_OP_BEGIN_RANGE ||
4006 pCreateInfos->pDepthStencilState->front.passOp > 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.passOp, is an unrecognized enumerator");
4010 return false;
4011 }
4012 if(pCreateInfos->pDepthStencilState->front.depthFailOp < VK_STENCIL_OP_BEGIN_RANGE ||
4013 pCreateInfos->pDepthStencilState->front.depthFailOp > VK_STENCIL_OP_END_RANGE)
4014 {
4015 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4016 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->front.depthFailOp, is an unrecognized enumerator");
4017 return false;
4018 }
4019 if(pCreateInfos->pDepthStencilState->front.compareOp < VK_COMPARE_OP_BEGIN_RANGE ||
4020 pCreateInfos->pDepthStencilState->front.compareOp > VK_COMPARE_OP_END_RANGE)
4021 {
4022 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4023 "vkCreateGraphicsPipelines parameter, VkCompareOp pCreateInfos->pDepthStencilState->front.compareOp, is an unrecognized enumerator");
4024 return false;
4025 }
4026 if(pCreateInfos->pDepthStencilState->back.failOp < VK_STENCIL_OP_BEGIN_RANGE ||
4027 pCreateInfos->pDepthStencilState->back.failOp > 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.failOp, is an unrecognized enumerator");
4031 return false;
4032 }
4033 if(pCreateInfos->pDepthStencilState->back.passOp < VK_STENCIL_OP_BEGIN_RANGE ||
4034 pCreateInfos->pDepthStencilState->back.passOp > 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.passOp, is an unrecognized enumerator");
4038 return false;
4039 }
4040 if(pCreateInfos->pDepthStencilState->back.depthFailOp < VK_STENCIL_OP_BEGIN_RANGE ||
4041 pCreateInfos->pDepthStencilState->back.depthFailOp > VK_STENCIL_OP_END_RANGE)
4042 {
4043 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4044 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->back.depthFailOp, is an unrecognized enumerator");
4045 return false;
4046 }
4047 if(pCreateInfos->pDepthStencilState->back.compareOp < VK_COMPARE_OP_BEGIN_RANGE ||
4048 pCreateInfos->pDepthStencilState->back.compareOp > VK_COMPARE_OP_END_RANGE)
4049 {
4050 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4051 "vkCreateGraphicsPipelines parameter, VkCompareOp pCreateInfos->pDepthStencilState->back.compareOp, is an unrecognized enumerator");
4052 return false;
4053 }
4054 }
4055 if(pCreateInfos->pColorBlendState != nullptr)
4056 {
4057 if(pCreateInfos->pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO)
4058 {
4059 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4060 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pColorBlendState->sType, is an invalid enumerator");
4061 return false;
4062 }
Michael Lentine0a369f62016-02-03 16:51:46 -06004063 if (pCreateInfos->pColorBlendState->logicOpEnable == VK_TRUE &&
4064 (pCreateInfos->pColorBlendState->logicOp < VK_LOGIC_OP_BEGIN_RANGE ||
4065 pCreateInfos->pColorBlendState->logicOp > VK_LOGIC_OP_END_RANGE)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004066 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4067 "vkCreateGraphicsPipelines parameter, VkLogicOp pCreateInfos->pColorBlendState->logicOp, is an unrecognized enumerator");
4068 return false;
4069 }
4070 if(pCreateInfos->pColorBlendState->pAttachments != nullptr && pCreateInfos->pColorBlendState->pAttachments->blendEnable == VK_TRUE)
4071 {
4072 if(pCreateInfos->pColorBlendState->pAttachments->srcColorBlendFactor < VK_BLEND_FACTOR_BEGIN_RANGE ||
4073 pCreateInfos->pColorBlendState->pAttachments->srcColorBlendFactor > 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->srcColorBlendFactor, is an unrecognized enumerator");
4077 return false;
4078 }
4079 if(pCreateInfos->pColorBlendState->pAttachments->dstColorBlendFactor < VK_BLEND_FACTOR_BEGIN_RANGE ||
4080 pCreateInfos->pColorBlendState->pAttachments->dstColorBlendFactor > VK_BLEND_FACTOR_END_RANGE)
4081 {
4082 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4083 "vkCreateGraphicsPipelines parameter, VkBlendFactor pCreateInfos->pColorBlendState->pAttachments->dstColorBlendFactor, is an unrecognized enumerator");
4084 return false;
4085 }
4086 if(pCreateInfos->pColorBlendState->pAttachments->colorBlendOp < VK_BLEND_OP_BEGIN_RANGE ||
4087 pCreateInfos->pColorBlendState->pAttachments->colorBlendOp > VK_BLEND_OP_END_RANGE)
4088 {
4089 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4090 "vkCreateGraphicsPipelines parameter, VkBlendOp pCreateInfos->pColorBlendState->pAttachments->colorBlendOp, is an unrecognized enumerator");
4091 return false;
4092 }
4093 if(pCreateInfos->pColorBlendState->pAttachments->srcAlphaBlendFactor < VK_BLEND_FACTOR_BEGIN_RANGE ||
4094 pCreateInfos->pColorBlendState->pAttachments->srcAlphaBlendFactor > 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->srcAlphaBlendFactor, is an unrecognized enumerator");
4098 return false;
4099 }
4100 if(pCreateInfos->pColorBlendState->pAttachments->dstAlphaBlendFactor < VK_BLEND_FACTOR_BEGIN_RANGE ||
4101 pCreateInfos->pColorBlendState->pAttachments->dstAlphaBlendFactor > VK_BLEND_FACTOR_END_RANGE)
4102 {
4103 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4104 "vkCreateGraphicsPipelines parameter, VkBlendFactor pCreateInfos->pColorBlendState->pAttachments->dstAlphaBlendFactor, is an unrecognized enumerator");
4105 return false;
4106 }
4107 if(pCreateInfos->pColorBlendState->pAttachments->alphaBlendOp < VK_BLEND_OP_BEGIN_RANGE ||
4108 pCreateInfos->pColorBlendState->pAttachments->alphaBlendOp > VK_BLEND_OP_END_RANGE)
4109 {
4110 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4111 "vkCreateGraphicsPipelines parameter, VkBlendOp pCreateInfos->pColorBlendState->pAttachments->alphaBlendOp, is an unrecognized enumerator");
4112 return false;
4113 }
4114 }
4115 }
4116 if(pCreateInfos->renderPass == VK_NULL_HANDLE)
4117 {
4118 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4119 "vkCreateGraphicsPipelines parameter, VkRenderPass pCreateInfos->renderPass, is null pointer");
4120 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004121
4122 int i = 0;
4123 for (auto j = 0; j < pCreateInfos[i].stageCount; j++) {
4124 validate_string(data, "vkCreateGraphicsPipelines()", "pCreateInfos[i].pStages[j].pName", pCreateInfos[i].pStages[j].pName);
4125 }
4126
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004127 }
4128
4129 return true;
4130}
4131
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004132bool PostCreateGraphicsPipelines(
4133 VkDevice device,
4134 VkPipelineCache pipelineCache,
4135 uint32_t count,
4136 VkPipeline* pPipelines,
4137 VkResult result)
4138{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004139
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004140
4141
4142 if(pPipelines != nullptr)
4143 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004144 }
4145
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004146 if(result < VK_SUCCESS)
4147 {
4148 std::string reason = "vkCreateGraphicsPipelines parameter, VkResult result, is " + EnumeratorString(result);
4149 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 -06004150 return false;
4151 }
4152
4153 return true;
4154}
4155
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004156VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateGraphicsPipelines(
4157 VkDevice device,
4158 VkPipelineCache pipelineCache,
4159 uint32_t count,
4160 const VkGraphicsPipelineCreateInfo* pCreateInfos,
4161 const VkAllocationCallbacks* pAllocator,
4162 VkPipeline* pPipelines)
4163{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004164 PreCreateGraphicsPipelines(device, pCreateInfos);
4165
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004166 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateGraphicsPipelines(device, pipelineCache, count, pCreateInfos, pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004167
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004168 PostCreateGraphicsPipelines(device, pipelineCache, count, pPipelines, result);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004169
4170 return result;
4171}
4172
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004173bool PreCreateComputePipelines(
4174 VkDevice device,
4175 const VkComputePipelineCreateInfo* pCreateInfos)
4176{
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004177 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4178
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004179 if(pCreateInfos != nullptr)
4180 {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004181 // TODO: Handle count!
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004182 if(pCreateInfos->sType != VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO)
4183 {
4184 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4185 "vkCreateComputePipelines parameter, VkStructureType pCreateInfos->sType, is an invalid enumerator");
4186 return false;
4187 }
4188 if(pCreateInfos->stage.sType != VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO)
4189 {
4190 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4191 "vkCreateComputePipelines parameter, VkStructureType pCreateInfos->cs.sType, is an invalid enumerator");
4192 return false;
4193 }
4194 if(pCreateInfos->stage.pSpecializationInfo != nullptr)
4195 {
4196 if(pCreateInfos->stage.pSpecializationInfo->pMapEntries != nullptr)
4197 {
4198 }
4199 if(pCreateInfos->stage.pSpecializationInfo->pData != nullptr)
4200 {
4201 }
4202 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004203
4204 int i = 0;
4205 validate_string(data, "vkCreateComputePipelines()", "pCreateInfos[i].stage.pName", pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004206 }
4207
4208 return true;
4209}
4210
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004211bool PostCreateComputePipelines(
4212 VkDevice device,
4213 VkPipelineCache pipelineCache,
4214 uint32_t count,
4215 VkPipeline* pPipelines,
4216 VkResult result)
4217{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004218
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004219
4220
4221 if(pPipelines != nullptr)
4222 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004223 }
4224
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004225 if(result < VK_SUCCESS)
4226 {
4227 std::string reason = "vkCreateComputePipelines parameter, VkResult result, is " + EnumeratorString(result);
4228 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 -06004229 return false;
4230 }
4231
4232 return true;
4233}
4234
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004235VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateComputePipelines(
4236 VkDevice device,
4237 VkPipelineCache pipelineCache,
4238 uint32_t count,
4239 const VkComputePipelineCreateInfo* pCreateInfos,
4240 const VkAllocationCallbacks* pAllocator,
4241 VkPipeline* pPipelines)
4242{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004243 PreCreateComputePipelines(device, pCreateInfos);
4244
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004245 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateComputePipelines(device, pipelineCache, count, pCreateInfos, pAllocator, pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004246
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004247 PostCreateComputePipelines(device, pipelineCache, count, pPipelines, result);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004248
4249 return result;
4250}
4251
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004252bool PreCreatePipelineLayout(
4253 VkDevice device,
4254 const VkPipelineLayoutCreateInfo* pCreateInfo)
4255{
4256 if(pCreateInfo != nullptr)
4257 {
4258 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO)
4259 {
4260 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4261 "vkCreatePipelineLayout parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
4262 return false;
4263 }
4264 if(pCreateInfo->pSetLayouts != nullptr)
4265 {
4266 }
4267 if(pCreateInfo->pPushConstantRanges != nullptr)
4268 {
4269 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004270 }
4271
4272 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004273}
4274
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004275bool PostCreatePipelineLayout(
4276 VkDevice device,
4277 VkPipelineLayout* pPipelineLayout,
4278 VkResult result)
4279{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004280
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004281 if(pPipelineLayout != nullptr)
4282 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004283 }
4284
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004285 if(result < VK_SUCCESS)
4286 {
4287 std::string reason = "vkCreatePipelineLayout parameter, VkResult result, is " + EnumeratorString(result);
4288 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 -06004289 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004290 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004291
4292 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004293}
4294
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004295VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineLayout(
4296 VkDevice device,
4297 const VkPipelineLayoutCreateInfo* pCreateInfo,
4298 const VkAllocationCallbacks* pAllocator,
4299 VkPipelineLayout* pPipelineLayout)
4300{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004301 PreCreatePipelineLayout(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004302
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004303 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004304
4305 PostCreatePipelineLayout(device, pPipelineLayout, result);
4306
4307 return result;
4308}
4309
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004310bool PreCreateSampler(
4311 VkDevice device,
4312 const VkSamplerCreateInfo* pCreateInfo)
4313{
4314 if(pCreateInfo != nullptr)
4315 {
4316 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO)
4317 {
4318 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4319 "vkCreateSampler parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
4320 return false;
4321 }
4322 if(pCreateInfo->magFilter < VK_FILTER_BEGIN_RANGE ||
4323 pCreateInfo->magFilter > 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->magFilter, is an unrecognized enumerator");
4327 return false;
4328 }
4329 if(pCreateInfo->minFilter < VK_FILTER_BEGIN_RANGE ||
4330 pCreateInfo->minFilter > VK_FILTER_END_RANGE)
4331 {
4332 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4333 "vkCreateSampler parameter, VkFilter pCreateInfo->minFilter, is an unrecognized enumerator");
4334 return false;
4335 }
4336 if(pCreateInfo->mipmapMode < VK_SAMPLER_MIPMAP_MODE_BEGIN_RANGE ||
4337 pCreateInfo->mipmapMode > VK_SAMPLER_MIPMAP_MODE_END_RANGE)
4338 {
4339 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4340 "vkCreateSampler parameter, VkSamplerMipmapMode pCreateInfo->mipmapMode, is an unrecognized enumerator");
4341 return false;
4342 }
4343 if(pCreateInfo->addressModeU < VK_SAMPLER_ADDRESS_MODE_BEGIN_RANGE ||
4344 pCreateInfo->addressModeU > 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->addressModeU, is an unrecognized enumerator");
4348 return false;
4349 }
4350 if(pCreateInfo->addressModeV < VK_SAMPLER_ADDRESS_MODE_BEGIN_RANGE ||
4351 pCreateInfo->addressModeV > 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->addressModeV, is an unrecognized enumerator");
4355 return false;
4356 }
4357 if(pCreateInfo->addressModeW < VK_SAMPLER_ADDRESS_MODE_BEGIN_RANGE ||
4358 pCreateInfo->addressModeW > VK_SAMPLER_ADDRESS_MODE_END_RANGE)
4359 {
4360 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4361 "vkCreateSampler parameter, VkTexAddress pCreateInfo->addressModeW, is an unrecognized enumerator");
4362 return false;
4363 }
4364 if(pCreateInfo->compareEnable)
4365 {
4366 if(pCreateInfo->compareOp < VK_COMPARE_OP_BEGIN_RANGE ||
4367 pCreateInfo->compareOp > VK_COMPARE_OP_END_RANGE)
4368 {
4369 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4370 "vkCreateSampler parameter, VkCompareOp pCreateInfo->compareOp, is an unrecognized enumerator");
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004371 return false;
4372 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004373 }
4374 if(pCreateInfo->borderColor < VK_BORDER_COLOR_BEGIN_RANGE ||
4375 pCreateInfo->borderColor > VK_BORDER_COLOR_END_RANGE)
4376 {
4377 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4378 "vkCreateSampler parameter, VkBorderColor pCreateInfo->borderColor, is an unrecognized enumerator");
4379 return false;
4380 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004381 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004382
4383 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004384}
4385
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004386bool PostCreateSampler(
4387 VkDevice device,
4388 VkSampler* pSampler,
4389 VkResult result)
4390{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004391
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004392 if(pSampler != nullptr)
4393 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004394 }
4395
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004396 if(result < VK_SUCCESS)
4397 {
4398 std::string reason = "vkCreateSampler parameter, VkResult result, is " + EnumeratorString(result);
4399 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 -06004400 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004401 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004402
4403 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004404}
4405
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004406VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSampler(
4407 VkDevice device,
4408 const VkSamplerCreateInfo* pCreateInfo,
4409 const VkAllocationCallbacks* pAllocator,
4410 VkSampler* pSampler)
4411{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004412 PreCreateSampler(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004413
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004414 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004415
4416 PostCreateSampler(device, pSampler, result);
4417
4418 return result;
4419}
4420
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004421bool PreCreateDescriptorSetLayout(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004422 VkDevice device,
4423 const VkDescriptorSetLayoutCreateInfo* pCreateInfo)
4424{
4425 if(pCreateInfo != nullptr)
4426 {
4427 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO)
4428 {
4429 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4430 "vkCreateDescriptorSetLayout parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
4431 return false;
4432 }
4433 if(pCreateInfo->pBindings != nullptr)
4434 {
4435 if(pCreateInfo->pBindings->descriptorType < VK_DESCRIPTOR_TYPE_BEGIN_RANGE ||
4436 pCreateInfo->pBindings->descriptorType > VK_DESCRIPTOR_TYPE_END_RANGE)
4437 {
4438 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4439 "vkCreateDescriptorSetLayout parameter, VkDescriptorType pCreateInfo->pBindings->descriptorType, is an unrecognized enumerator");
4440 return false;
4441 }
4442 if(pCreateInfo->pBindings->pImmutableSamplers != nullptr)
4443 {
4444 }
4445 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004446 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004447
4448 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004449}
4450
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004451bool PostCreateDescriptorSetLayout(
4452 VkDevice device,
4453 VkDescriptorSetLayout* pSetLayout,
4454 VkResult result)
4455{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004456
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004457 if(pSetLayout != nullptr)
4458 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004459 }
4460
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004461 if(result < VK_SUCCESS)
4462 {
4463 std::string reason = "vkCreateDescriptorSetLayout parameter, VkResult result, is " + EnumeratorString(result);
4464 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 -06004465 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004466 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004467
4468 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004469}
4470
Chia-I Wu9ab61502015-11-06 06:42:02 +08004471VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorSetLayout(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004472 VkDevice device,
4473 const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
4474 const VkAllocationCallbacks* pAllocator,
4475 VkDescriptorSetLayout* pSetLayout)
4476{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004477 PreCreateDescriptorSetLayout(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004478
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004479 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004480
4481 PostCreateDescriptorSetLayout(device, pSetLayout, result);
4482
4483 return result;
4484}
4485
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004486bool PreCreateDescriptorPool(
4487 VkDevice device,
4488 const VkDescriptorPoolCreateInfo* pCreateInfo)
4489{
4490 if(pCreateInfo != nullptr)
4491 {
4492 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO)
4493 {
4494 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4495 "vkCreateDescriptorPool parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
4496 return false;
4497 }
4498 if(pCreateInfo->pPoolSizes != nullptr)
4499 {
4500 if(pCreateInfo->pPoolSizes->type < VK_DESCRIPTOR_TYPE_BEGIN_RANGE ||
4501 pCreateInfo->pPoolSizes->type > VK_DESCRIPTOR_TYPE_END_RANGE)
4502 {
4503 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4504 "vkCreateDescriptorPool parameter, VkDescriptorType pCreateInfo->pTypeCount->type, is an unrecognized enumerator");
4505 return false;
4506 }
4507 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004508 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004509
4510 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004511}
4512
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004513bool PostCreateDescriptorPool(
4514 VkDevice device,
4515 uint32_t maxSets,
4516 VkDescriptorPool* pDescriptorPool,
4517 VkResult result)
4518{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004519
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004520 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
Jeremy Hayes99a96322015-06-26 12:48:09 -06004521
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004522 if(pDescriptorPool != nullptr)
4523 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004524 }
4525
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004526 if(result < VK_SUCCESS)
4527 {
4528 std::string reason = "vkCreateDescriptorPool parameter, VkResult result, is " + EnumeratorString(result);
4529 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 -06004530 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004531 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004532
4533 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004534}
4535
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004536VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorPool(
4537 VkDevice device,
4538 const VkDescriptorPoolCreateInfo* pCreateInfo,
4539 const VkAllocationCallbacks* pAllocator,
4540 VkDescriptorPool* pDescriptorPool)
4541{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004542 PreCreateDescriptorPool(device, pCreateInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004543
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004544 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004545
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004546 PostCreateDescriptorPool(device, pCreateInfo->maxSets, pDescriptorPool, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004547
4548 return result;
4549}
4550
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004551bool PostResetDescriptorPool(
4552 VkDevice device,
4553 VkDescriptorPool descriptorPool,
4554 VkResult result)
4555{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004556
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004557
4558 if(result < VK_SUCCESS)
4559 {
4560 std::string reason = "vkResetDescriptorPool parameter, VkResult result, is " + EnumeratorString(result);
4561 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 -06004562 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004563 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004564
4565 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004566}
4567
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004568VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetDescriptorPool(
4569 VkDevice device,
4570 VkDescriptorPool descriptorPool,
4571 VkDescriptorPoolResetFlags flags)
4572{
4573 VkResult result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004574
4575 PostResetDescriptorPool(device, descriptorPool, result);
4576
4577 return result;
4578}
4579
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004580bool PreAllocateDescriptorSets(
4581 VkDevice device,
4582 const VkDescriptorSetLayout* pSetLayouts)
4583{
4584 if(pSetLayouts != nullptr)
4585 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004586 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004587
4588 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004589}
4590
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004591bool PostAllocateDescriptorSets(
4592 VkDevice device,
4593 VkDescriptorPool descriptorPool,
4594 uint32_t count,
4595 VkDescriptorSet* pDescriptorSets,
4596 VkResult result)
4597{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004598
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004599
4600 if(pDescriptorSets != nullptr)
4601 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004602 }
4603
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004604 if(result < VK_SUCCESS)
4605 {
4606 std::string reason = "vkAllocateDescriptorSets parameter, VkResult result, is " + EnumeratorString(result);
4607 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 -06004608 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004609 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004610
4611 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004612}
4613
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004614VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateDescriptorSets(
4615 VkDevice device,
4616 const VkDescriptorSetAllocateInfo* pAllocateInfo,
4617 VkDescriptorSet* pDescriptorSets)
4618{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004619 PreAllocateDescriptorSets(device, pAllocateInfo->pSetLayouts);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004620
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004621 VkResult result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004622
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004623 PostAllocateDescriptorSets(device, pAllocateInfo->descriptorPool, pAllocateInfo->descriptorSetCount, pDescriptorSets, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004624
4625 return result;
4626}
4627
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004628bool PreFreeDescriptorSets(
4629 VkDevice device,
4630 const VkDescriptorSet* pDescriptorSets)
4631{
4632 if(pDescriptorSets != nullptr)
4633 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004634 }
4635
4636 return true;
4637}
4638
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004639bool PostFreeDescriptorSets(
4640 VkDevice device,
4641 VkDescriptorPool descriptorPool,
4642 uint32_t count,
4643 VkResult result)
4644{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004645
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004646
4647
4648 if(result < VK_SUCCESS)
4649 {
4650 std::string reason = "vkFreeDescriptorSets parameter, VkResult result, is " + EnumeratorString(result);
4651 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 -06004652 return false;
4653 }
4654
4655 return true;
4656}
4657
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004658VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFreeDescriptorSets(
4659 VkDevice device,
4660 VkDescriptorPool descriptorPool,
4661 uint32_t count,
4662 const VkDescriptorSet* pDescriptorSets)
4663{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004664 PreFreeDescriptorSets(device, pDescriptorSets);
4665
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004666 VkResult result = get_dispatch_table(pc_device_table_map, device)->FreeDescriptorSets(device, descriptorPool, count, pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004667
4668 PostFreeDescriptorSets(device, descriptorPool, count, result);
4669
4670 return result;
4671}
4672
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004673bool PreUpdateDescriptorSets(
4674 VkDevice device,
4675 const VkWriteDescriptorSet* pDescriptorWrites,
4676 const VkCopyDescriptorSet* pDescriptorCopies)
4677{
4678 if(pDescriptorWrites != nullptr)
4679 {
4680 if(pDescriptorWrites->sType != VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET)
4681 {
4682 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4683 "vkUpdateDescriptorSets parameter, VkStructureType pDescriptorWrites->sType, is an invalid enumerator");
4684 return false;
4685 }
4686 if(pDescriptorWrites->descriptorType < VK_DESCRIPTOR_TYPE_BEGIN_RANGE ||
4687 pDescriptorWrites->descriptorType > VK_DESCRIPTOR_TYPE_END_RANGE)
4688 {
4689 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4690 "vkUpdateDescriptorSets parameter, VkDescriptorType pDescriptorWrites->descriptorType, is an unrecognized enumerator");
4691 return false;
4692 }
4693 /* TODO: Validate other parts of pImageInfo, pBufferInfo, pTexelBufferView? */
4694 /* TODO: This test should probably only be done if descriptorType is correct type of descriptor */
4695 if(pDescriptorWrites->pImageInfo != nullptr)
4696 {
4697 if (((pDescriptorWrites->pImageInfo->imageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
4698 (pDescriptorWrites->pImageInfo->imageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4699 (pDescriptorWrites->pImageInfo->imageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
4700 {
4701 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4702 "vkUpdateDescriptorSets parameter, VkImageLayout pDescriptorWrites->pDescriptors->imageLayout, is an unrecognized enumerator");
4703 return false;
4704 }
4705 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004706 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004707
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004708 if(pDescriptorCopies != nullptr)
4709 {
4710 if(pDescriptorCopies->sType != VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET)
4711 {
4712 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4713 "vkUpdateDescriptorSets parameter, VkStructureType pDescriptorCopies->sType, is an invalid enumerator");
4714 return false;
4715 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004716 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004717
4718 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004719}
4720
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004721VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkUpdateDescriptorSets(
4722 VkDevice device,
4723 uint32_t descriptorWriteCount,
4724 const VkWriteDescriptorSet* pDescriptorWrites,
4725 uint32_t descriptorCopyCount,
4726 const VkCopyDescriptorSet* pDescriptorCopies)
4727{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004728 PreUpdateDescriptorSets(device, pDescriptorWrites, pDescriptorCopies);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004729
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004730 get_dispatch_table(pc_device_table_map, device)->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004731}
4732
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004733bool PreCreateFramebuffer(
4734 VkDevice device,
4735 const VkFramebufferCreateInfo* pCreateInfo)
4736{
4737 if(pCreateInfo != nullptr)
4738 {
4739 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO)
4740 {
4741 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4742 "vkCreateFramebuffer parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
4743 return false;
4744 }
4745 if(pCreateInfo->pAttachments != nullptr)
4746 {
4747 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004748 }
4749
4750 return true;
4751}
4752
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004753bool PostCreateFramebuffer(
4754 VkDevice device,
4755 VkFramebuffer* pFramebuffer,
4756 VkResult result)
4757{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004758
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004759 if(pFramebuffer != nullptr)
4760 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004761 }
4762
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004763 if(result < VK_SUCCESS)
4764 {
4765 std::string reason = "vkCreateFramebuffer parameter, VkResult result, is " + EnumeratorString(result);
4766 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 -06004767 return false;
4768 }
4769
4770 return true;
4771}
4772
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004773VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateFramebuffer(
4774 VkDevice device,
4775 const VkFramebufferCreateInfo* pCreateInfo,
4776 const VkAllocationCallbacks* pAllocator,
4777 VkFramebuffer* pFramebuffer)
4778{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004779 PreCreateFramebuffer(device, pCreateInfo);
4780
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004781 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004782
4783 PostCreateFramebuffer(device, pFramebuffer, result);
4784
4785 return result;
4786}
4787
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004788bool PreCreateRenderPass(
4789 VkDevice device,
4790 const VkRenderPassCreateInfo* pCreateInfo)
4791{
4792 if(pCreateInfo != nullptr)
4793 {
4794 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO)
4795 {
4796 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4797 "vkCreateRenderPass parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
4798 return false;
4799 }
4800 if(pCreateInfo->pAttachments != nullptr)
4801 {
4802 if(pCreateInfo->pAttachments->format < VK_FORMAT_BEGIN_RANGE ||
4803 pCreateInfo->pAttachments->format > VK_FORMAT_END_RANGE)
4804 {
4805 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4806 "vkCreateRenderPass parameter, VkFormat pCreateInfo->pAttachments->format, is an unrecognized enumerator");
4807 return false;
4808 }
4809 if(pCreateInfo->pAttachments->loadOp < VK_ATTACHMENT_LOAD_OP_BEGIN_RANGE ||
4810 pCreateInfo->pAttachments->loadOp > VK_ATTACHMENT_LOAD_OP_END_RANGE)
4811 {
4812 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4813 "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->pAttachments->loadOp, is an unrecognized enumerator");
4814 return false;
4815 }
4816 if(pCreateInfo->pAttachments->storeOp < VK_ATTACHMENT_STORE_OP_BEGIN_RANGE ||
4817 pCreateInfo->pAttachments->storeOp > VK_ATTACHMENT_STORE_OP_END_RANGE)
4818 {
4819 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4820 "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->pAttachments->storeOp, is an unrecognized enumerator");
4821 return false;
4822 }
4823 if(pCreateInfo->pAttachments->stencilLoadOp < VK_ATTACHMENT_LOAD_OP_BEGIN_RANGE ||
4824 pCreateInfo->pAttachments->stencilLoadOp > VK_ATTACHMENT_LOAD_OP_END_RANGE)
4825 {
4826 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4827 "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->pAttachments->stencilLoadOp, is an unrecognized enumerator");
4828 return false;
4829 }
4830 if(pCreateInfo->pAttachments->stencilStoreOp < VK_ATTACHMENT_STORE_OP_BEGIN_RANGE ||
4831 pCreateInfo->pAttachments->stencilStoreOp > VK_ATTACHMENT_STORE_OP_END_RANGE)
4832 {
4833 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4834 "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->pAttachments->stencilStoreOp, is an unrecognized enumerator");
4835 return false;
4836 }
4837 if (((pCreateInfo->pAttachments->initialLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
4838 (pCreateInfo->pAttachments->initialLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4839 (pCreateInfo->pAttachments->initialLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
4840 {
4841 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4842 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pAttachments->initialLayout, is an unrecognized enumerator");
4843 return false;
4844 }
4845 if (((pCreateInfo->pAttachments->initialLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
4846 (pCreateInfo->pAttachments->initialLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4847 (pCreateInfo->pAttachments->initialLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
4848 {
4849 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4850 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pAttachments->finalLayout, is an unrecognized enumerator");
4851 return false;
4852 }
4853 }
4854 if(pCreateInfo->pSubpasses != nullptr)
4855 {
4856 if(pCreateInfo->pSubpasses->pipelineBindPoint < VK_PIPELINE_BIND_POINT_BEGIN_RANGE ||
4857 pCreateInfo->pSubpasses->pipelineBindPoint > VK_PIPELINE_BIND_POINT_END_RANGE)
4858 {
4859 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4860 "vkCreateRenderPass parameter, VkPipelineBindPoint pCreateInfo->pSubpasses->pipelineBindPoint, is an unrecognized enumerator");
4861 return false;
4862 }
4863 if(pCreateInfo->pSubpasses->pInputAttachments != nullptr)
4864 {
4865 if (((pCreateInfo->pSubpasses->pInputAttachments->layout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
4866 (pCreateInfo->pSubpasses->pInputAttachments->layout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4867 (pCreateInfo->pSubpasses->pInputAttachments->layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
4868 {
4869 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4870 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pSubpasses->pInputAttachments->layout, is an unrecognized enumerator");
4871 return false;
4872 }
4873 }
4874 if(pCreateInfo->pSubpasses->pColorAttachments != nullptr)
4875 {
4876 if (((pCreateInfo->pSubpasses->pColorAttachments->layout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
4877 (pCreateInfo->pSubpasses->pColorAttachments->layout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4878 (pCreateInfo->pSubpasses->pColorAttachments->layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
4879 {
4880 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4881 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pSubpasses->pColorAttachments->layout, is an unrecognized enumerator");
4882 return false;
4883 }
4884 }
4885 if(pCreateInfo->pSubpasses->pResolveAttachments != nullptr)
4886 {
4887 if (((pCreateInfo->pSubpasses->pResolveAttachments->layout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
4888 (pCreateInfo->pSubpasses->pResolveAttachments->layout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4889 (pCreateInfo->pSubpasses->pResolveAttachments->layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
4890 {
4891 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4892 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pSubpasses->pResolveAttachments->layout, is an unrecognized enumerator");
4893 return false;
4894 }
4895 }
4896 if(pCreateInfo->pSubpasses->pDepthStencilAttachment &&
4897 ((pCreateInfo->pSubpasses->pDepthStencilAttachment->layout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
4898 (pCreateInfo->pSubpasses->pDepthStencilAttachment->layout > VK_IMAGE_LAYOUT_END_RANGE)) &&
4899 (pCreateInfo->pSubpasses->pDepthStencilAttachment->layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
4900 {
4901 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4902 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pSubpasses->pDepthStencilAttachment->layout, is an unrecognized enumerator");
4903 return false;
4904 }
4905 }
4906 if(pCreateInfo->pDependencies != nullptr)
4907 {
4908 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004909 }
4910
4911 return true;
4912}
4913
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004914bool PostCreateRenderPass(
4915 VkDevice device,
4916 VkRenderPass* pRenderPass,
4917 VkResult result)
4918{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004919
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004920 if(pRenderPass != nullptr)
4921 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004922 }
4923
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004924 if(result < VK_SUCCESS)
4925 {
4926 std::string reason = "vkCreateRenderPass parameter, VkResult result, is " + EnumeratorString(result);
4927 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 -06004928 return false;
4929 }
4930
4931 return true;
4932}
4933
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004934VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(
4935 VkDevice device,
4936 const VkRenderPassCreateInfo* pCreateInfo,
4937 const VkAllocationCallbacks* pAllocator,
4938 VkRenderPass* pRenderPass)
4939{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004940 PreCreateRenderPass(device, pCreateInfo);
4941
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004942 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004943
4944 PostCreateRenderPass(device, pRenderPass, result);
4945
4946 return result;
4947}
4948
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004949bool PostGetRenderAreaGranularity(
4950 VkDevice device,
4951 VkRenderPass renderPass,
4952 VkExtent2D* pGranularity)
4953{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004954
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004955
4956 if(pGranularity != nullptr)
4957 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004958 }
4959
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004960 return true;
4961}
4962
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004963VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetRenderAreaGranularity(
4964 VkDevice device,
4965 VkRenderPass renderPass,
4966 VkExtent2D* pGranularity)
4967{
4968 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004969
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -06004970 PostGetRenderAreaGranularity(device, renderPass, pGranularity);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004971}
4972
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004973bool PreCreateCommandPool(
4974 VkDevice device,
4975 const VkCommandPoolCreateInfo* pCreateInfo)
4976{
4977 if(pCreateInfo != nullptr)
4978 {
4979 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO)
4980 {
4981 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4982 "vkCreateCommandPool parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
4983 return false;
4984 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004985 }
4986
4987 return true;
4988}
4989
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004990bool PostCreateCommandPool(
4991 VkDevice device,
4992 VkCommandPool* pCommandPool,
4993 VkResult result)
4994{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004995
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004996 if(pCommandPool != nullptr)
4997 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004998 }
4999
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005000 if(result < VK_SUCCESS)
5001 {
5002 std::string reason = "vkCreateCommandPool parameter, VkResult result, is " + EnumeratorString(result);
5003 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 -06005004 return false;
5005 }
5006
5007 return true;
5008}
5009
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005010VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool(
5011 VkDevice device,
5012 const VkCommandPoolCreateInfo* pCreateInfo,
5013 const VkAllocationCallbacks* pAllocator,
5014 VkCommandPool* pCommandPool)
5015{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005016 PreCreateCommandPool(device, pCreateInfo);
5017
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005018 VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005019
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005020 PostCreateCommandPool(device, pCommandPool, result);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005021
5022 return result;
5023}
5024
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005025bool PostResetCommandPool(
5026 VkDevice device,
5027 VkCommandPool commandPool,
5028 VkCommandPoolResetFlags flags,
5029 VkResult result)
5030{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005031
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005032
5033
5034 if(result < VK_SUCCESS)
5035 {
5036 std::string reason = "vkResetCommandPool parameter, VkResult result, is " + EnumeratorString(result);
5037 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 -06005038 return false;
5039 }
5040
5041 return true;
5042}
5043
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005044VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetCommandPool(
5045 VkDevice device,
5046 VkCommandPool commandPool,
5047 VkCommandPoolResetFlags flags)
5048{
5049 VkResult result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005050
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005051 PostResetCommandPool(device, commandPool, flags, result);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005052
5053 return result;
5054}
5055
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005056bool PreCreateCommandBuffer(
5057 VkDevice device,
5058 const VkCommandBufferAllocateInfo* pCreateInfo)
5059{
5060 if(pCreateInfo != nullptr)
5061 {
5062 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO)
5063 {
5064 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5065 "vkAllocateCommandBuffers parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
5066 return false;
5067 }
5068 if(pCreateInfo->level < VK_COMMAND_BUFFER_LEVEL_BEGIN_RANGE ||
5069 pCreateInfo->level > VK_COMMAND_BUFFER_LEVEL_END_RANGE)
5070 {
5071 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5072 "vkAllocateCommandBuffers parameter, VkCommandBufferLevel pCreateInfo->level, is an unrecognized enumerator");
5073 return false;
5074 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005075 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005076
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005077 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005078}
5079
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005080bool PostCreateCommandBuffer(
5081 VkDevice device,
5082 VkCommandBuffer* pCommandBuffer,
5083 VkResult result)
5084{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005085
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005086 if(pCommandBuffer != nullptr)
5087 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005088 }
5089
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005090 if(result < VK_SUCCESS)
5091 {
5092 std::string reason = "vkAllocateCommandBuffers parameter, VkResult result, is " + EnumeratorString(result);
5093 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 -06005094 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005095 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005096
5097 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005098}
5099
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005100VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateCommandBuffers(
5101 VkDevice device,
5102 const VkCommandBufferAllocateInfo* pCreateInfo,
5103 VkCommandBuffer* pCommandBuffer)
5104{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005105 PreCreateCommandBuffer(device, pCreateInfo);
5106
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005107 VkResult result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pCreateInfo, pCommandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005108
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005109 PostCreateCommandBuffer(device, pCommandBuffer, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005110
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005111 return result;
5112}
5113
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005114bool PreBeginCommandBuffer(
5115 VkCommandBuffer commandBuffer,
5116 const VkCommandBufferBeginInfo* pBeginInfo)
5117{
5118 if(pBeginInfo != nullptr)
5119 {
5120 if(pBeginInfo->sType != VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO)
5121 {
5122 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5123 "vkBeginCommandBuffer parameter, VkStructureType pBeginInfo->sType, is an invalid enumerator");
5124 return false;
5125 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06005126 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005127
5128 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005129}
5130
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005131bool PostBeginCommandBuffer(
5132 VkCommandBuffer commandBuffer,
5133 VkResult result)
5134{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005135
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005136 if(result < VK_SUCCESS)
5137 {
5138 std::string reason = "vkBeginCommandBuffer parameter, VkResult result, is " + EnumeratorString(result);
5139 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 -06005140 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005141 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005142
5143 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005144}
5145
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005146VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBeginCommandBuffer(
5147 VkCommandBuffer commandBuffer,
5148 const VkCommandBufferBeginInfo* pBeginInfo)
5149{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005150 PreBeginCommandBuffer(commandBuffer, pBeginInfo);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005151
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005152 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005153
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005154 PostBeginCommandBuffer(commandBuffer, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005155
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005156 return result;
5157}
5158
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005159bool PostEndCommandBuffer(
5160 VkCommandBuffer commandBuffer,
5161 VkResult result)
5162{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005163
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005164 if(result < VK_SUCCESS)
5165 {
5166 std::string reason = "vkEndCommandBuffer parameter, VkResult result, is " + EnumeratorString(result);
5167 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 -06005168 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005169 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005170
5171 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005172}
5173
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005174VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer(
5175 VkCommandBuffer commandBuffer)
5176{
5177 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005178
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005179 PostEndCommandBuffer(commandBuffer, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005180
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005181 return result;
5182}
5183
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005184bool PostResetCommandBuffer(
5185 VkCommandBuffer commandBuffer,
5186 VkCommandBufferResetFlags flags,
5187 VkResult result)
5188{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005189
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005190
5191 if(result < VK_SUCCESS)
5192 {
5193 std::string reason = "vkResetCommandBuffer parameter, VkResult result, is " + EnumeratorString(result);
5194 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 -06005195 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005196 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005197
5198 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005199}
5200
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005201VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetCommandBuffer(
5202 VkCommandBuffer commandBuffer,
5203 VkCommandBufferResetFlags flags)
5204{
5205 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005206
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005207 PostResetCommandBuffer(commandBuffer, flags, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005208
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005209 return result;
5210}
5211
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005212bool PostCmdBindPipeline(
5213 VkCommandBuffer commandBuffer,
5214 VkPipelineBindPoint pipelineBindPoint,
5215 VkPipeline pipeline)
5216{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005217
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005218 if(pipelineBindPoint < VK_PIPELINE_BIND_POINT_BEGIN_RANGE ||
5219 pipelineBindPoint > VK_PIPELINE_BIND_POINT_END_RANGE)
5220 {
5221 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5222 "vkCmdBindPipeline parameter, VkPipelineBindPoint pipelineBindPoint, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005223 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005224 }
5225
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005226
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005227 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005228}
5229
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005230VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindPipeline(
5231 VkCommandBuffer commandBuffer,
5232 VkPipelineBindPoint pipelineBindPoint,
5233 VkPipeline pipeline)
5234{
5235 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005236
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005237 PostCmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005238}
5239
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005240VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport* pViewports)
5241{
5242 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06005243}
5244
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005245VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D* pScissors)
5246{
5247 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005248}
5249
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005250VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth)
5251{
5252 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005253}
5254
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005255VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor)
5256{
5257 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005258}
5259
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005260VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4])
5261{
5262 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
Cody Northrop12365112015-08-17 11:10:49 -06005263}
5264
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005265VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds)
5266{
5267 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06005268}
5269
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005270VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask)
5271{
5272 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005273}
5274
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005275VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask)
5276{
5277 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005278}
5279
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005280VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference)
5281{
5282 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005283}
5284
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005285bool PreCmdBindDescriptorSets(
5286 VkCommandBuffer commandBuffer,
5287 const VkDescriptorSet* pDescriptorSets,
5288 const uint32_t* pDynamicOffsets)
5289{
5290 if(pDescriptorSets != nullptr)
5291 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005292 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005293
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005294 if(pDynamicOffsets != nullptr)
5295 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005296 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005297
5298 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005299}
5300
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005301bool PostCmdBindDescriptorSets(
5302 VkCommandBuffer commandBuffer,
5303 VkPipelineBindPoint pipelineBindPoint,
5304 VkPipelineLayout layout,
5305 uint32_t firstSet,
5306 uint32_t setCount,
5307 uint32_t dynamicOffsetCount)
5308{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005309
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005310 if(pipelineBindPoint < VK_PIPELINE_BIND_POINT_BEGIN_RANGE ||
5311 pipelineBindPoint > VK_PIPELINE_BIND_POINT_END_RANGE)
5312 {
5313 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5314 "vkCmdBindDescriptorSets parameter, VkPipelineBindPoint pipelineBindPoint, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005315 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005316 }
5317
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005318
5319
5320
5321
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005322 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005323}
5324
Chia-I Wu9ab61502015-11-06 06:42:02 +08005325VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorSets(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005326 VkCommandBuffer commandBuffer,
5327 VkPipelineBindPoint pipelineBindPoint,
5328 VkPipelineLayout layout,
5329 uint32_t firstSet,
5330 uint32_t setCount,
5331 const VkDescriptorSet* pDescriptorSets,
5332 uint32_t dynamicOffsetCount,
5333 const uint32_t* pDynamicOffsets)
5334{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005335 PreCmdBindDescriptorSets(commandBuffer, pDescriptorSets, pDynamicOffsets);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005336
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005337 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, setCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005338
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005339 PostCmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, setCount, dynamicOffsetCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005340}
5341
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005342bool PostCmdBindIndexBuffer(
5343 VkCommandBuffer commandBuffer,
5344 VkBuffer buffer,
5345 VkDeviceSize offset,
5346 VkIndexType indexType)
5347{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005348
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005349
5350
5351 if(indexType < VK_INDEX_TYPE_BEGIN_RANGE ||
5352 indexType > VK_INDEX_TYPE_END_RANGE)
5353 {
5354 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5355 "vkCmdBindIndexBuffer parameter, VkIndexType indexType, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005356 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005357 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005358
5359 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005360}
5361
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005362VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindIndexBuffer(
5363 VkCommandBuffer commandBuffer,
5364 VkBuffer buffer,
5365 VkDeviceSize offset,
5366 VkIndexType indexType)
5367{
5368 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005369
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005370 PostCmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005371}
5372
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005373bool PreCmdBindVertexBuffers(
5374 VkCommandBuffer commandBuffer,
5375 const VkBuffer* pBuffers,
5376 const VkDeviceSize* pOffsets)
5377{
5378 if(pBuffers != nullptr)
5379 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005380 }
5381
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005382 if(pOffsets != nullptr)
5383 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005384 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005385
5386 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005387}
5388
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005389bool PostCmdBindVertexBuffers(
5390 VkCommandBuffer commandBuffer,
5391 uint32_t firstBinding,
5392 uint32_t bindingCount)
5393{
5394
5395
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005396
5397 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005398}
5399
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005400VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers(
5401 VkCommandBuffer commandBuffer,
5402 uint32_t firstBinding,
5403 uint32_t bindingCount,
5404 const VkBuffer* pBuffers,
5405 const VkDeviceSize* pOffsets)
5406{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005407 PreCmdBindVertexBuffers(commandBuffer, pBuffers, pOffsets);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005408
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005409 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005410
Jon Ashburn19d3bf12015-12-30 14:06:55 -07005411 PostCmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005412}
5413
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005414bool PreCmdDraw(
5415 VkCommandBuffer commandBuffer,
5416 uint32_t vertexCount,
5417 uint32_t instanceCount,
5418 uint32_t firstVertex,
5419 uint32_t firstInstance)
5420{
Michael Lentine55a913f2015-11-24 09:48:23 -06005421 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005422 // 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 -07005423 // this an error or leave as is.
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005424 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005425 "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06005426 return false;
5427 }
5428
5429 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005430 // 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 -07005431 // this an error or leave as is.
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07005432 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005433 "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06005434 return false;
5435 }
5436
5437 return true;
5438}
5439
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005440bool PostCmdDraw(
5441 VkCommandBuffer commandBuffer,
5442 uint32_t firstVertex,
5443 uint32_t vertexCount,
5444 uint32_t firstInstance,
5445 uint32_t instanceCount)
5446{
5447
5448
5449
5450
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005451
5452 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005453}
5454
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005455VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDraw(
5456 VkCommandBuffer commandBuffer,
5457 uint32_t vertexCount,
5458 uint32_t instanceCount,
5459 uint32_t firstVertex,
5460 uint32_t firstInstance)
5461{
5462 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06005463
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005464 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005465
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005466 PostCmdDraw(commandBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005467}
5468
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005469bool PostCmdDrawIndexed(
5470 VkCommandBuffer commandBuffer,
5471 uint32_t firstIndex,
5472 uint32_t indexCount,
5473 int32_t vertexOffset,
5474 uint32_t firstInstance,
5475 uint32_t instanceCount)
5476{
5477
5478
5479
5480
5481
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005482
5483 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005484}
5485
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005486VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexed(
5487 VkCommandBuffer commandBuffer,
5488 uint32_t indexCount,
5489 uint32_t instanceCount,
5490 uint32_t firstIndex,
5491 int32_t vertexOffset,
5492 uint32_t firstInstance)
5493{
5494 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005495
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005496 PostCmdDrawIndexed(commandBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005497}
5498
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005499bool PostCmdDrawIndirect(
5500 VkCommandBuffer commandBuffer,
5501 VkBuffer buffer,
5502 VkDeviceSize offset,
5503 uint32_t count,
5504 uint32_t stride)
5505{
5506
5507
5508
5509
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005510
5511 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005512}
5513
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005514VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirect(
5515 VkCommandBuffer commandBuffer,
5516 VkBuffer buffer,
5517 VkDeviceSize offset,
5518 uint32_t count,
5519 uint32_t stride)
5520{
5521 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005522
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005523 PostCmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005524}
5525
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005526bool PostCmdDrawIndexedIndirect(
5527 VkCommandBuffer commandBuffer,
5528 VkBuffer buffer,
5529 VkDeviceSize offset,
5530 uint32_t count,
5531 uint32_t stride)
5532{
5533
5534
5535
5536
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005537
5538 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005539}
5540
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005541VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirect(
5542 VkCommandBuffer commandBuffer,
5543 VkBuffer buffer,
5544 VkDeviceSize offset,
5545 uint32_t count,
5546 uint32_t stride)
5547{
5548 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005549
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005550 PostCmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005551}
5552
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005553bool PostCmdDispatch(
5554 VkCommandBuffer commandBuffer,
5555 uint32_t x,
5556 uint32_t y,
5557 uint32_t z)
5558{
5559
5560
5561
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005562
5563 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005564}
5565
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005566VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDispatch(
5567 VkCommandBuffer commandBuffer,
5568 uint32_t x,
5569 uint32_t y,
5570 uint32_t z)
5571{
5572 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005573
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005574 PostCmdDispatch(commandBuffer, x, y, z);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005575}
5576
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005577bool PostCmdDispatchIndirect(
5578 VkCommandBuffer commandBuffer,
5579 VkBuffer buffer,
5580 VkDeviceSize offset)
5581{
5582
5583
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005584
5585 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005586}
5587
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005588VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDispatchIndirect(
5589 VkCommandBuffer commandBuffer,
5590 VkBuffer buffer,
5591 VkDeviceSize offset)
5592{
5593 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005594
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005595 PostCmdDispatchIndirect(commandBuffer, buffer, offset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005596}
5597
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005598bool PreCmdCopyBuffer(
5599 VkCommandBuffer commandBuffer,
5600 const VkBufferCopy* pRegions)
5601{
5602 if(pRegions != nullptr)
5603 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005604 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005605
5606 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005607}
5608
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005609bool PostCmdCopyBuffer(
5610 VkCommandBuffer commandBuffer,
5611 VkBuffer srcBuffer,
5612 VkBuffer dstBuffer,
5613 uint32_t regionCount)
5614{
5615
5616
5617
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005618
5619 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005620}
5621
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005622VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer(
5623 VkCommandBuffer commandBuffer,
5624 VkBuffer srcBuffer,
5625 VkBuffer dstBuffer,
5626 uint32_t regionCount,
5627 const VkBufferCopy* pRegions)
5628{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005629 PreCmdCopyBuffer(commandBuffer, pRegions);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005630
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005631 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005632
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005633 PostCmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005634}
5635
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005636bool PreCmdCopyImage(
5637 VkCommandBuffer commandBuffer,
5638 const VkImageCopy* pRegions)
5639{
5640 if(pRegions != nullptr)
5641 {
5642 if ((pRegions->srcSubresource.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->srcSubresource.aspectMask, is an unrecognized enumerator");
5647 return false;
5648 }
5649 if ((pRegions->dstSubresource.aspectMask &
5650 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
5651 {
5652 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5653 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
5654 return false;
5655 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005656 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005657
5658 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005659}
5660
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005661bool PostCmdCopyImage(
5662 VkCommandBuffer commandBuffer,
5663 VkImage srcImage,
5664 VkImageLayout srcImageLayout,
5665 VkImage dstImage,
5666 VkImageLayout dstImageLayout,
5667 uint32_t regionCount)
5668{
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07005669 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005670 (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5671 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5672 {
5673 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5674 "vkCmdCopyImage parameter, VkImageLayout srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005675 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005676 }
5677
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005678
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07005679 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005680 (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5681 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5682 {
5683 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5684 "vkCmdCopyImage parameter, VkImageLayout dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005685 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005686 }
5687
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005688
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005689 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005690}
5691
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005692VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImage(
5693 VkCommandBuffer commandBuffer,
5694 VkImage srcImage,
5695 VkImageLayout srcImageLayout,
5696 VkImage dstImage,
5697 VkImageLayout dstImageLayout,
5698 uint32_t regionCount,
5699 const VkImageCopy* pRegions)
5700{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005701 PreCmdCopyImage(commandBuffer, pRegions);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005702
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005703 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005704
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005705 PostCmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005706}
5707
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005708bool PreCmdBlitImage(
5709 VkCommandBuffer commandBuffer,
5710 const VkImageBlit* pRegions)
5711{
5712 if(pRegions != nullptr)
5713 {
5714 if ((pRegions->srcSubresource.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->srcSubresource.aspectMask, is an unrecognized enumerator");
5719 return false;
5720 }
5721 if ((pRegions->dstSubresource.aspectMask &
5722 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
5723 {
5724 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5725 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
5726 return false;
5727 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005728 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005729
5730 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005731}
5732
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005733bool PostCmdBlitImage(
5734 VkCommandBuffer commandBuffer,
5735 VkImage srcImage,
5736 VkImageLayout srcImageLayout,
5737 VkImage dstImage,
5738 VkImageLayout dstImageLayout,
5739 uint32_t regionCount,
5740 VkFilter filter)
5741{
5742
Jeremy Hayes99a96322015-06-26 12:48:09 -06005743
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07005744 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005745 (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5746 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5747 {
5748 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5749 "vkCmdBlitImage parameter, VkImageLayout srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005750 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005751 }
5752
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005753
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07005754 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005755 (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5756 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5757 {
5758 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5759 "vkCmdBlitImage parameter, VkImageLayout dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005760 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005761 }
5762
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005763
5764 if(filter < VK_FILTER_BEGIN_RANGE ||
5765 filter > VK_FILTER_END_RANGE)
5766 {
5767 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5768 "vkCmdBlitImage parameter, VkFilter filter, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005769 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005770 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005771
5772 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005773}
5774
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005775VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBlitImage(
5776 VkCommandBuffer commandBuffer,
5777 VkImage srcImage,
5778 VkImageLayout srcImageLayout,
5779 VkImage dstImage,
5780 VkImageLayout dstImageLayout,
5781 uint32_t regionCount,
5782 const VkImageBlit* pRegions,
5783 VkFilter filter)
5784{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005785 PreCmdBlitImage(commandBuffer, pRegions);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005786
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005787 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005788
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005789 PostCmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005790}
5791
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005792bool PreCmdCopyBufferToImage(
5793 VkCommandBuffer commandBuffer,
5794 const VkBufferImageCopy* pRegions)
5795{
5796 if(pRegions != nullptr)
5797 {
5798 if ((pRegions->imageSubresource.aspectMask &
5799 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
5800 {
5801 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5802 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized enumerator");
5803 return false;
5804 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005805 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005806
5807 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005808}
5809
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005810bool PostCmdCopyBufferToImage(
5811 VkCommandBuffer commandBuffer,
5812 VkBuffer srcBuffer,
5813 VkImage dstImage,
5814 VkImageLayout dstImageLayout,
5815 uint32_t regionCount)
5816{
5817
5818
Jeremy Hayes99a96322015-06-26 12:48:09 -06005819
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07005820 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005821 (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5822 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5823 {
5824 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5825 "vkCmdCopyBufferToImage parameter, VkImageLayout dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005826 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005827 }
5828
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005829
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005830 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005831}
5832
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005833VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage(
5834 VkCommandBuffer commandBuffer,
5835 VkBuffer srcBuffer,
5836 VkImage dstImage,
5837 VkImageLayout dstImageLayout,
5838 uint32_t regionCount,
5839 const VkBufferImageCopy* pRegions)
5840{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005841 PreCmdCopyBufferToImage(commandBuffer, pRegions);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005842
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005843 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005844
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005845 PostCmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005846}
5847
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005848bool PreCmdCopyImageToBuffer(
5849 VkCommandBuffer commandBuffer,
5850 const VkBufferImageCopy* pRegions)
5851{
5852 if(pRegions != nullptr)
5853 {
5854 if ((pRegions->imageSubresource.aspectMask &
5855 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
5856 {
5857 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5858 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized enumerator");
5859 return false;
5860 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005861 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005862
5863 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005864}
5865
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005866bool PostCmdCopyImageToBuffer(
5867 VkCommandBuffer commandBuffer,
5868 VkImage srcImage,
5869 VkImageLayout srcImageLayout,
5870 VkBuffer dstBuffer,
5871 uint32_t regionCount)
5872{
5873
Jeremy Hayes99a96322015-06-26 12:48:09 -06005874
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07005875 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005876 (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5877 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5878 {
5879 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5880 "vkCmdCopyImageToBuffer parameter, VkImageLayout srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005881 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005882 }
5883
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005884
5885
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005886 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005887}
5888
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005889VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer(
5890 VkCommandBuffer commandBuffer,
5891 VkImage srcImage,
5892 VkImageLayout srcImageLayout,
5893 VkBuffer dstBuffer,
5894 uint32_t regionCount,
5895 const VkBufferImageCopy* pRegions)
5896{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005897 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005898
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005899 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005900
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005901 PostCmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005902}
5903
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005904bool PreCmdUpdateBuffer(
5905 VkCommandBuffer commandBuffer,
5906 const uint32_t* pData)
5907{
5908 if(pData != nullptr)
5909 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005910 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005911
5912 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005913}
5914
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005915bool PostCmdUpdateBuffer(
5916 VkCommandBuffer commandBuffer,
5917 VkBuffer dstBuffer,
5918 VkDeviceSize dstOffset,
5919 VkDeviceSize dataSize)
5920{
5921
5922
5923
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005924
5925 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005926}
5927
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005928VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer(
5929 VkCommandBuffer commandBuffer,
5930 VkBuffer dstBuffer,
5931 VkDeviceSize dstOffset,
5932 VkDeviceSize dataSize,
5933 const uint32_t* pData)
5934{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005935 PreCmdUpdateBuffer(commandBuffer, pData);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005936
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005937 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005938
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005939 PostCmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005940}
5941
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005942bool PostCmdFillBuffer(
5943 VkCommandBuffer commandBuffer,
5944 VkBuffer dstBuffer,
5945 VkDeviceSize dstOffset,
5946 VkDeviceSize size,
5947 uint32_t data)
5948{
5949
5950
5951
5952
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005953
5954 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005955}
5956
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005957VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdFillBuffer(
5958 VkCommandBuffer commandBuffer,
5959 VkBuffer dstBuffer,
5960 VkDeviceSize dstOffset,
5961 VkDeviceSize size,
5962 uint32_t data)
5963{
5964 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005965
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005966 PostCmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005967}
5968
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005969bool PreCmdClearColorImage(
5970 VkCommandBuffer commandBuffer,
5971 const VkClearColorValue* pColor,
5972 const VkImageSubresourceRange* pRanges)
5973{
5974 if(pColor != nullptr)
5975 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005976 }
5977
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005978 if(pRanges != nullptr)
5979 {
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -06005980 /* TODO: How should we validate pRanges->aspectMask */
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005981 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005982
5983 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005984}
5985
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005986bool PostCmdClearColorImage(
5987 VkCommandBuffer commandBuffer,
5988 VkImage image,
5989 VkImageLayout imageLayout,
5990 uint32_t rangeCount)
5991{
5992
Jeremy Hayes99a96322015-06-26 12:48:09 -06005993
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07005994 if (((imageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005995 (imageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5996 (imageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5997 {
5998 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5999 "vkCmdClearColorImage parameter, VkImageLayout imageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006000 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006001 }
6002
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006003
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006004 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006005}
6006
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006007VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(
6008 VkCommandBuffer commandBuffer,
6009 VkImage image,
6010 VkImageLayout imageLayout,
6011 const VkClearColorValue* pColor,
6012 uint32_t rangeCount,
6013 const VkImageSubresourceRange* pRanges)
6014{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006015 PreCmdClearColorImage(commandBuffer, pColor, pRanges);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006016
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006017 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006018
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006019 PostCmdClearColorImage(commandBuffer, image, imageLayout, rangeCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006020}
6021
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006022bool PreCmdClearDepthStencilImage(
6023 VkCommandBuffer commandBuffer,
6024 const VkImageSubresourceRange* pRanges)
6025{
6026 if(pRanges != nullptr)
6027 {
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -06006028 /*
6029 * TODO: How do we validation pRanges->aspectMask?
6030 * Allows values are: VK_IMAGE_ASPECT_DEPTH_BIT and
6031 * VK_IMAGE_ASPECT_STENCIL_BIT.
6032 */
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006033 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006034
6035 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006036}
6037
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006038bool PostCmdClearDepthStencilImage(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006039 VkCommandBuffer commandBuffer,
6040 VkImage image,
6041 VkImageLayout imageLayout,
6042 const VkClearDepthStencilValue* pDepthStencil,
6043 uint32_t rangeCount)
6044{
6045
Jeremy Hayes99a96322015-06-26 12:48:09 -06006046
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006047 if (((imageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006048 (imageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6049 (imageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6050 {
6051 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6052 "vkCmdClearDepthStencilImage parameter, VkImageLayout imageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006053 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006054 }
6055
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006056
6057
6058
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006059 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006060}
6061
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006062VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearDepthStencilImage(
6063 VkCommandBuffer commandBuffer,
6064 VkImage image,
6065 VkImageLayout imageLayout,
6066 const VkClearDepthStencilValue* pDepthStencil,
6067 uint32_t rangeCount,
6068 const VkImageSubresourceRange* pRanges)
6069{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006070 PreCmdClearDepthStencilImage(commandBuffer, pRanges);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006071
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006072 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006073
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006074 PostCmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006075}
6076
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006077bool PreCmdClearAttachments(
6078 VkCommandBuffer commandBuffer,
6079 const VkClearColorValue* pColor,
6080 const VkClearRect* pRects)
6081{
6082 if(pColor != nullptr)
6083 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006084 }
6085
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006086 if(pRects != nullptr)
6087 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006088 }
6089
6090 return true;
6091}
6092
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006093VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearAttachments(
6094 VkCommandBuffer commandBuffer,
6095 uint32_t attachmentCount,
6096 const VkClearAttachment* pAttachments,
6097 uint32_t rectCount,
6098 const VkClearRect* pRects)
6099{
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06006100 for (uint32_t i = 0; i < attachmentCount; i++) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006101 PreCmdClearAttachments(commandBuffer, &pAttachments[i].clearValue.color, pRects);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006102 }
6103
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006104 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006105}
6106
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006107bool PreCmdResolveImage(
6108 VkCommandBuffer commandBuffer,
6109 const VkImageResolve* pRegions)
6110{
6111 if(pRegions != nullptr)
6112 {
6113 if ((pRegions->srcSubresource.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->srcSubresource.aspectMask, is an unrecognized enumerator");
6118 return false;
6119 }
6120 if ((pRegions->dstSubresource.aspectMask &
6121 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
6122 {
6123 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6124 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
6125 return false;
6126 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006127 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006128
6129 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006130}
6131
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006132bool PostCmdResolveImage(
6133 VkCommandBuffer commandBuffer,
6134 VkImage srcImage,
6135 VkImageLayout srcImageLayout,
6136 VkImage dstImage,
6137 VkImageLayout dstImageLayout,
6138 uint32_t regionCount)
6139{
6140
Jeremy Hayes99a96322015-06-26 12:48:09 -06006141
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006142 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006143 (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6144 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6145 {
6146 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6147 "vkCmdResolveImage parameter, VkImageLayout srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006148 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006149 }
6150
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006151
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006152 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006153 (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6154 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6155 {
6156 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6157 "vkCmdResolveImage parameter, VkImageLayout dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006158 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006159 }
6160
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006161
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006162 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006163}
6164
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006165VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdResolveImage(
6166 VkCommandBuffer commandBuffer,
6167 VkImage srcImage,
6168 VkImageLayout srcImageLayout,
6169 VkImage dstImage,
6170 VkImageLayout dstImageLayout,
6171 uint32_t regionCount,
6172 const VkImageResolve* pRegions)
6173{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006174 PreCmdResolveImage(commandBuffer, pRegions);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006175
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006176 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006177
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006178 PostCmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006179}
6180
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006181bool PostCmdSetEvent(
6182 VkCommandBuffer commandBuffer,
6183 VkEvent event,
6184 VkPipelineStageFlags stageMask)
6185{
6186
6187
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006188
6189 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006190}
6191
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006192VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetEvent(
6193 VkCommandBuffer commandBuffer,
6194 VkEvent event,
6195 VkPipelineStageFlags stageMask)
6196{
6197 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006198
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006199 PostCmdSetEvent(commandBuffer, event, stageMask);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006200}
6201
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006202bool PostCmdResetEvent(
6203 VkCommandBuffer commandBuffer,
6204 VkEvent event,
6205 VkPipelineStageFlags stageMask)
6206{
6207
6208
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006209
6210 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006211}
6212
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006213VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdResetEvent(
6214 VkCommandBuffer commandBuffer,
6215 VkEvent event,
6216 VkPipelineStageFlags stageMask)
6217{
6218 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006219
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006220 PostCmdResetEvent(commandBuffer, event, stageMask);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006221}
6222
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006223bool PreCmdWaitEvents(
6224 VkCommandBuffer commandBuffer,
6225 const VkEvent* pEvents,
6226 uint32_t memoryBarrierCount,
6227 const VkMemoryBarrier *pMemoryBarriers,
6228 uint32_t bufferMemoryBarrierCount,
6229 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
6230 uint32_t imageMemoryBarrierCount,
6231 const VkImageMemoryBarrier *pImageMemoryBarriers)
6232{
6233 if(pEvents != nullptr)
6234 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06006235 }
6236
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006237 if(pMemoryBarriers != nullptr)
6238 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06006239 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006240
6241 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006242}
6243
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006244bool PostCmdWaitEvents(
6245 VkCommandBuffer commandBuffer,
6246 uint32_t eventCount,
6247 VkPipelineStageFlags srcStageMask,
6248 VkPipelineStageFlags dstStageMask,
6249 uint32_t memoryBarrierCount)
6250{
6251
6252
6253
6254
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006255
6256 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006257}
6258
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006259VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWaitEvents(
6260 VkCommandBuffer commandBuffer,
6261 uint32_t eventCount,
6262 const VkEvent *pEvents,
6263 VkPipelineStageFlags srcStageMask,
6264 VkPipelineStageFlags dstStageMask,
6265 uint32_t memoryBarrierCount,
6266 const VkMemoryBarrier *pMemoryBarriers,
6267 uint32_t bufferMemoryBarrierCount,
6268 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
6269 uint32_t imageMemoryBarrierCount,
6270 const VkImageMemoryBarrier *pImageMemoryBarriers)
6271{
6272 PreCmdWaitEvents(commandBuffer, pEvents, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006273
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006274 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 -06006275
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006276 PostCmdWaitEvents(commandBuffer, eventCount, srcStageMask, dstStageMask, memoryBarrierCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006277}
6278
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006279bool PreCmdPipelineBarrier(
6280 VkCommandBuffer commandBuffer,
6281 uint32_t memoryBarrierCount,
6282 const VkMemoryBarrier *pMemoryBarriers,
6283 uint32_t bufferMemoryBarrierCount,
6284 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
6285 uint32_t imageMemoryBarrierCount,
6286 const VkImageMemoryBarrier *pImageMemoryBarriers)
6287{
6288 if(pMemoryBarriers != nullptr)
6289 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06006290 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006291
6292 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006293}
6294
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006295bool PostCmdPipelineBarrier(
6296 VkCommandBuffer commandBuffer,
6297 VkPipelineStageFlags srcStageMask,
6298 VkPipelineStageFlags dstStageMask,
6299 VkDependencyFlags dependencyFlags,
6300 uint32_t memoryBarrierCount)
6301{
6302
6303
6304
6305
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006306
6307 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006308}
6309
Chia-I Wu9ab61502015-11-06 06:42:02 +08006310VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPipelineBarrier(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006311 VkCommandBuffer commandBuffer,
6312 VkPipelineStageFlags srcStageMask,
6313 VkPipelineStageFlags dstStageMask,
6314 VkDependencyFlags dependencyFlags,
6315 uint32_t memoryBarrierCount,
6316 const VkMemoryBarrier *pMemoryBarriers,
6317 uint32_t bufferMemoryBarrierCount,
Jon Ashburnf19916e2016-01-11 13:12:43 -07006318 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006319 uint32_t imageMemoryBarrierCount,
6320 const VkImageMemoryBarrier *pImageMemoryBarriers)
6321{
6322 PreCmdPipelineBarrier(commandBuffer, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006323
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006324 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 -06006325
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006326 PostCmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006327}
6328
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006329bool PostCmdBeginQuery(
6330 VkCommandBuffer commandBuffer,
6331 VkQueryPool queryPool,
6332 uint32_t slot,
6333 VkQueryControlFlags flags)
6334{
6335
6336
6337
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006338
6339 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006340}
6341
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006342VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBeginQuery(
6343 VkCommandBuffer commandBuffer,
6344 VkQueryPool queryPool,
6345 uint32_t slot,
6346 VkQueryControlFlags flags)
6347{
6348 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006349
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006350 PostCmdBeginQuery(commandBuffer, queryPool, slot, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006351}
6352
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006353bool PostCmdEndQuery(
6354 VkCommandBuffer commandBuffer,
6355 VkQueryPool queryPool,
6356 uint32_t slot)
6357{
6358
6359
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006360
6361 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006362}
6363
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006364VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndQuery(
6365 VkCommandBuffer commandBuffer,
6366 VkQueryPool queryPool,
6367 uint32_t slot)
6368{
6369 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006370
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006371 PostCmdEndQuery(commandBuffer, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006372}
6373
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006374bool PostCmdResetQueryPool(
6375 VkCommandBuffer commandBuffer,
6376 VkQueryPool queryPool,
6377 uint32_t firstQuery,
6378 uint32_t queryCount)
6379{
6380
6381
6382
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006383
6384 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006385}
6386
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006387VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdResetQueryPool(
6388 VkCommandBuffer commandBuffer,
6389 VkQueryPool queryPool,
6390 uint32_t firstQuery,
6391 uint32_t queryCount)
6392{
6393 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006394
Jon Ashburn19d3bf12015-12-30 14:06:55 -07006395 PostCmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006396}
6397
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006398bool PostCmdWriteTimestamp(
6399 VkCommandBuffer commandBuffer,
6400 VkPipelineStageFlagBits pipelineStage,
6401 VkQueryPool queryPool,
6402 uint32_t slot)
6403{
Jeremy Hayes99a96322015-06-26 12:48:09 -06006404
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08006405 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006406
6407 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006408}
6409
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006410VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp(
6411 VkCommandBuffer commandBuffer,
6412 VkPipelineStageFlagBits pipelineStage,
6413 VkQueryPool queryPool,
6414 uint32_t slot)
6415{
6416 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006417
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006418 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006419}
6420
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006421bool PostCmdCopyQueryPoolResults(
6422 VkCommandBuffer commandBuffer,
6423 VkQueryPool queryPool,
6424 uint32_t firstQuery,
6425 uint32_t queryCount,
6426 VkBuffer dstBuffer,
6427 VkDeviceSize dstOffset,
6428 VkDeviceSize stride,
6429 VkQueryResultFlags flags)
6430{
6431
6432
6433
6434
6435
6436
6437
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006438
6439 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006440}
6441
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006442VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyQueryPoolResults(
6443 VkCommandBuffer commandBuffer,
6444 VkQueryPool queryPool,
6445 uint32_t firstQuery,
6446 uint32_t queryCount,
6447 VkBuffer dstBuffer,
6448 VkDeviceSize dstOffset,
6449 VkDeviceSize stride,
6450 VkQueryResultFlags flags)
6451{
6452 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006453
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006454 PostCmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
Jeremy Hayesad367152015-04-17 10:36:53 -06006455}
6456
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006457bool PreCmdPushConstants(
6458 VkCommandBuffer commandBuffer,
6459 const void* pValues)
6460{
6461 if(pValues != nullptr)
6462 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06006463 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006464
6465 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006466}
6467
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006468bool PostCmdPushConstants(
6469 VkCommandBuffer commandBuffer,
6470 VkPipelineLayout layout,
6471 VkShaderStageFlags stageFlags,
6472 uint32_t offset,
6473 uint32_t size)
6474{
6475
6476
6477
6478
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006479
6480 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006481}
6482
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006483VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants(
6484 VkCommandBuffer commandBuffer,
6485 VkPipelineLayout layout,
6486 VkShaderStageFlags stageFlags,
6487 uint32_t offset,
6488 uint32_t size,
6489 const void* pValues)
6490{
Chia-I Wuce9b1772015-11-12 06:09:22 +08006491 PreCmdPushConstants(commandBuffer, pValues);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006492
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006493 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006494
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006495 PostCmdPushConstants(commandBuffer, layout, stageFlags, offset, size);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006496}
6497
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006498bool PreCmdBeginRenderPass(
6499 VkCommandBuffer commandBuffer,
6500 const VkRenderPassBeginInfo* pRenderPassBegin)
6501{
6502 if(pRenderPassBegin != nullptr)
6503 {
6504 if(pRenderPassBegin->sType != VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO)
6505 {
6506 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6507 "vkCmdBeginRenderPass parameter, VkStructureType pRenderPassBegin->sType, is an invalid enumerator");
6508 return false;
6509 }
6510 if(pRenderPassBegin->pClearValues != nullptr)
6511 {
6512 }
Jon Ashburne68a9ff2015-05-25 14:11:37 -06006513 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006514
6515 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006516}
6517
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006518bool PostCmdBeginRenderPass(
6519 VkCommandBuffer commandBuffer,
6520 VkSubpassContents contents)
6521{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006522
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006523 if(contents < VK_SUBPASS_CONTENTS_BEGIN_RANGE ||
6524 contents > VK_SUBPASS_CONTENTS_END_RANGE)
6525 {
6526 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6527 "vkCmdBeginRenderPass parameter, VkSubpassContents contents, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006528 return false;
6529 }
6530
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006531 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006532}
6533
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006534VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBeginRenderPass(
6535 VkCommandBuffer commandBuffer,
6536 const VkRenderPassBeginInfo* pRenderPassBegin,
6537 VkSubpassContents contents)
6538{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006539 PreCmdBeginRenderPass(commandBuffer, pRenderPassBegin);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006540
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006541 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006542
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006543 PostCmdBeginRenderPass(commandBuffer, contents);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006544}
6545
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006546bool PostCmdNextSubpass(
6547 VkCommandBuffer commandBuffer,
6548 VkSubpassContents contents)
6549{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006550
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006551 if(contents < VK_SUBPASS_CONTENTS_BEGIN_RANGE ||
6552 contents > VK_SUBPASS_CONTENTS_END_RANGE)
6553 {
6554 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6555 "vkCmdNextSubpass parameter, VkSubpassContents contents, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006556 return false;
Chia-I Wu08accc62015-07-07 11:50:03 +08006557 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006558
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006559 return true;
Chia-I Wu08accc62015-07-07 11:50:03 +08006560}
6561
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006562VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass(
6563 VkCommandBuffer commandBuffer,
6564 VkSubpassContents contents)
6565{
6566 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
Chia-I Wu08accc62015-07-07 11:50:03 +08006567
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006568 PostCmdNextSubpass(commandBuffer, contents);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006569}
6570
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006571bool PostCmdEndRenderPass(
6572 VkCommandBuffer commandBuffer)
6573{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006574
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006575 return true;
6576}
6577
6578VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass(
6579 VkCommandBuffer commandBuffer)
6580{
6581 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006582
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006583 PostCmdEndRenderPass(commandBuffer);
Chia-I Wu08accc62015-07-07 11:50:03 +08006584}
6585
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006586bool PreCmdExecuteCommands(
6587 VkCommandBuffer commandBuffer,
6588 const VkCommandBuffer* pCommandBuffers)
6589{
6590 if(pCommandBuffers != nullptr)
6591 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006592 }
6593
6594 return true;
6595}
6596
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006597bool PostCmdExecuteCommands(
6598 VkCommandBuffer commandBuffer,
6599 uint32_t commandBuffersCount)
6600{
6601
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006602
6603 return true;
6604}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006605
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006606VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdExecuteCommands(
6607 VkCommandBuffer commandBuffer,
6608 uint32_t commandBuffersCount,
6609 const VkCommandBuffer* pCommandBuffers)
6610{
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006611 PreCmdExecuteCommands(commandBuffer, pCommandBuffers);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006612
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006613 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdExecuteCommands(commandBuffer, commandBuffersCount, pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08006614
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006615 PostCmdExecuteCommands(commandBuffer, commandBuffersCount);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06006616}
6617
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006618VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char* funcName)
6619{
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07006620 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
6621
6622 if (validate_string(data, "vkGetDeviceProcAddr()", "funcName", funcName) == VK_TRUE) {
6623 return NULL;
6624 }
6625
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006626 if (!strcmp(funcName, "vkGetDeviceProcAddr"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006627 return (PFN_vkVoidFunction) vkGetDeviceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006628 if (!strcmp(funcName, "vkDestroyDevice"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006629 return (PFN_vkVoidFunction) vkDestroyDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006630 if (!strcmp(funcName, "vkGetDeviceQueue"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006631 return (PFN_vkVoidFunction) vkGetDeviceQueue;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006632 if (!strcmp(funcName, "vkQueueSubmit"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006633 return (PFN_vkVoidFunction) vkQueueSubmit;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006634 if (!strcmp(funcName, "vkQueueWaitIdle"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006635 return (PFN_vkVoidFunction) vkQueueWaitIdle;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006636 if (!strcmp(funcName, "vkDeviceWaitIdle"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006637 return (PFN_vkVoidFunction) vkDeviceWaitIdle;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006638 if (!strcmp(funcName, "vkAllocateMemory"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006639 return (PFN_vkVoidFunction) vkAllocateMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006640 if (!strcmp(funcName, "vkMapMemory"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006641 return (PFN_vkVoidFunction) vkMapMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006642 if (!strcmp(funcName, "vkFlushMappedMemoryRanges"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006643 return (PFN_vkVoidFunction) vkFlushMappedMemoryRanges;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006644 if (!strcmp(funcName, "vkInvalidateMappedMemoryRanges"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006645 return (PFN_vkVoidFunction) vkInvalidateMappedMemoryRanges;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006646 if (!strcmp(funcName, "vkCreateFence"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006647 return (PFN_vkVoidFunction) vkCreateFence;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006648 if (!strcmp(funcName, "vkResetFences"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006649 return (PFN_vkVoidFunction) vkResetFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006650 if (!strcmp(funcName, "vkGetFenceStatus"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006651 return (PFN_vkVoidFunction) vkGetFenceStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006652 if (!strcmp(funcName, "vkWaitForFences"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006653 return (PFN_vkVoidFunction) vkWaitForFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006654 if (!strcmp(funcName, "vkCreateSemaphore"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006655 return (PFN_vkVoidFunction) vkCreateSemaphore;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006656 if (!strcmp(funcName, "vkCreateEvent"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006657 return (PFN_vkVoidFunction) vkCreateEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006658 if (!strcmp(funcName, "vkGetEventStatus"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006659 return (PFN_vkVoidFunction) vkGetEventStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006660 if (!strcmp(funcName, "vkSetEvent"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006661 return (PFN_vkVoidFunction) vkSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006662 if (!strcmp(funcName, "vkResetEvent"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006663 return (PFN_vkVoidFunction) vkResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006664 if (!strcmp(funcName, "vkCreateQueryPool"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006665 return (PFN_vkVoidFunction) vkCreateQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006666 if (!strcmp(funcName, "vkGetQueryPoolResults"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006667 return (PFN_vkVoidFunction) vkGetQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006668 if (!strcmp(funcName, "vkCreateBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006669 return (PFN_vkVoidFunction) vkCreateBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006670 if (!strcmp(funcName, "vkCreateBufferView"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006671 return (PFN_vkVoidFunction) vkCreateBufferView;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006672 if (!strcmp(funcName, "vkCreateImage"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006673 return (PFN_vkVoidFunction) vkCreateImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006674 if (!strcmp(funcName, "vkGetImageSubresourceLayout"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006675 return (PFN_vkVoidFunction) vkGetImageSubresourceLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006676 if (!strcmp(funcName, "vkCreateImageView"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006677 return (PFN_vkVoidFunction) vkCreateImageView;
Michael Lentine03d8e572015-09-15 14:59:14 -05006678 if (!strcmp(funcName, "vkCreateShaderModule"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006679 return (PFN_vkVoidFunction) vkCreateShaderModule;
Jon Ashburnc669cc62015-07-09 15:02:25 -06006680 if (!strcmp(funcName, "vkCreateGraphicsPipelines"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006681 return (PFN_vkVoidFunction) vkCreateGraphicsPipelines;
Jon Ashburnc669cc62015-07-09 15:02:25 -06006682 if (!strcmp(funcName, "vkCreateComputePipelines"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006683 return (PFN_vkVoidFunction) vkCreateComputePipelines;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006684 if (!strcmp(funcName, "vkCreatePipelineLayout"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006685 return (PFN_vkVoidFunction) vkCreatePipelineLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006686 if (!strcmp(funcName, "vkCreateSampler"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006687 return (PFN_vkVoidFunction) vkCreateSampler;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006688 if (!strcmp(funcName, "vkCreateDescriptorSetLayout"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006689 return (PFN_vkVoidFunction) vkCreateDescriptorSetLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006690 if (!strcmp(funcName, "vkCreateDescriptorPool"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006691 return (PFN_vkVoidFunction) vkCreateDescriptorPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006692 if (!strcmp(funcName, "vkResetDescriptorPool"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006693 return (PFN_vkVoidFunction) vkResetDescriptorPool;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006694 if (!strcmp(funcName, "vkAllocateDescriptorSets"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006695 return (PFN_vkVoidFunction) vkAllocateDescriptorSets;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06006696 if (!strcmp(funcName, "vkCmdSetViewport"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006697 return (PFN_vkVoidFunction) vkCmdSetViewport;
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06006698 if (!strcmp(funcName, "vkCmdSetScissor"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006699 return (PFN_vkVoidFunction) vkCmdSetScissor;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06006700 if (!strcmp(funcName, "vkCmdSetLineWidth"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006701 return (PFN_vkVoidFunction) vkCmdSetLineWidth;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06006702 if (!strcmp(funcName, "vkCmdSetDepthBias"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006703 return (PFN_vkVoidFunction) vkCmdSetDepthBias;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06006704 if (!strcmp(funcName, "vkCmdSetBlendConstants"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006705 return (PFN_vkVoidFunction) vkCmdSetBlendConstants;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06006706 if (!strcmp(funcName, "vkCmdSetDepthBounds"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006707 return (PFN_vkVoidFunction) vkCmdSetDepthBounds;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06006708 if (!strcmp(funcName, "vkCmdSetStencilCompareMask"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006709 return (PFN_vkVoidFunction) vkCmdSetStencilCompareMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06006710 if (!strcmp(funcName, "vkCmdSetStencilWriteMask"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006711 return (PFN_vkVoidFunction) vkCmdSetStencilWriteMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06006712 if (!strcmp(funcName, "vkCmdSetStencilReference"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006713 return (PFN_vkVoidFunction) vkCmdSetStencilReference;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006714 if (!strcmp(funcName, "vkAllocateCommandBuffers"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006715 return (PFN_vkVoidFunction) vkAllocateCommandBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006716 if (!strcmp(funcName, "vkBeginCommandBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006717 return (PFN_vkVoidFunction) vkBeginCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006718 if (!strcmp(funcName, "vkEndCommandBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006719 return (PFN_vkVoidFunction) vkEndCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006720 if (!strcmp(funcName, "vkResetCommandBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006721 return (PFN_vkVoidFunction) vkResetCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006722 if (!strcmp(funcName, "vkCmdBindPipeline"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006723 return (PFN_vkVoidFunction) vkCmdBindPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006724 if (!strcmp(funcName, "vkCmdBindDescriptorSets"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006725 return (PFN_vkVoidFunction) vkCmdBindDescriptorSets;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006726 if (!strcmp(funcName, "vkCmdBindVertexBuffers"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006727 return (PFN_vkVoidFunction) vkCmdBindVertexBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006728 if (!strcmp(funcName, "vkCmdBindIndexBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006729 return (PFN_vkVoidFunction) vkCmdBindIndexBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006730 if (!strcmp(funcName, "vkCmdDraw"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006731 return (PFN_vkVoidFunction) vkCmdDraw;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006732 if (!strcmp(funcName, "vkCmdDrawIndexed"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006733 return (PFN_vkVoidFunction) vkCmdDrawIndexed;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006734 if (!strcmp(funcName, "vkCmdDrawIndirect"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006735 return (PFN_vkVoidFunction) vkCmdDrawIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006736 if (!strcmp(funcName, "vkCmdDrawIndexedIndirect"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006737 return (PFN_vkVoidFunction) vkCmdDrawIndexedIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006738 if (!strcmp(funcName, "vkCmdDispatch"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006739 return (PFN_vkVoidFunction) vkCmdDispatch;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006740 if (!strcmp(funcName, "vkCmdDispatchIndirect"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006741 return (PFN_vkVoidFunction) vkCmdDispatchIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006742 if (!strcmp(funcName, "vkCmdCopyBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006743 return (PFN_vkVoidFunction) vkCmdCopyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006744 if (!strcmp(funcName, "vkCmdCopyImage"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006745 return (PFN_vkVoidFunction) vkCmdCopyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006746 if (!strcmp(funcName, "vkCmdBlitImage"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006747 return (PFN_vkVoidFunction) vkCmdBlitImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006748 if (!strcmp(funcName, "vkCmdCopyBufferToImage"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006749 return (PFN_vkVoidFunction) vkCmdCopyBufferToImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006750 if (!strcmp(funcName, "vkCmdCopyImageToBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006751 return (PFN_vkVoidFunction) vkCmdCopyImageToBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006752 if (!strcmp(funcName, "vkCmdUpdateBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006753 return (PFN_vkVoidFunction) vkCmdUpdateBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006754 if (!strcmp(funcName, "vkCmdFillBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006755 return (PFN_vkVoidFunction) vkCmdFillBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006756 if (!strcmp(funcName, "vkCmdClearColorImage"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006757 return (PFN_vkVoidFunction) vkCmdClearColorImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006758 if (!strcmp(funcName, "vkCmdResolveImage"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006759 return (PFN_vkVoidFunction) vkCmdResolveImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006760 if (!strcmp(funcName, "vkCmdSetEvent"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006761 return (PFN_vkVoidFunction) vkCmdSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006762 if (!strcmp(funcName, "vkCmdResetEvent"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006763 return (PFN_vkVoidFunction) vkCmdResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006764 if (!strcmp(funcName, "vkCmdWaitEvents"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006765 return (PFN_vkVoidFunction) vkCmdWaitEvents;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006766 if (!strcmp(funcName, "vkCmdPipelineBarrier"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006767 return (PFN_vkVoidFunction) vkCmdPipelineBarrier;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006768 if (!strcmp(funcName, "vkCmdBeginQuery"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006769 return (PFN_vkVoidFunction) vkCmdBeginQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006770 if (!strcmp(funcName, "vkCmdEndQuery"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006771 return (PFN_vkVoidFunction) vkCmdEndQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006772 if (!strcmp(funcName, "vkCmdResetQueryPool"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006773 return (PFN_vkVoidFunction) vkCmdResetQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006774 if (!strcmp(funcName, "vkCmdWriteTimestamp"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006775 return (PFN_vkVoidFunction) vkCmdWriteTimestamp;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006776 if (!strcmp(funcName, "vkCmdCopyQueryPoolResults"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006777 return (PFN_vkVoidFunction) vkCmdCopyQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006778 if (!strcmp(funcName, "vkCreateFramebuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006779 return (PFN_vkVoidFunction) vkCreateFramebuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006780 if (!strcmp(funcName, "vkCreateRenderPass"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006781 return (PFN_vkVoidFunction) vkCreateRenderPass;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006782 if (!strcmp(funcName, "vkCmdBeginRenderPass"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006783 return (PFN_vkVoidFunction) vkCmdBeginRenderPass;
Chia-I Wu08accc62015-07-07 11:50:03 +08006784 if (!strcmp(funcName, "vkCmdNextSubpass"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006785 return (PFN_vkVoidFunction) vkCmdNextSubpass;
Jon Ashburneab34492015-06-01 09:37:38 -06006786
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006787 if (device == NULL) {
6788 return NULL;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006789 }
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006790
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006791 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006792 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006793 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006794}
6795
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006796VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char* funcName)
6797{
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006798 if (!strcmp(funcName, "vkGetInstanceProcAddr"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006799 return (PFN_vkVoidFunction) vkGetInstanceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006800 if (!strcmp(funcName, "vkCreateInstance"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006801 return (PFN_vkVoidFunction) vkCreateInstance;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006802 if (!strcmp(funcName, "vkDestroyInstance"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006803 return (PFN_vkVoidFunction) vkDestroyInstance;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006804 if (!strcmp(funcName, "vkCreateDevice"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006805 return (PFN_vkVoidFunction) vkCreateDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006806 if (!strcmp(funcName, "vkEnumeratePhysicalDevices"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006807 return (PFN_vkVoidFunction) vkEnumeratePhysicalDevices;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006808 if (!strcmp(funcName, "vkGetPhysicalDeviceProperties"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006809 return (PFN_vkVoidFunction) vkGetPhysicalDeviceProperties;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006810 if (!strcmp(funcName, "vkGetPhysicalDeviceFeatures"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006811 return (PFN_vkVoidFunction) vkGetPhysicalDeviceFeatures;
Courtney Goeltzenleuchter2caec862015-07-12 12:52:09 -06006812 if (!strcmp(funcName, "vkGetPhysicalDeviceFormatProperties"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006813 return (PFN_vkVoidFunction) vkGetPhysicalDeviceFormatProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06006814 if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006815 return (PFN_vkVoidFunction) vkEnumerateInstanceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06006816 if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006817 return (PFN_vkVoidFunction) vkEnumerateInstanceExtensionProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06006818 if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006819 return (PFN_vkVoidFunction) vkEnumerateDeviceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06006820 if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006821 return (PFN_vkVoidFunction) vkEnumerateDeviceExtensionProperties;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06006822
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006823 if (instance == NULL) {
6824 return NULL;
6825 }
6826
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006827 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07006828
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006829 PFN_vkVoidFunction fptr = debug_report_get_instance_proc_addr(data->report_data, funcName);
6830 if(fptr)
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06006831 return fptr;
6832
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006833 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07006834 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006835 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06006836}