blob: 114c714527ee032e524bc266de09a038e5eb3afc [file] [log] [blame]
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -07001/* Copyright (c) 2015-2016 The Khronos Group Inc.
2 * Copyright (c) 2015-2016 Valve Corporation
3 * Copyright (c) 2015-2016 LunarG, Inc.
4 * Copyright (C) 2015-2016 Google Inc.
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005 *
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -07006 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and/or associated documentation files (the "Materials"), to
8 * deal in the Materials without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Materials, and to permit persons to whom the Materials
11 * are furnished to do so, subject to the following conditions:
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060012 *
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070013 * The above copyright notice(s) and this permission notice shall be included
14 * in all copies or substantial portions of the Materials.
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060015 *
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070016 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060017 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070018 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19 *
20 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
21 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
22 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
23 * USE OR OTHER DEALINGS IN THE MATERIALS
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060024 *
25 * Author: Jeremy Hayes <jeremy@lunarg.com>
26 * Author: Tony Barbour <tony@LunarG.com>
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070027 * Author: Mark Lobodzinski <mark@LunarG.com>
Dustin Graves1e92cd72016-02-09 14:00:18 -070028 * Author: Dustin Graves <dustin@lunarg.com>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060029 */
30
31#include <stdio.h>
32#include <stdlib.h>
33#include <string.h>
34
35#include <iostream>
36#include <string>
37#include <sstream>
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050038#include <unordered_map>
Michael Lentine157a2ec2016-01-27 11:25:05 -060039#include <unordered_set>
Jeremy Hayes99a96322015-06-26 12:48:09 -060040#include <vector>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060041
Tobin Ehlisb835d1b2015-07-03 10:34:49 -060042#include "vk_loader_platform.h"
David Pinedo9316d3b2015-11-06 12:54:48 -070043#include "vulkan/vk_layer.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060044#include "vk_layer_config.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060045#include "vk_enum_validate_helper.h"
46#include "vk_struct_validate_helper.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060047
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060048#include "vk_layer_table.h"
49#include "vk_layer_data.h"
50#include "vk_layer_logging.h"
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -060051#include "vk_layer_extension_utils.h"
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -070052#include "vk_layer_utils.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060053
Dustin Graves1e92cd72016-02-09 14:00:18 -070054#include "param_check.h"
55
Cody Northrop55443ef2015-09-28 15:09:32 -060056struct layer_data {
Jeremy Hayes99a96322015-06-26 12:48:09 -060057 debug_report_data *report_data;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070058 std::vector<VkDebugReportCallbackEXT> logging_callback;
Cody Northrop55443ef2015-09-28 15:09:32 -060059
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070060 //TODO: Split instance/device structs
61 //Device Data
62 //Map for queue family index to queue count
Michael Lentinebdf744f2016-01-27 15:43:43 -060063 std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
64
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070065 layer_data() :
66 report_data(nullptr)
67 {};
Cody Northrop55443ef2015-09-28 15:09:32 -060068};
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050069
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070070static std::unordered_map<void*, layer_data*> layer_data_map;
Jeremy Hayes99a96322015-06-26 12:48:09 -060071static device_table_map pc_device_table_map;
72static instance_table_map pc_instance_table_map;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060073
Jeremy Hayes99a96322015-06-26 12:48:09 -060074// "my instance data"
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070075debug_report_data *mid(VkInstance object)
76{
Jeremy Hayes99a96322015-06-26 12:48:09 -060077 dispatch_key key = get_dispatch_key(object);
Tobin Ehlisbfbac252015-09-01 11:46:36 -060078 layer_data *data = get_my_data_ptr(key, layer_data_map);
Jeremy Hayes99a96322015-06-26 12:48:09 -060079#if DISPATCH_MAP_DEBUG
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070080 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 -060081#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060082 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060083
84 return data->report_data;
85}
86
87// "my device data"
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070088debug_report_data *mdd(void* object)
89{
Jeremy Hayes99a96322015-06-26 12:48:09 -060090 dispatch_key key = get_dispatch_key(object);
91 layer_data *data = get_my_data_ptr(key, layer_data_map);
92#if DISPATCH_MAP_DEBUG
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070093 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 -060094#endif
Courtney Goeltzenleuchter876a4f52015-07-17 10:20:11 -060095 assert(data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -060096 return data->report_data;
97}
98
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070099static void InitParamChecker(layer_data *data, const VkAllocationCallbacks *pAllocator)
100{
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700101 VkDebugReportCallbackEXT callback;
Mark Lobodzinski8cbde242016-02-23 09:58:39 -0700102 uint32_t report_flags = getLayerOptionFlags("lunarg_param_checker.report_flags", 0);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600103
104 uint32_t debug_action = 0;
Mark Lobodzinski8cbde242016-02-23 09:58:39 -0700105 getLayerOptionEnum("lunarg_param_checker.debug_action", (uint32_t *) &debug_action);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700106 if(debug_action & VK_DBG_LAYER_ACTION_LOG_MSG)
107 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600108 FILE *log_output = NULL;
Mark Lobodzinski8cbde242016-02-23 09:58:39 -0700109 const char* option_str = getLayerOption("lunarg_param_checker.log_filename");
110 log_output = getLayerLogOutput(option_str, "lunarg_param_checker");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700111 VkDebugReportCallbackCreateInfoEXT dbgCreateInfo;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700112 memset(&dbgCreateInfo, 0, sizeof(dbgCreateInfo));
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700113 dbgCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700114 dbgCreateInfo.flags = report_flags;
115 dbgCreateInfo.pfnCallback = log_callback;
116 dbgCreateInfo.pUserData = log_output;
117
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700118 layer_create_msg_callback(data->report_data, &dbgCreateInfo, pAllocator, &callback);
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -0600119 data->logging_callback.push_back(callback);
120 }
121
122 if (debug_action & VK_DBG_LAYER_ACTION_DEBUG_OUTPUT) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700123 VkDebugReportCallbackCreateInfoEXT dbgCreateInfo;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700124 memset(&dbgCreateInfo, 0, sizeof(dbgCreateInfo));
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700125 dbgCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700126 dbgCreateInfo.flags = report_flags;
127 dbgCreateInfo.pfnCallback = win32_debug_output_msg;
128 dbgCreateInfo.pUserData = NULL;
129
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700130 layer_create_msg_callback(data->report_data, &dbgCreateInfo, pAllocator, &callback);
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -0600131 data->logging_callback.push_back(callback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600132 }
133}
134
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700135VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700136 VkInstance instance,
137 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700138 const VkAllocationCallbacks *pAllocator,
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700139 VkDebugReportCallbackEXT* pMsgCallback)
140{
141 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
142 VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600143
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700144 if (result == VK_SUCCESS)
145 {
146 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
147 result = layer_create_msg_callback(data->report_data, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600148 }
149
150 return result;
151}
152
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700153VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(
154 VkInstance instance,
155 VkDebugReportCallbackEXT msgCallback,
156 const VkAllocationCallbacks *pAllocator)
157{
158 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700159 pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600160
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700161 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700162 layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -0600163}
164
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700165VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(
166 VkInstance instance,
167 VkDebugReportFlagsEXT flags,
168 VkDebugReportObjectTypeEXT objType,
169 uint64_t object,
170 size_t location,
171 int32_t msgCode,
172 const char* pLayerPrefix,
173 const char* pMsg)
174{
175 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
176 pTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700177}
178
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700179static const VkExtensionProperties instance_extensions[] = {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700180 {
181 VK_EXT_DEBUG_REPORT_EXTENSION_NAME,
182 VK_EXT_DEBUG_REPORT_SPEC_VERSION
183 }
184};
Tony Barbour59a47322015-06-24 16:06:58 -0600185
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700186VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(
187 const char *pLayerName,
188 uint32_t *pCount,
189 VkExtensionProperties* pProperties)
190{
191 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600192}
193
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700194static const VkLayerProperties pc_global_layers[] = {
195 {
196 "VK_LAYER_LUNARG_param_checker",
197 VK_API_VERSION,
Courtney Goeltzenleuchterf6ca21c2016-02-06 17:22:25 -0700198 1,
Courtney Goeltzenleuchtera4784fb2016-02-12 13:22:04 -0700199 "LunarG Validation Layer",
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700200 }
201};
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700202
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700203VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(
204 uint32_t *pCount,
205 VkLayerProperties* pProperties)
206{
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -0600207 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers),
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700208 pc_global_layers,
209 pCount, pProperties);
Tony Barbour59a47322015-06-24 16:06:58 -0600210}
211
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700212VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(
213 VkPhysicalDevice physicalDevice,
214 const char* pLayerName,
215 uint32_t* pCount,
216 VkExtensionProperties* pProperties)
217{
Mark Lobodzinski8cbde242016-02-23 09:58:39 -0700218 /* param_checker does not have any physical device extensions */
Jon Ashburn751c4842015-11-02 17:37:20 -0700219 if (pLayerName == NULL) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700220 return get_dispatch_table(pc_instance_table_map, physicalDevice)->EnumerateDeviceExtensionProperties(
221 physicalDevice,
222 NULL,
223 pCount,
224 pProperties);
Jon Ashburn751c4842015-11-02 17:37:20 -0700225 } else {
226 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
227 }
Jeremy Hayesad367152015-04-17 10:36:53 -0600228}
229
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700230VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(
231 VkPhysicalDevice physicalDevice,
232 uint32_t* pCount,
233 VkLayerProperties* pProperties)
234{
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -0700235
Mark Lobodzinski8cbde242016-02-23 09:58:39 -0700236 /* param_checker's physical device layers are the same as global */
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700237 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers,
238 pCount, pProperties);
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -0600239}
Jeremy Hayes99a96322015-06-26 12:48:09 -0600240
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700241static
242std::string EnumeratorString(VkResult const& enumerator)
243{
244 switch(enumerator)
245 {
246 case VK_RESULT_MAX_ENUM:
247 {
248 return "VK_RESULT_MAX_ENUM";
249 break;
250 }
251 case VK_ERROR_LAYER_NOT_PRESENT:
252 {
253 return "VK_ERROR_LAYER_NOT_PRESENT";
254 break;
255 }
256 case VK_ERROR_INCOMPATIBLE_DRIVER:
257 {
258 return "VK_ERROR_INCOMPATIBLE_DRIVER";
259 break;
260 }
261 case VK_ERROR_MEMORY_MAP_FAILED:
262 {
263 return "VK_ERROR_MEMORY_MAP_FAILED";
264 break;
265 }
266 case VK_INCOMPLETE:
267 {
268 return "VK_INCOMPLETE";
269 break;
270 }
271 case VK_ERROR_OUT_OF_HOST_MEMORY:
272 {
273 return "VK_ERROR_OUT_OF_HOST_MEMORY";
274 break;
275 }
276 case VK_ERROR_INITIALIZATION_FAILED:
277 {
278 return "VK_ERROR_INITIALIZATION_FAILED";
279 break;
280 }
281 case VK_NOT_READY:
282 {
283 return "VK_NOT_READY";
284 break;
285 }
286 case VK_ERROR_OUT_OF_DEVICE_MEMORY:
287 {
288 return "VK_ERROR_OUT_OF_DEVICE_MEMORY";
289 break;
290 }
291 case VK_EVENT_SET:
292 {
293 return "VK_EVENT_SET";
294 break;
295 }
296 case VK_TIMEOUT:
297 {
298 return "VK_TIMEOUT";
299 break;
300 }
301 case VK_EVENT_RESET:
302 {
303 return "VK_EVENT_RESET";
304 break;
305 }
306 case VK_SUCCESS:
307 {
308 return "VK_SUCCESS";
309 break;
310 }
311 case VK_ERROR_EXTENSION_NOT_PRESENT:
312 {
313 return "VK_ERROR_EXTENSION_NOT_PRESENT";
314 break;
315 }
316 case VK_ERROR_DEVICE_LOST:
317 {
318 return "VK_ERROR_DEVICE_LOST";
319 break;
320 }
321 default:
322 {
323 return "unrecognized enumerator";
324 break;
325 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600326 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600327}
328
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700329static
330bool ValidateEnumerator(VkFormatFeatureFlagBits const& enumerator)
331{
Courtney Goeltzenleuchterf1ece602015-09-10 16:25:49 -0600332 VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600333 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT |
334 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
335 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT |
336 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
337 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT |
338 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT |
339 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
340 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT |
341 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
Cody Northrop61d6dd62015-08-18 14:58:29 -0600342 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT |
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700343 VK_FORMAT_FEATURE_BLIT_SRC_BIT |
344 VK_FORMAT_FEATURE_BLIT_DST_BIT |
Jon Ashburn766866a2016-01-22 15:39:20 -0700345 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700346 if(enumerator & (~allFlags))
347 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600348 return false;
349 }
350
351 return true;
352}
353
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700354static
355std::string EnumeratorString(VkFormatFeatureFlagBits const& enumerator)
356{
357 if(!ValidateEnumerator(enumerator))
358 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600359 return "unrecognized enumerator";
360 }
361
362 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700363 if(enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT)
364 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600365 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
366 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700367 if(enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT)
368 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600369 strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
370 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700371 if(enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT)
372 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600373 strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
374 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700375 if(enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT)
376 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600377 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
378 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700379 if(enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)
380 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600381 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
382 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700383 if(enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT)
384 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600385 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
386 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700387 if(enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)
388 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600389 strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
390 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700391 if(enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT)
392 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600393 strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
394 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700395 if(enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT)
396 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600397 strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
398 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700399 if(enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)
400 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600401 strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
402 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700403 if(enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT)
404 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800405 strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600406 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700407 if(enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT)
408 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800409 strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
Cody Northrop61d6dd62015-08-18 14:58:29 -0600410 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700411 if(enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT)
412 {
Jon Ashburn766866a2016-01-22 15:39:20 -0700413 strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
414 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600415
416 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700417 for(auto const& string : strings)
418 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600419 enumeratorString += string;
420
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700421 if(string != strings.back())
422 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600423 enumeratorString += '|';
424 }
425 }
426
427 return enumeratorString;
428}
429
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700430static
431bool ValidateEnumerator(VkImageUsageFlagBits const& enumerator)
432{
433 VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT |
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600434 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700435 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
436 VK_IMAGE_USAGE_STORAGE_BIT |
437 VK_IMAGE_USAGE_SAMPLED_BIT |
438 VK_IMAGE_USAGE_TRANSFER_DST_BIT |
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600439 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT |
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800440 VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700441 if(enumerator & (~allFlags))
442 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600443 return false;
444 }
445
446 return true;
447}
448
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700449static
450std::string EnumeratorString(VkImageUsageFlagBits const& enumerator)
451{
452 if(!ValidateEnumerator(enumerator))
453 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600454 return "unrecognized enumerator";
455 }
456
457 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700458 if(enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT)
459 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600460 strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
461 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700462 if(enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
463 {
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -0600464 strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600465 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700466 if(enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)
467 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600468 strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
469 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700470 if(enumerator & VK_IMAGE_USAGE_STORAGE_BIT)
471 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600472 strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
473 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700474 if(enumerator & VK_IMAGE_USAGE_SAMPLED_BIT)
475 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600476 strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
477 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700478 if(enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT)
479 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800480 strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600481 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700482 if(enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT)
483 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600484 strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
485 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700486 if(enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT)
487 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800488 strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600489 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600490
491 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700492 for(auto const& string : strings)
493 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600494 enumeratorString += string;
495
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700496 if(string != strings.back())
497 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600498 enumeratorString += '|';
499 }
500 }
501
502 return enumeratorString;
503}
504
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700505static
506bool ValidateEnumerator(VkQueueFlagBits const& enumerator)
507{
508 VkQueueFlagBits allFlags = (VkQueueFlagBits)(
509 VK_QUEUE_TRANSFER_BIT |
510 VK_QUEUE_COMPUTE_BIT |
511 VK_QUEUE_SPARSE_BINDING_BIT |
512 VK_QUEUE_GRAPHICS_BIT);
513 if(enumerator & (~allFlags))
514 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600515 return false;
516 }
517
518 return true;
519}
520
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700521static
522std::string EnumeratorString(VkQueueFlagBits const& enumerator)
523{
524 if(!ValidateEnumerator(enumerator))
525 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600526 return "unrecognized enumerator";
527 }
528
529 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700530 if(enumerator & VK_QUEUE_TRANSFER_BIT)
531 {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800532 strings.push_back("VK_QUEUE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600533 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700534 if(enumerator & VK_QUEUE_COMPUTE_BIT)
535 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600536 strings.push_back("VK_QUEUE_COMPUTE_BIT");
537 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700538 if(enumerator & VK_QUEUE_SPARSE_BINDING_BIT)
539 {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800540 strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600541 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700542 if(enumerator & VK_QUEUE_GRAPHICS_BIT)
543 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600544 strings.push_back("VK_QUEUE_GRAPHICS_BIT");
545 }
546
547 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700548 for(auto const& string : strings)
549 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600550 enumeratorString += string;
551
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700552 if(string != strings.back())
553 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600554 enumeratorString += '|';
555 }
556 }
557
558 return enumeratorString;
559}
560
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700561static
562bool ValidateEnumerator(VkMemoryPropertyFlagBits const& enumerator)
563{
564 VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT |
565 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT |
566 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
567 VK_MEMORY_PROPERTY_HOST_CACHED_BIT |
568 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
569 if(enumerator & (~allFlags))
570 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600571 return false;
572 }
573
574 return true;
575}
576
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700577static
578std::string EnumeratorString(VkMemoryPropertyFlagBits const& enumerator)
579{
580 if(!ValidateEnumerator(enumerator))
581 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600582 return "unrecognized enumerator";
583 }
584
585 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700586 if(enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT)
587 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600588 strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
589 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700590 if(enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
591 {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800592 strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600593 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700594 if(enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)
595 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600596 strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
597 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700598 if(enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT)
599 {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800600 strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600601 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700602 if(enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)
603 {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800604 strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600605 }
606
607 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700608 for(auto const& string : strings)
609 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600610 enumeratorString += string;
611
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700612 if(string != strings.back())
613 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600614 enumeratorString += '|';
615 }
616 }
617
618 return enumeratorString;
619}
620
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700621static
622bool ValidateEnumerator(VkMemoryHeapFlagBits const& enumerator)
623{
624 VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
625 if(enumerator & (~allFlags))
626 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600627 return false;
628 }
629
630 return true;
631}
632
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700633static
634std::string EnumeratorString(VkMemoryHeapFlagBits const& enumerator)
635{
636 if(!ValidateEnumerator(enumerator))
637 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600638 return "unrecognized enumerator";
639 }
640
641 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700642 if(enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT)
643 {
Chia-I Wuc8ea02f2015-10-27 18:53:22 +0800644 strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600645 }
646
647 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700648 for(auto const& string : strings)
649 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600650 enumeratorString += string;
651
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700652 if(string != strings.back())
653 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600654 enumeratorString += '|';
655 }
656 }
657
658 return enumeratorString;
659}
660
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700661static
662bool ValidateEnumerator(VkSparseImageFormatFlagBits const& enumerator)
663{
664 VkSparseImageFormatFlagBits allFlags = (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800665 VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT |
666 VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700667 if(enumerator & (~allFlags))
668 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600669 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600670 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600671
672 return true;
673}
674
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700675static
676std::string EnumeratorString(VkSparseImageFormatFlagBits const& enumerator)
677{
678 if(!ValidateEnumerator(enumerator))
679 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600680 return "unrecognized enumerator";
Jeremy Hayes99a96322015-06-26 12:48:09 -0600681 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600682
683 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700684 if(enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT)
685 {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800686 strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600687 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700688 if(enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT)
689 {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800690 strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600691 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700692 if(enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT)
693 {
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800694 strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600695 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600696
697 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700698 for(auto const& string : strings)
699 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600700 enumeratorString += string;
701
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700702 if(string != strings.back())
703 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600704 enumeratorString += '|';
705 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600706 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600707
708 return enumeratorString;
709}
710
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700711static
712bool ValidateEnumerator(VkFenceCreateFlagBits const& enumerator)
713{
714 VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
715 if(enumerator & (~allFlags))
716 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600717 return false;
718 }
719
720 return true;
721}
722
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700723static
724std::string EnumeratorString(VkFenceCreateFlagBits const& enumerator)
725{
726 if(!ValidateEnumerator(enumerator))
727 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600728 return "unrecognized enumerator";
729 }
730
731 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700732 if(enumerator & VK_FENCE_CREATE_SIGNALED_BIT)
733 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600734 strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
735 }
736
737 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700738 for(auto const& string : strings)
739 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600740 enumeratorString += string;
741
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700742 if(string != strings.back())
743 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600744 enumeratorString += '|';
745 }
746 }
747
748 return enumeratorString;
749}
750
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700751static
752bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const& enumerator)
753{
754 VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT |
Courtney Goeltzenleuchterfe1b36e2015-10-15 16:57:32 -0600755 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
756 VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT |
757 VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
758 VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT |
759 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
760 VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT |
761 VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
762 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
763 VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
764 VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700765 if(enumerator & (~allFlags))
766 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600767 return false;
768 }
769
770 return true;
771}
772
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700773static
774std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const& enumerator)
775{
776 if(!ValidateEnumerator(enumerator))
777 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600778 return "unrecognized enumerator";
779 }
780
781 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700782 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT)
783 {
784 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600785 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700786 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT)
787 {
788 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600789 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700790 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT)
791 {
792 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600793 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700794 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT)
795 {
796 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600797 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700798 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT)
799 {
800 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600801 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700802 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT)
803 {
804 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600805 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700806 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT)
807 {
808 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600809 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700810 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT)
811 {
812 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600813 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700814 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT)
815 {
816 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600817 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700818 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT)
819 {
820 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600821 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700822 if(enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT)
823 {
824 strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600825 }
826
827 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700828 for(auto const& string : strings)
829 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600830 enumeratorString += string;
831
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700832 if(string != strings.back())
833 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600834 enumeratorString += '|';
835 }
836 }
837
838 return enumeratorString;
839}
840
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700841static
842bool ValidateEnumerator(VkQueryResultFlagBits const& enumerator)
843{
844 VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT |
845 VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
846 VK_QUERY_RESULT_WAIT_BIT |
847 VK_QUERY_RESULT_64_BIT);
848 if(enumerator & (~allFlags))
849 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600850 return false;
851 }
852
853 return true;
854}
855
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700856static
857std::string EnumeratorString(VkQueryResultFlagBits const& enumerator)
858{
859 if(!ValidateEnumerator(enumerator))
860 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600861 return "unrecognized enumerator";
862 }
863
864 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700865 if(enumerator & VK_QUERY_RESULT_PARTIAL_BIT)
866 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600867 strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
868 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700869 if(enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT)
870 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600871 strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
872 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700873 if(enumerator & VK_QUERY_RESULT_WAIT_BIT)
874 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600875 strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
876 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700877 if(enumerator & VK_QUERY_RESULT_64_BIT)
878 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -0600879 strings.push_back("VK_QUERY_RESULT_64_BIT");
880 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600881
882 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700883 for(auto const& string : strings)
884 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600885 enumeratorString += string;
886
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700887 if(string != strings.back())
888 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600889 enumeratorString += '|';
890 }
891 }
892
893 return enumeratorString;
894}
895
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700896static
897bool ValidateEnumerator(VkBufferUsageFlagBits const& enumerator)
898{
899 VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT |
900 VK_BUFFER_USAGE_INDEX_BUFFER_BIT |
Jeremy Hayes99a96322015-06-26 12:48:09 -0600901 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
902 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT |
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700903 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
904 VK_BUFFER_USAGE_TRANSFER_DST_BIT |
Jeremy Hayes99a96322015-06-26 12:48:09 -0600905 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT |
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700906 VK_BUFFER_USAGE_TRANSFER_SRC_BIT |
907 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
908 if(enumerator & (~allFlags))
909 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600910 return false;
911 }
912
913 return true;
914}
915
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700916static
917std::string EnumeratorString(VkBufferUsageFlagBits const& enumerator)
918{
919 if(!ValidateEnumerator(enumerator))
920 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600921 return "unrecognized enumerator";
922 }
923
924 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700925 if(enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT)
926 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600927 strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
928 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700929 if(enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT)
930 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600931 strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
932 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700933 if(enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT)
934 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600935 strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
936 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700937 if(enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT)
938 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600939 strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
940 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700941 if(enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)
942 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600943 strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
944 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700945 if(enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT)
946 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800947 strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600948 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700949 if(enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)
950 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600951 strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
952 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700953 if(enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT)
954 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800955 strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -0600956 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700957 if(enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)
958 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600959 strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
960 }
Jeremy Hayes99a96322015-06-26 12:48:09 -0600961
962 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700963 for(auto const& string : strings)
964 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600965 enumeratorString += string;
966
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700967 if(string != strings.back())
968 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600969 enumeratorString += '|';
970 }
971 }
972
973 return enumeratorString;
974}
975
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700976static
977bool ValidateEnumerator(VkBufferCreateFlagBits const& enumerator)
978{
979 VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(VK_BUFFER_CREATE_SPARSE_ALIASED_BIT |
980 VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT |
981 VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
982 if(enumerator & (~allFlags))
983 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600984 return false;
985 }
986
987 return true;
988}
989
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700990static
991std::string EnumeratorString(VkBufferCreateFlagBits const& enumerator)
992{
993 if(!ValidateEnumerator(enumerator))
994 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600995 return "unrecognized enumerator";
996 }
997
998 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700999 if(enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT)
1000 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001001 strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
1002 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001003 if(enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT)
1004 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001005 strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
1006 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001007 if(enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT)
1008 {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -06001009 strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001010 }
1011
1012 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001013 for(auto const& string : strings)
1014 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001015 enumeratorString += string;
1016
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001017 if(string != strings.back())
1018 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001019 enumeratorString += '|';
1020 }
1021 }
1022
1023 return enumeratorString;
1024}
1025
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001026static
1027bool ValidateEnumerator(VkImageCreateFlagBits const& enumerator)
1028{
1029 VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT |
1030 VK_IMAGE_CREATE_SPARSE_ALIASED_BIT |
1031 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
1032 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT |
1033 VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
1034 if(enumerator & (~allFlags))
1035 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001036 return false;
1037 }
1038
1039 return true;
1040}
1041
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001042static
1043std::string EnumeratorString(VkImageCreateFlagBits const& enumerator)
1044{
1045 if(!ValidateEnumerator(enumerator))
1046 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001047 return "unrecognized enumerator";
1048 }
1049
1050 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001051 if(enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT)
1052 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001053 strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
1054 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001055 if(enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)
1056 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001057 strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
1058 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001059 if(enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT)
1060 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001061 strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
1062 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001063 if(enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT)
1064 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001065 strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
1066 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001067 if(enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT)
1068 {
Courtney Goeltzenleuchter8134da02015-09-10 17:00:22 -06001069 strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001070 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001071
1072 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001073 for(auto const& string : strings)
1074 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001075 enumeratorString += string;
1076
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001077 if(string != strings.back())
1078 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001079 enumeratorString += '|';
1080 }
1081 }
1082
1083 return enumeratorString;
1084}
1085
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001086static
1087bool ValidateEnumerator(VkColorComponentFlagBits const& enumerator)
1088{
1089 VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT |
1090 VK_COLOR_COMPONENT_B_BIT |
1091 VK_COLOR_COMPONENT_G_BIT |
1092 VK_COLOR_COMPONENT_R_BIT);
1093 if(enumerator & (~allFlags))
1094 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001095 return false;
1096 }
1097
1098 return true;
1099}
1100
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001101static
1102std::string EnumeratorString(VkColorComponentFlagBits const& enumerator)
1103{
1104 if(!ValidateEnumerator(enumerator))
1105 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001106 return "unrecognized enumerator";
1107 }
1108
1109 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001110 if(enumerator & VK_COLOR_COMPONENT_A_BIT)
1111 {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001112 strings.push_back("VK_COLOR_COMPONENT_A_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001113 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001114 if(enumerator & VK_COLOR_COMPONENT_B_BIT)
1115 {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001116 strings.push_back("VK_COLOR_COMPONENT_B_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001117 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001118 if(enumerator & VK_COLOR_COMPONENT_G_BIT)
1119 {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001120 strings.push_back("VK_COLOR_COMPONENT_G_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001121 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001122 if(enumerator & VK_COLOR_COMPONENT_R_BIT)
1123 {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001124 strings.push_back("VK_COLOR_COMPONENT_R_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001125 }
1126
1127 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001128 for(auto const& string : strings)
1129 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001130 enumeratorString += string;
1131
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001132 if(string != strings.back())
1133 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001134 enumeratorString += '|';
1135 }
1136 }
1137
1138 return enumeratorString;
1139}
1140
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001141static
1142bool ValidateEnumerator(VkPipelineCreateFlagBits const& enumerator)
1143{
1144 VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(VK_PIPELINE_CREATE_DERIVATIVE_BIT |
1145 VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT |
1146 VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
1147 if(enumerator & (~allFlags))
1148 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001149 return false;
1150 }
1151
1152 return true;
1153}
1154
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001155static
1156std::string EnumeratorString(VkPipelineCreateFlagBits const& enumerator)
1157{
1158 if(!ValidateEnumerator(enumerator))
1159 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001160 return "unrecognized enumerator";
1161 }
1162
1163 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001164 if(enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT)
1165 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001166 strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
1167 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001168 if(enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT)
1169 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001170 strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
1171 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001172 if(enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT)
1173 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001174 strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001175 }
1176
1177 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001178 for(auto const& string : strings)
1179 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001180 enumeratorString += string;
1181
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001182 if(string != strings.back())
1183 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001184 enumeratorString += '|';
1185 }
1186 }
1187
1188 return enumeratorString;
1189}
1190
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001191static
1192bool ValidateEnumerator(VkShaderStageFlagBits const& enumerator)
1193{
1194 VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(VK_SHADER_STAGE_ALL |
1195 VK_SHADER_STAGE_FRAGMENT_BIT |
1196 VK_SHADER_STAGE_GEOMETRY_BIT |
1197 VK_SHADER_STAGE_COMPUTE_BIT |
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -06001198 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT |
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001199 VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT |
1200 VK_SHADER_STAGE_VERTEX_BIT);
1201 if(enumerator & (~allFlags))
1202 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001203 return false;
1204 }
1205
1206 return true;
1207}
1208
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001209static
1210std::string EnumeratorString(VkShaderStageFlagBits const& enumerator)
1211{
1212 if(!ValidateEnumerator(enumerator))
1213 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001214 return "unrecognized enumerator";
1215 }
1216
1217 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001218 if(enumerator & VK_SHADER_STAGE_ALL)
1219 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001220 strings.push_back("VK_SHADER_STAGE_ALL");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001221 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001222 if(enumerator & VK_SHADER_STAGE_FRAGMENT_BIT)
1223 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001224 strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001225 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001226 if(enumerator & VK_SHADER_STAGE_GEOMETRY_BIT)
1227 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001228 strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
1229 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001230 if(enumerator & VK_SHADER_STAGE_COMPUTE_BIT)
1231 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001232 strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
1233 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001234 if(enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT)
1235 {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -06001236 strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001237 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001238 if(enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT)
1239 {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -06001240 strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001241 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001242 if(enumerator & VK_SHADER_STAGE_VERTEX_BIT)
1243 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001244 strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001245 }
1246
1247 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001248 for(auto const& string : strings)
1249 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001250 enumeratorString += string;
1251
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001252 if(string != strings.back())
1253 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001254 enumeratorString += '|';
1255 }
1256 }
1257
1258 return enumeratorString;
1259}
1260
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001261static
1262bool ValidateEnumerator(VkPipelineStageFlagBits const& enumerator)
1263{
Chia-I Wu89d0f942015-10-31 00:31:16 +08001264 VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
Chia-I Wu89d0f942015-10-31 00:31:16 +08001265 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT |
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001266 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT |
1267 VK_PIPELINE_STAGE_HOST_BIT |
1268 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT |
1269 VK_PIPELINE_STAGE_TRANSFER_BIT |
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001270 VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
Jon Ashburn4bf8ba42015-12-31 12:14:37 -07001271 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001272 VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
Jon Ashburn4bf8ba42015-12-31 12:14:37 -07001273 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
1274 VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT |
1275 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
1276 VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT |
1277 VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
1278 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
1279 VK_PIPELINE_STAGE_VERTEX_INPUT_BIT |
1280 VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
1281 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001282 if(enumerator & (~allFlags))
1283 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001284 return false;
1285 }
1286
1287 return true;
1288}
1289
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001290static
1291std::string EnumeratorString(VkPipelineStageFlagBits const& enumerator)
1292{
1293 if(!ValidateEnumerator(enumerator))
1294 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001295 return "unrecognized enumerator";
1296 }
1297
1298 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001299 if(enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT)
1300 {
Chia-I Wu89d0f942015-10-31 00:31:16 +08001301 strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
1302 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001303 if(enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT)
1304 {
Chia-I Wu89d0f942015-10-31 00:31:16 +08001305 strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001306 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001307 if(enumerator & VK_PIPELINE_STAGE_HOST_BIT)
1308 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001309 strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001310 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001311 if(enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT)
1312 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001313 strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001314 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001315 if(enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT)
1316 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001317 strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001318 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001319 if(enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT)
1320 {
Jon Ashburn4bf8ba42015-12-31 12:14:37 -07001321 strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001322 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001323 if(enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT)
1324 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001325 strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001326 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001327 if(enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT)
1328 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001329 strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001330 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001331 if(enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT)
1332 {
Courtney Goeltzenleuchter96835892015-10-15 17:35:38 -06001333 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001334 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001335 if(enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT)
1336 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001337 strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001338 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001339 if(enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT)
1340 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001341 strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
1342 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001343 if(enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT)
1344 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001345 strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
1346 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001347 if(enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT)
1348 {
1349 strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001350 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001351 if(enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT)
1352 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001353 strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
1354 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001355 if(enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT)
1356 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001357 strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
1358 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001359 if(enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT)
1360 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001361 strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
1362 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001363 if(enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT)
1364 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001365 strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001366 }
1367
1368 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001369 for(auto const& string : strings)
1370 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001371 enumeratorString += string;
1372
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001373 if(string != strings.back())
1374 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001375 enumeratorString += '|';
1376 }
1377 }
1378
1379 return enumeratorString;
1380}
1381
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001382static
1383bool ValidateEnumerator(VkAccessFlagBits const& enumerator)
1384{
Chia-I Wua4594202015-10-27 19:54:37 +08001385 VkAccessFlagBits allFlags = (VkAccessFlagBits)(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001386 VK_ACCESS_INDIRECT_COMMAND_READ_BIT |
1387 VK_ACCESS_INDEX_READ_BIT |
1388 VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
1389 VK_ACCESS_UNIFORM_READ_BIT |
1390 VK_ACCESS_INPUT_ATTACHMENT_READ_BIT |
1391 VK_ACCESS_SHADER_READ_BIT |
1392 VK_ACCESS_SHADER_WRITE_BIT |
1393 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
1394 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
1395 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
1396 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
1397 VK_ACCESS_TRANSFER_READ_BIT |
1398 VK_ACCESS_TRANSFER_WRITE_BIT |
1399 VK_ACCESS_HOST_READ_BIT |
1400 VK_ACCESS_HOST_WRITE_BIT |
1401 VK_ACCESS_MEMORY_READ_BIT |
1402 VK_ACCESS_MEMORY_WRITE_BIT);
Chia-I Wua4594202015-10-27 19:54:37 +08001403
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001404 if(enumerator & (~allFlags))
1405 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001406 return false;
1407 }
1408
1409 return true;
1410}
1411
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001412static
1413std::string EnumeratorString(VkAccessFlagBits const& enumerator)
1414{
1415 if(!ValidateEnumerator(enumerator))
1416 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001417 return "unrecognized enumerator";
1418 }
1419
1420 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001421 if(enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT)
1422 {
Chia-I Wua4594202015-10-27 19:54:37 +08001423 strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001424 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001425 if(enumerator & VK_ACCESS_INDEX_READ_BIT)
1426 {
Chia-I Wua4594202015-10-27 19:54:37 +08001427 strings.push_back("VK_ACCESS_INDEX_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001428 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001429 if(enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT)
1430 {
Chia-I Wua4594202015-10-27 19:54:37 +08001431 strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001432 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001433 if(enumerator & VK_ACCESS_UNIFORM_READ_BIT)
1434 {
Chia-I Wua4594202015-10-27 19:54:37 +08001435 strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001436 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001437 if(enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT)
1438 {
Chia-I Wua4594202015-10-27 19:54:37 +08001439 strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001440 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001441 if(enumerator & VK_ACCESS_SHADER_READ_BIT)
1442 {
Chia-I Wua4594202015-10-27 19:54:37 +08001443 strings.push_back("VK_ACCESS_SHADER_READ_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001444 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001445 if(enumerator & VK_ACCESS_SHADER_WRITE_BIT)
1446 {
Chia-I Wua4594202015-10-27 19:54:37 +08001447 strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001448 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001449 if(enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT)
1450 {
Chia-I Wua4594202015-10-27 19:54:37 +08001451 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001452 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001453 if(enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT)
1454 {
Chia-I Wua4594202015-10-27 19:54:37 +08001455 strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001456 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001457 if(enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT)
1458 {
Chia-I Wua4594202015-10-27 19:54:37 +08001459 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001460 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001461 if(enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT)
1462 {
Chia-I Wua4594202015-10-27 19:54:37 +08001463 strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001464 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001465 if(enumerator & VK_ACCESS_TRANSFER_READ_BIT)
1466 {
Chia-I Wua4594202015-10-27 19:54:37 +08001467 strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001468 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001469 if(enumerator & VK_ACCESS_TRANSFER_WRITE_BIT)
1470 {
Chia-I Wua4594202015-10-27 19:54:37 +08001471 strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001472 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001473 if(enumerator & VK_ACCESS_HOST_READ_BIT)
1474 {
Chia-I Wua4594202015-10-27 19:54:37 +08001475 strings.push_back("VK_ACCESS_HOST_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001476 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001477 if(enumerator & VK_ACCESS_HOST_WRITE_BIT)
1478 {
Chia-I Wua4594202015-10-27 19:54:37 +08001479 strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001480 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001481 if(enumerator & VK_ACCESS_MEMORY_READ_BIT)
1482 {
Chia-I Wua4594202015-10-27 19:54:37 +08001483 strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001484 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001485 if(enumerator & VK_ACCESS_MEMORY_WRITE_BIT)
1486 {
Chia-I Wua4594202015-10-27 19:54:37 +08001487 strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001488 }
1489
1490 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001491 for(auto const& string : strings)
1492 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001493 enumeratorString += string;
1494
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001495 if(string != strings.back())
1496 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001497 enumeratorString += '|';
1498 }
1499 }
1500
1501 return enumeratorString;
1502}
1503
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001504static
1505bool ValidateEnumerator(VkCommandPoolCreateFlagBits const& enumerator)
1506{
1507 VkCommandPoolCreateFlagBits allFlags = (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT |
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001508 VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001509 if(enumerator & (~allFlags))
1510 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001511 return false;
1512 }
1513
1514 return true;
1515}
1516
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001517static
1518std::string EnumeratorString(VkCommandPoolCreateFlagBits const& enumerator)
1519{
1520 if(!ValidateEnumerator(enumerator))
1521 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001522 return "unrecognized enumerator";
1523 }
1524
1525 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001526 if(enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT)
1527 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001528 strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001529 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001530 if(enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT)
1531 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001532 strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001533 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001534
1535 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001536 for(auto const& string : strings)
1537 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001538 enumeratorString += string;
1539
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001540 if(string != strings.back())
1541 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001542 enumeratorString += '|';
1543 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001544 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001545
1546 return enumeratorString;
1547}
1548
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001549static
1550bool ValidateEnumerator(VkCommandPoolResetFlagBits const& enumerator)
1551{
1552 VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
1553 if(enumerator & (~allFlags))
1554 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001555 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001556 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001557
1558 return true;
1559}
1560
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001561static
1562std::string EnumeratorString(VkCommandPoolResetFlagBits const& enumerator)
1563{
1564 if(!ValidateEnumerator(enumerator))
1565 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001566 return "unrecognized enumerator";
1567 }
1568
1569 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001570 if(enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT)
1571 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001572 strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001573 }
1574
1575 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001576 for(auto const& string : strings)
1577 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001578 enumeratorString += string;
1579
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001580 if(string != strings.back())
1581 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001582 enumeratorString += '|';
1583 }
1584 }
1585
1586 return enumeratorString;
1587}
1588
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001589static
1590bool ValidateEnumerator(VkCommandBufferUsageFlags const& enumerator)
1591{
1592 VkCommandBufferUsageFlags allFlags = (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001593 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1594 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001595 if(enumerator & (~allFlags))
1596 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001597 return false;
1598 }
1599
1600 return true;
1601}
1602
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001603static
1604std::string EnumeratorString(VkCommandBufferUsageFlags const& enumerator)
1605{
1606 if(!ValidateEnumerator(enumerator))
1607 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001608 return "unrecognized enumerator";
1609 }
1610
1611 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001612 if(enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT)
1613 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001614 strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001615 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001616 if(enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT)
1617 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001618 strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001619 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001620 if(enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT)
1621 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001622 strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001623 }
1624
1625 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001626 for(auto const& string : strings)
1627 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001628 enumeratorString += string;
1629
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001630 if(string != strings.back())
1631 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001632 enumeratorString += '|';
1633 }
1634 }
1635
1636 return enumeratorString;
1637}
1638
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001639static
1640bool ValidateEnumerator(VkCommandBufferResetFlagBits const& enumerator)
1641{
1642 VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
1643 if(enumerator & (~allFlags))
1644 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001645 return false;
1646 }
1647
1648 return true;
1649}
1650
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001651static
1652std::string EnumeratorString(VkCommandBufferResetFlagBits const& enumerator)
1653{
1654 if(!ValidateEnumerator(enumerator))
1655 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001656 return "unrecognized enumerator";
1657 }
1658
1659 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001660 if(enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT)
1661 {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001662 strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
Jeremy Hayes99a96322015-06-26 12:48:09 -06001663 }
1664
1665 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001666 for(auto const& string : strings)
1667 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001668 enumeratorString += string;
1669
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001670 if(string != strings.back())
1671 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001672 enumeratorString += '|';
1673 }
1674 }
1675
1676 return enumeratorString;
1677}
1678
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001679static
1680bool ValidateEnumerator(VkImageAspectFlagBits const& enumerator)
1681{
1682 VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT |
1683 VK_IMAGE_ASPECT_STENCIL_BIT |
1684 VK_IMAGE_ASPECT_DEPTH_BIT |
1685 VK_IMAGE_ASPECT_COLOR_BIT);
1686 if(enumerator & (~allFlags))
1687 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001688 return false;
1689 }
1690
1691 return true;
1692}
1693
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001694static
1695std::string EnumeratorString(VkImageAspectFlagBits const& enumerator)
1696{
1697 if(!ValidateEnumerator(enumerator))
1698 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001699 return "unrecognized enumerator";
1700 }
1701
1702 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001703 if(enumerator & VK_IMAGE_ASPECT_METADATA_BIT)
1704 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001705 strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1706 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001707 if(enumerator & VK_IMAGE_ASPECT_STENCIL_BIT)
1708 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001709 strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1710 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001711 if(enumerator & VK_IMAGE_ASPECT_DEPTH_BIT)
1712 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001713 strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1714 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001715 if(enumerator & VK_IMAGE_ASPECT_COLOR_BIT)
1716 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001717 strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1718 }
1719
1720 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001721 for(auto const& string : strings)
1722 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001723 enumeratorString += string;
1724
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001725 if(string != strings.back())
1726 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001727 enumeratorString += '|';
1728 }
1729 }
1730
1731 return enumeratorString;
1732}
1733
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001734static
1735bool ValidateEnumerator(VkQueryControlFlagBits const& enumerator)
1736{
1737 VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
1738 if(enumerator & (~allFlags))
1739 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001740 return false;
1741 }
1742
1743 return true;
1744}
1745
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001746static
1747std::string EnumeratorString(VkQueryControlFlagBits const& enumerator)
1748{
1749 if(!ValidateEnumerator(enumerator))
1750 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001751 return "unrecognized enumerator";
1752 }
1753
1754 std::vector<std::string> strings;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001755 if(enumerator & VK_QUERY_CONTROL_PRECISE_BIT)
1756 {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001757 strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001758 }
1759
1760 std::string enumeratorString;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001761 for(auto const& string : strings)
1762 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001763 enumeratorString += string;
1764
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001765 if(string != strings.back())
1766 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001767 enumeratorString += '|';
1768 }
1769 }
1770
1771 return enumeratorString;
1772}
1773
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001774static const int MaxParamCheckerStringLength = 256;
1775
Dustin Graves1e92cd72016-02-09 14:00:18 -07001776static
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001777VkBool32 validate_string(layer_data *my_data, const char *apiName, const char *stringName, const char *validateString)
1778{
1779 VkBool32 skipCall = VK_FALSE;
1780
1781 VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1782
1783 if (result == VK_STRING_ERROR_NONE) {
1784 return skipCall;
1785 } else if (result & VK_STRING_ERROR_LENGTH) {
1786 skipCall = log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1787 "%s: string %s exceeds max length %d", apiName, stringName, MaxParamCheckerStringLength);
1788 } else if (result & VK_STRING_ERROR_BAD_DATA) {
1789 skipCall = log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1790 "%s: string %s contains invalid characters or is badly formed", apiName, stringName);
1791 }
1792 return skipCall;
1793}
1794
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001795VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(
1796 const VkInstanceCreateInfo* pCreateInfo,
1797 const VkAllocationCallbacks* pAllocator,
1798 VkInstance* pInstance)
1799{
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001800 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1801 VkBool32 skipCall = VK_FALSE;
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07001802
1803 if (skipCall == VK_FALSE) {
1804 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
1805 assert(chain_info->u.pLayerInfo);
1806 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1807 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance) fpGetInstanceProcAddr(NULL, "vkCreateInstance");
1808 if (fpCreateInstance == NULL) {
1809 return VK_ERROR_INITIALIZATION_FAILED;
1810 }
1811
1812 // Advance the link info for the next element on the chain
1813 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1814
1815 result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
1816 if (result != VK_SUCCESS)
1817 return result;
1818
1819 layer_data *my_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1820 VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
1821
1822 my_data->report_data = debug_report_create_instance(
1823 pTable,
1824 *pInstance,
1825 pCreateInfo->enabledExtensionCount,
1826 pCreateInfo->ppEnabledExtensionNames);
1827
1828 InitParamChecker(my_data, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001829 }
1830
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001831 // Ordinarily we'd check these before calling down the chain, but none of the layer
1832 // support is in place until now, if we survive we can report the issue now.
1833 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1834 if (pCreateInfo->pApplicationInfo) {
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001835 if (pCreateInfo->pApplicationInfo->pApplicationName) {
1836 skipCall |= validate_string(my_device_data, "vkCreateInstance()", "VkInstanceCreateInfo->VkApplicationInfo->pApplicationName",
1837 pCreateInfo->pApplicationInfo->pApplicationName);
1838 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001839
Courtney Goeltzenleuchter41c5c4b2016-02-10 15:13:55 -07001840 if (pCreateInfo->pApplicationInfo->pEngineName) {
1841 skipCall |= validate_string(my_device_data, "vkCreateInstance()", "VkInstanceCreateInfo->VkApplicationInfo->pEngineName",
1842 pCreateInfo->pApplicationInfo->pEngineName);
1843 }
Courtney Goeltzenleuchter842691b2016-02-10 14:00:52 -07001844 }
1845
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001846 return result;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001847}
1848
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001849VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(
1850 VkInstance instance,
1851 const VkAllocationCallbacks* pAllocator)
1852{
Jeremy Hayes99a96322015-06-26 12:48:09 -06001853 // Grab the key before the instance is destroyed.
1854 dispatch_key key = get_dispatch_key(instance);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001855 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
Chia-I Wuf7458c52015-10-26 21:10:41 +08001856 pTable->DestroyInstance(instance, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001857
1858 // Clean up logging callback, if any
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001859 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
1860 while (my_data->logging_callback.size() > 0) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001861 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -07001862 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Courtney Goeltzenleuchterd29f4f02015-10-05 15:59:45 -06001863 my_data->logging_callback.pop_back();
Jeremy Hayes99a96322015-06-26 12:48:09 -06001864 }
1865
1866 layer_debug_report_destroy_instance(mid(instance));
1867 layer_data_map.erase(pTable);
1868
1869 pc_instance_table_map.erase(key);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001870}
1871
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001872bool PostEnumeratePhysicalDevices(
1873 VkInstance instance,
1874 uint32_t* pPhysicalDeviceCount,
1875 VkPhysicalDevice* pPhysicalDevices,
1876 VkResult result)
1877{
Jeremy Hayes99a96322015-06-26 12:48:09 -06001878
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001879 if(pPhysicalDeviceCount != nullptr)
1880 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001881 }
1882
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001883 if(pPhysicalDevices != nullptr)
1884 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001885 }
1886
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001887 if(result < VK_SUCCESS)
1888 {
1889 std::string reason = "vkEnumeratePhysicalDevices parameter, VkResult result, is " + EnumeratorString(result);
1890 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 -06001891 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001892 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001893
1894 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001895}
1896
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001897VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDevices(
1898 VkInstance instance,
1899 uint32_t* pPhysicalDeviceCount,
1900 VkPhysicalDevice* pPhysicalDevices)
1901{
Dustin Graves1e92cd72016-02-09 14:00:18 -07001902 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1903 VkBool32 skipCall = VK_FALSE;
1904 layer_data* my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
1905 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001906
Dustin Graves1e92cd72016-02-09 14:00:18 -07001907 skipCall |= param_check_vkEnumeratePhysicalDevices(
1908 my_data->report_data,
1909 pPhysicalDeviceCount,
1910 pPhysicalDevices);
1911
1912 if (skipCall == VK_FALSE) {
1913 result = get_dispatch_table(pc_instance_table_map, instance)->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
1914
1915 PostEnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices, result);
1916 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06001917
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001918 return result;
1919}
1920
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001921bool PostGetPhysicalDeviceFeatures(
1922 VkPhysicalDevice physicalDevice,
1923 VkPhysicalDeviceFeatures* pFeatures)
1924{
Jeremy Hayes99a96322015-06-26 12:48:09 -06001925
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001926 if(pFeatures != nullptr)
1927 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001928 }
1929
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001930 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001931}
1932
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001933VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFeatures(
1934 VkPhysicalDevice physicalDevice,
1935 VkPhysicalDeviceFeatures* pFeatures)
1936{
Dustin Graves1e92cd72016-02-09 14:00:18 -07001937 VkBool32 skipCall = VK_FALSE;
1938 layer_data* my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
1939 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001940
Dustin Graves1e92cd72016-02-09 14:00:18 -07001941 skipCall |= param_check_vkGetPhysicalDeviceFeatures(
1942 my_data->report_data,
1943 pFeatures);
1944
1945 if (skipCall == VK_FALSE) {
1946 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
1947
1948 PostGetPhysicalDeviceFeatures(physicalDevice, pFeatures);
1949 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001950}
1951
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001952bool PostGetPhysicalDeviceFormatProperties(
1953 VkPhysicalDevice physicalDevice,
1954 VkFormat format,
1955 VkFormatProperties* pFormatProperties)
1956{
Jeremy Hayes99a96322015-06-26 12:48:09 -06001957
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001958 if(format < VK_FORMAT_BEGIN_RANGE ||
1959 format > VK_FORMAT_END_RANGE)
1960 {
1961 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
1962 "vkGetPhysicalDeviceFormatProperties parameter, VkFormat format, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001963 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001964 }
1965
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001966 if(pFormatProperties != nullptr)
1967 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06001968 }
1969
Jeremy Hayes359eeb92015-07-09 17:11:25 -06001970 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06001971}
1972
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001973VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFormatProperties(
1974 VkPhysicalDevice physicalDevice,
1975 VkFormat format,
1976 VkFormatProperties* pFormatProperties)
1977{
Dustin Graves1e92cd72016-02-09 14:00:18 -07001978 VkBool32 skipCall = VK_FALSE;
1979 layer_data* my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
1980 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06001981
Dustin Graves1e92cd72016-02-09 14:00:18 -07001982
1983 skipCall |= param_check_vkGetPhysicalDeviceFormatProperties(
1984 my_data->report_data,
1985 format,
1986 pFormatProperties);
1987
1988 if (skipCall == VK_FALSE) {
1989 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
1990
1991 PostGetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
1992 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06001993}
1994
1995bool PostGetPhysicalDeviceImageFormatProperties(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07001996 VkPhysicalDevice physicalDevice,
1997 VkFormat format,
1998 VkImageType type,
1999 VkImageTiling tiling,
2000 VkImageUsageFlags usage,
2001 VkImageCreateFlags flags,
2002 VkImageFormatProperties* pImageFormatProperties,
2003 VkResult result)
2004{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002005
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002006 if(format < VK_FORMAT_BEGIN_RANGE ||
2007 format > VK_FORMAT_END_RANGE)
2008 {
2009 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2010 "vkGetPhysicalDeviceImageFormatProperties parameter, VkFormat format, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002011 return false;
2012 }
2013
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002014 if(type < VK_IMAGE_TYPE_BEGIN_RANGE ||
2015 type > VK_IMAGE_TYPE_END_RANGE)
2016 {
2017 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2018 "vkGetPhysicalDeviceImageFormatProperties parameter, VkImageType type, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002019 return false;
2020 }
2021
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002022 if(tiling < VK_IMAGE_TILING_BEGIN_RANGE ||
2023 tiling > VK_IMAGE_TILING_END_RANGE)
2024 {
2025 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2026 "vkGetPhysicalDeviceImageFormatProperties parameter, VkImageTiling tiling, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002027 return false;
2028 }
2029
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002030
2031 if(pImageFormatProperties != nullptr)
2032 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002033 }
2034
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002035 if(result < VK_SUCCESS)
2036 {
2037 std::string reason = "vkGetPhysicalDeviceImageFormatProperties parameter, VkResult result, is " + EnumeratorString(result);
2038 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 +08002039 return false;
2040 }
2041
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002042 return true;
2043}
2044
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002045VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceImageFormatProperties(
2046 VkPhysicalDevice physicalDevice,
2047 VkFormat format,
2048 VkImageType type,
2049 VkImageTiling tiling,
2050 VkImageUsageFlags usage,
2051 VkImageCreateFlags flags,
2052 VkImageFormatProperties* pImageFormatProperties)
2053{
Dustin Graves1e92cd72016-02-09 14:00:18 -07002054 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2055 VkBool32 skipCall = VK_FALSE;
2056 layer_data* my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
2057 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002058
Dustin Graves1e92cd72016-02-09 14:00:18 -07002059 skipCall |= param_check_vkGetPhysicalDeviceImageFormatProperties(
2060 my_data->report_data,
2061 format,
2062 type,
2063 tiling,
2064 usage,
2065 flags,
2066 pImageFormatProperties);
2067
2068 if (skipCall == VK_FALSE) {
2069 result = get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
2070
2071 PostGetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties, result);
2072 }
Chia-I Wu17241042015-10-31 00:31:16 +08002073
2074 return result;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002075}
2076
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002077bool PostGetPhysicalDeviceProperties(
2078 VkPhysicalDevice physicalDevice,
2079 VkPhysicalDeviceProperties* pProperties)
2080{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002081
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002082 if(pProperties != nullptr)
2083 {
2084 if(pProperties->deviceType < VK_PHYSICAL_DEVICE_TYPE_BEGIN_RANGE ||
2085 pProperties->deviceType > VK_PHYSICAL_DEVICE_TYPE_END_RANGE)
2086 {
2087 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2088 "vkGetPhysicalDeviceProperties parameter, VkPhysicalDeviceType pProperties->deviceType, is an unrecognized enumerator");
2089 return false;
2090 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002091
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002092 }
2093
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002094 return true;
2095}
2096
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002097VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceProperties(
2098 VkPhysicalDevice physicalDevice,
2099 VkPhysicalDeviceProperties* pProperties)
2100{
Dustin Graves1e92cd72016-02-09 14:00:18 -07002101 VkBool32 skipCall = VK_FALSE;
2102 layer_data* my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
2103 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002104
Dustin Graves1e92cd72016-02-09 14:00:18 -07002105 skipCall |= param_check_vkGetPhysicalDeviceProperties(
2106 my_data->report_data,
2107 pProperties);
2108
2109 if (skipCall == VK_FALSE) {
2110 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
2111
2112 PostGetPhysicalDeviceProperties(physicalDevice, pProperties);
2113 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002114}
2115
Cody Northropd0802882015-08-03 17:04:53 -06002116bool PostGetPhysicalDeviceQueueFamilyProperties(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002117 VkPhysicalDevice physicalDevice,
2118 uint32_t* pCount,
2119 VkQueueFamilyProperties* pQueueProperties)
2120{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002121
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002122 if(pQueueProperties == nullptr && pCount != nullptr)
2123 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002124 }
2125
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002126 if(pQueueProperties != nullptr)
2127 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002128 }
2129
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002130 return true;
2131}
2132
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002133VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceQueueFamilyProperties(
2134 VkPhysicalDevice physicalDevice,
Dustin Graves1e92cd72016-02-09 14:00:18 -07002135 uint32_t* pQueueFamilyPropertyCount,
2136 VkQueueFamilyProperties* pQueueFamilyProperties)
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002137{
Dustin Graves1e92cd72016-02-09 14:00:18 -07002138 VkBool32 skipCall = VK_FALSE;
2139 layer_data* my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
2140 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002141
Dustin Graves1e92cd72016-02-09 14:00:18 -07002142 skipCall |= param_check_vkGetPhysicalDeviceQueueFamilyProperties(
2143 my_data->report_data,
2144 pQueueFamilyPropertyCount,
2145 pQueueFamilyProperties);
2146
2147 if (skipCall == VK_FALSE) {
2148 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
2149
2150 PostGetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
2151 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002152}
2153
2154bool PostGetPhysicalDeviceMemoryProperties(
2155 VkPhysicalDevice physicalDevice,
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002156 VkPhysicalDeviceMemoryProperties* pMemoryProperties)
2157{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002158
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002159 if(pMemoryProperties != nullptr)
2160 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002161 }
2162
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002163 return true;
2164}
2165
Chia-I Wu9ab61502015-11-06 06:42:02 +08002166VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceMemoryProperties(
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002167 VkPhysicalDevice physicalDevice,
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002168 VkPhysicalDeviceMemoryProperties* pMemoryProperties)
2169{
Dustin Graves1e92cd72016-02-09 14:00:18 -07002170 VkBool32 skipCall = VK_FALSE;
2171 layer_data* my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
2172 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002173
Dustin Graves1e92cd72016-02-09 14:00:18 -07002174 skipCall |= param_check_vkGetPhysicalDeviceMemoryProperties(
2175 my_data->report_data,
2176 pMemoryProperties);
2177
2178 if (skipCall == VK_FALSE) {
2179 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
2180
2181 PostGetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
2182 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002183}
2184
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002185void validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, const std::vector<VkQueueFamilyProperties> properties) {
Michael Lentine157a2ec2016-01-27 11:25:05 -06002186 std::unordered_set<uint32_t> set;
2187 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
2188 if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002189 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2190 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this structure.", i);
Michael Lentine157a2ec2016-01-27 11:25:05 -06002191 } else {
2192 set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
2193 }
Michael Lentine26244832016-01-27 11:40:27 -06002194 if (pCreateInfo->pQueueCreateInfos[i].queueCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002195 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2196 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount, cannot be zero.", i);
Michael Lentinefa71bd52016-01-27 12:50:30 -06002197 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002198 for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
Courtney Goeltzenleuchter3ce90b02016-01-29 15:43:49 -07002199 if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities == nullptr) {
2200 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2201 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities, must not be NULL.", i);
2202 } else if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f || pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002203 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2204 "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 -06002205 }
Michael Lentine26244832016-01-27 11:40:27 -06002206 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002207 if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
2208 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2209 "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number of queue families.", i);
2210 } else if (pCreateInfo->pQueueCreateInfos[i].queueCount > properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
2211 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2212 "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 -06002213 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06002214 }
2215}
2216
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002217void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo* pCreateInfo) {
2218 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Michael Lentinebdf744f2016-01-27 15:43:43 -06002219 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
2220 my_device_data->queueFamilyIndexMap.insert(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002221 std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
Michael Lentinebdf744f2016-01-27 15:43:43 -06002222 }
2223}
2224
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002225VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(
2226 VkPhysicalDevice physicalDevice,
2227 const VkDeviceCreateInfo* pCreateInfo,
2228 const VkAllocationCallbacks* pAllocator,
2229 VkDevice* pDevice)
2230{
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06002231 /*
Courtney Goeltzenleuchterbafcdf32015-09-08 17:42:57 -06002232 * NOTE: We do not validate physicalDevice or any dispatchable
2233 * object as the first parameter. We couldn't get here if it was wrong!
2234 */
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07002235
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002236 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2237 VkBool32 skipCall = VK_FALSE;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002238 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07002239
Dustin Graves1e92cd72016-02-09 14:00:18 -07002240 if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
2241 for (auto i = 0; i < pCreateInfo->enabledLayerCount; i++) {
2242 skipCall |= validate_string(my_instance_data, "vkCreateDevice()", "VkDeviceCreateInfo->ppEnabledLayerNames",
2243 pCreateInfo->ppEnabledLayerNames[i]);
2244 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002245 }
Michael Lentine774704f2016-01-27 13:36:46 -06002246
Dustin Graves1e92cd72016-02-09 14:00:18 -07002247 if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
2248 for (auto i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
2249 skipCall |= validate_string(my_instance_data, "vkCreateDevice()", "VkDeviceCreateInfo->ppEnabledExtensionNames",
2250 pCreateInfo->ppEnabledExtensionNames[i]);
2251 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07002252 }
2253
2254 if (skipCall == VK_FALSE) {
2255 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
2256 assert(chain_info->u.pLayerInfo);
2257 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
2258 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
2259 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice) fpGetInstanceProcAddr(NULL, "vkCreateDevice");
2260 if (fpCreateDevice == NULL) {
2261 return VK_ERROR_INITIALIZATION_FAILED;
2262 }
2263
2264 // Advance the link info for the next element on the chain
2265 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
2266
2267 result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
2268 if (result != VK_SUCCESS) {
2269 return result;
2270 }
2271
2272 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
2273 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
2274 initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
2275
2276 uint32_t count;
2277 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
2278 std::vector<VkQueueFamilyProperties> properties(count);
2279 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
2280
2281 validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
2282 storeCreateDeviceData(*pDevice, pCreateInfo);
2283 }
Michael Lentine157a2ec2016-01-27 11:25:05 -06002284
Jeremy Hayes99a96322015-06-26 12:48:09 -06002285 return result;
2286}
2287
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002288VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(
2289 VkDevice device,
2290 const VkAllocationCallbacks* pAllocator)
2291{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002292 layer_debug_report_destroy_device(device);
2293
2294 dispatch_key key = get_dispatch_key(device);
2295#if DISPATCH_MAP_DEBUG
2296 fprintf(stderr, "Device: %p, key: %p\n", device, key);
2297#endif
2298
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002299 get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002300 pc_device_table_map.erase(key);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002301}
2302
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002303bool PreGetDeviceQueue(
2304 VkDevice device,
2305 uint32_t queueFamilyIndex,
2306 uint32_t queueIndex)
2307{
2308 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2309 auto queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06002310 if (queue_data == my_device_data->queueFamilyIndexMap.end()) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002311 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2312 "VkGetDeviceQueue parameter, uint32_t queueFamilyIndex %d, must have been given when the device was created.", queueFamilyIndex);
Michael Lentinebdf744f2016-01-27 15:43:43 -06002313 return false;
2314 }
2315 if (queue_data->second <= queueIndex) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002316 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2317 "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 -06002318 return false;
2319 }
2320 return true;
2321}
2322
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002323bool PostGetDeviceQueue(
2324 VkDevice device,
2325 uint32_t queueFamilyIndex,
2326 uint32_t queueIndex,
2327 VkQueue* pQueue)
2328{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002329
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002330
2331
2332 if(pQueue != nullptr)
2333 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002334 }
2335
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002336 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002337}
2338
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002339VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetDeviceQueue(
2340 VkDevice device,
2341 uint32_t queueFamilyIndex,
2342 uint32_t queueIndex,
2343 VkQueue* pQueue)
2344{
Dustin Graves1e92cd72016-02-09 14:00:18 -07002345 VkBool32 skipCall = VK_FALSE;
2346 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2347 assert(my_data != NULL);
Michael Lentinebdf744f2016-01-27 15:43:43 -06002348
Dustin Graves1e92cd72016-02-09 14:00:18 -07002349 skipCall |= param_check_vkGetDeviceQueue(
2350 my_data->report_data,
2351 queueFamilyIndex,
2352 queueIndex,
2353 pQueue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002354
Dustin Graves1e92cd72016-02-09 14:00:18 -07002355 if (skipCall == VK_FALSE) {
2356 PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
2357
2358 get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
2359
2360 PostGetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
2361 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002362}
2363
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002364bool PreQueueSubmit(
2365 VkQueue queue,
2366 const VkSubmitInfo* submit)
2367{
2368 if(submit->sType != VK_STRUCTURE_TYPE_SUBMIT_INFO) {
2369 log_msg(mdd(queue), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2370 "vkQueueSubmit parameter, VkStructureType pSubmits->sType, is an invalid enumerator");
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002371 return false;
2372 }
2373
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002374 if(submit->pCommandBuffers != nullptr)
2375 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002376 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002377
2378 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002379}
2380
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002381bool PostQueueSubmit(
2382 VkQueue queue,
2383 uint32_t commandBufferCount,
2384 VkFence fence,
2385 VkResult result)
2386{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002387
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002388
2389
2390 if(result < VK_SUCCESS)
2391 {
2392 std::string reason = "vkQueueSubmit parameter, VkResult result, is " + EnumeratorString(result);
2393 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 -06002394 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002395 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002396
2397 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002398}
2399
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002400VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueSubmit(
2401 VkQueue queue,
2402 uint32_t submitCount,
2403 const VkSubmitInfo* pSubmits,
2404 VkFence fence)
2405{
Dustin Graves1e92cd72016-02-09 14:00:18 -07002406 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2407 VkBool32 skipCall = VK_FALSE;
2408 layer_data* my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
2409 assert(my_data != NULL);
2410
2411 skipCall |= param_check_vkQueueSubmit(
2412 my_data->report_data,
2413 submitCount,
2414 pSubmits,
2415 fence);
2416
2417 if (skipCall == VK_FALSE) {
2418 for (uint32_t i = 0; i < submitCount; i++) {
2419 PreQueueSubmit(queue, &pSubmits[i]);
2420 }
2421
2422 result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
2423
2424 PostQueueSubmit(queue, submitCount, fence, result);
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002425 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002426
Jeremy Hayes99a96322015-06-26 12:48:09 -06002427 return result;
2428}
2429
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002430bool PostQueueWaitIdle(
2431 VkQueue queue,
2432 VkResult result)
2433{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002434
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002435 if(result < VK_SUCCESS)
2436 {
2437 std::string reason = "vkQueueWaitIdle parameter, VkResult result, is " + EnumeratorString(result);
2438 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 -06002439 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002440 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002441
2442 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002443}
2444
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002445VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueWaitIdle(
2446 VkQueue queue)
2447{
2448 VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002449
2450 PostQueueWaitIdle(queue, result);
2451
2452 return result;
2453}
2454
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002455bool PostDeviceWaitIdle(
2456 VkDevice device,
2457 VkResult result)
2458{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002459
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002460 if(result < VK_SUCCESS)
2461 {
2462 std::string reason = "vkDeviceWaitIdle parameter, VkResult result, is " + EnumeratorString(result);
2463 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 -06002464 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002465 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002466
2467 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002468}
2469
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002470VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkDeviceWaitIdle(
2471 VkDevice device)
2472{
2473 VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002474
2475 PostDeviceWaitIdle(device, result);
2476
2477 return result;
2478}
2479
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002480bool PreAllocateMemory(
2481 VkDevice device,
2482 const VkMemoryAllocateInfo* pAllocateInfo)
2483{
2484 if(pAllocateInfo != nullptr)
2485 {
2486 if(pAllocateInfo->sType != VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO)
2487 {
2488 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2489 "vkAllocateMemory parameter, VkStructureType pAllocateInfo->sType, is an invalid enumerator");
2490 return false;
2491 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002492 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002493
2494 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002495}
2496
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002497bool PostAllocateMemory(
2498 VkDevice device,
2499 VkDeviceMemory* pMemory,
2500 VkResult result)
2501{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002502
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002503 if(pMemory != nullptr)
2504 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002505 }
2506
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002507 if(result < VK_SUCCESS)
2508 {
2509 std::string reason = "vkAllocateMemory parameter, VkResult result, is " + EnumeratorString(result);
2510 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 -06002511 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002512 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002513
2514 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002515}
2516
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002517VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateMemory(
2518 VkDevice device,
2519 const VkMemoryAllocateInfo* pAllocateInfo,
2520 const VkAllocationCallbacks* pAllocator,
2521 VkDeviceMemory* pMemory)
2522{
Dustin Graves1e92cd72016-02-09 14:00:18 -07002523 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2524 VkBool32 skipCall = VK_FALSE;
2525 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2526 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002527
Dustin Graves1e92cd72016-02-09 14:00:18 -07002528 skipCall |= param_check_vkAllocateMemory(
2529 my_data->report_data,
2530 pAllocateInfo,
2531 pAllocator,
2532 pMemory);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002533
Dustin Graves1e92cd72016-02-09 14:00:18 -07002534 if (skipCall == VK_FALSE) {
2535 PreAllocateMemory(device, pAllocateInfo);
2536
2537 result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
2538
2539 PostAllocateMemory(device, pMemory, result);
2540 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002541
2542 return result;
2543}
2544
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002545bool PostMapMemory(
2546 VkDevice device,
2547 VkDeviceMemory mem,
2548 VkDeviceSize offset,
2549 VkDeviceSize size,
2550 VkMemoryMapFlags flags,
2551 void** ppData,
2552 VkResult result)
2553{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002554
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002555
2556
2557
2558
2559 if(ppData != nullptr)
2560 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002561 }
2562
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002563 if(result < VK_SUCCESS)
2564 {
2565 std::string reason = "vkMapMemory parameter, VkResult result, is " + EnumeratorString(result);
2566 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 -06002567 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002568 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002569
2570 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002571}
2572
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002573VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkMapMemory(
2574 VkDevice device,
Dustin Graves1e92cd72016-02-09 14:00:18 -07002575 VkDeviceMemory memory,
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002576 VkDeviceSize offset,
2577 VkDeviceSize size,
2578 VkMemoryMapFlags flags,
2579 void** ppData)
2580{
Dustin Graves1e92cd72016-02-09 14:00:18 -07002581 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2582 VkBool32 skipCall = VK_FALSE;
2583 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2584 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002585
Dustin Graves1e92cd72016-02-09 14:00:18 -07002586 skipCall |= param_check_vkMapMemory(
2587 my_data->report_data,
2588 memory,
2589 offset,
2590 size,
2591 flags,
2592 ppData);
2593
2594 if (skipCall == VK_FALSE) {
2595 result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
2596
2597 PostMapMemory(device, memory, offset, size, flags, ppData, result);
2598 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002599
2600 return result;
2601}
2602
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002603bool PreFlushMappedMemoryRanges(
2604 VkDevice device,
2605 const VkMappedMemoryRange* pMemoryRanges)
2606{
2607 if(pMemoryRanges != nullptr)
2608 {
2609 if(pMemoryRanges->sType != VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE)
2610 {
2611 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2612 "vkFlushMappedMemoryRanges parameter, VkStructureType pMemoryRanges->sType, is an invalid enumerator");
2613 return false;
2614 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002615 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002616
2617 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002618}
2619
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002620bool PostFlushMappedMemoryRanges(
2621 VkDevice device,
2622 uint32_t memoryRangeCount,
2623 VkResult result)
2624{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002625
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002626
2627 if(result < VK_SUCCESS)
2628 {
2629 std::string reason = "vkFlushMappedMemoryRanges 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 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002633
2634 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002635}
2636
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002637VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFlushMappedMemoryRanges(
2638 VkDevice device,
2639 uint32_t memoryRangeCount,
2640 const VkMappedMemoryRange* pMemoryRanges)
2641{
Dustin Graves1e92cd72016-02-09 14:00:18 -07002642 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2643 VkBool32 skipCall = VK_FALSE;
2644 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2645 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002646
Dustin Graves1e92cd72016-02-09 14:00:18 -07002647 skipCall |= param_check_vkFlushMappedMemoryRanges(
2648 my_data->report_data,
2649 memoryRangeCount,
2650 pMemoryRanges);
Tony Barbourb1250542015-04-16 19:23:13 -06002651
Dustin Graves1e92cd72016-02-09 14:00:18 -07002652 if (skipCall == VK_FALSE) {
2653 PreFlushMappedMemoryRanges(device, pMemoryRanges);
2654
2655 result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
2656
2657 PostFlushMappedMemoryRanges(device, memoryRangeCount, result);
2658 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002659
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06002660 return result;
2661}
2662
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002663bool PreInvalidateMappedMemoryRanges(
2664 VkDevice device,
2665 const VkMappedMemoryRange* pMemoryRanges)
2666{
2667 if(pMemoryRanges != nullptr)
2668 {
2669 if(pMemoryRanges->sType != VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE)
2670 {
2671 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2672 "vkInvalidateMappedMemoryRanges parameter, VkStructureType pMemoryRanges->sType, is an invalid enumerator");
2673 return false;
2674 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002675 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002676
2677 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002678}
2679
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002680bool PostInvalidateMappedMemoryRanges(
2681 VkDevice device,
2682 uint32_t memoryRangeCount,
2683 VkResult result)
2684{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002685
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002686
2687 if(result < VK_SUCCESS)
2688 {
2689 std::string reason = "vkInvalidateMappedMemoryRanges parameter, VkResult result, is " + EnumeratorString(result);
2690 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 -06002691 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002692 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002693
2694 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002695}
2696
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002697VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkInvalidateMappedMemoryRanges(
2698 VkDevice device,
2699 uint32_t memoryRangeCount,
2700 const VkMappedMemoryRange* pMemoryRanges)
2701{
Dustin Graves1e92cd72016-02-09 14:00:18 -07002702 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2703 VkBool32 skipCall = VK_FALSE;
2704 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2705 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002706
Dustin Graves1e92cd72016-02-09 14:00:18 -07002707 skipCall |= param_check_vkInvalidateMappedMemoryRanges(
2708 my_data->report_data,
2709 memoryRangeCount,
2710 pMemoryRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -06002711
Dustin Graves1e92cd72016-02-09 14:00:18 -07002712 if (skipCall == VK_FALSE) {
2713 PreInvalidateMappedMemoryRanges(device, pMemoryRanges);
2714
2715 result = get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
2716
2717 PostInvalidateMappedMemoryRanges(device, memoryRangeCount, result);
2718 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06002719
Tony Barbourb1250542015-04-16 19:23:13 -06002720 return result;
2721}
2722
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002723bool PostGetDeviceMemoryCommitment(
2724 VkDevice device,
2725 VkDeviceMemory memory,
2726 VkDeviceSize* pCommittedMemoryInBytes)
2727{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002728
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002729
2730 if(pCommittedMemoryInBytes != nullptr)
2731 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002732 }
2733
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06002734 return true;
2735}
2736
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002737VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetDeviceMemoryCommitment(
2738 VkDevice device,
2739 VkDeviceMemory memory,
2740 VkDeviceSize* pCommittedMemoryInBytes)
2741{
Dustin Graves1e92cd72016-02-09 14:00:18 -07002742 VkBool32 skipCall = VK_FALSE;
2743 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2744 assert(my_data != NULL);
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06002745
Dustin Graves1e92cd72016-02-09 14:00:18 -07002746 skipCall |= param_check_vkGetDeviceMemoryCommitment(
2747 my_data->report_data,
2748 memory,
2749 pCommittedMemoryInBytes);
2750
2751 if (skipCall == VK_FALSE) {
2752 get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
2753
2754 PostGetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
2755 }
Courtney Goeltzenleuchterfb71f222015-07-09 21:57:28 -06002756}
2757
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002758bool PostBindBufferMemory(
2759 VkDevice device,
2760 VkBuffer buffer,
2761 VkDeviceMemory mem,
2762 VkDeviceSize memoryOffset,
2763 VkResult result)
2764{
Jeremy Hayes99a96322015-06-26 12:48:09 -06002765
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002766
2767
2768
2769 if(result < VK_SUCCESS)
2770 {
2771 std::string reason = "vkBindBufferMemory parameter, VkResult result, is " + EnumeratorString(result);
2772 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 -06002773 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002774 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002775
2776 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002777}
2778
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002779VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindBufferMemory(
2780 VkDevice device,
2781 VkBuffer buffer,
2782 VkDeviceMemory mem,
2783 VkDeviceSize memoryOffset)
2784{
2785 VkResult result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, mem, memoryOffset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002786
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002787 PostBindBufferMemory(device, buffer, mem, memoryOffset, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06002788
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002789 return result;
2790}
2791
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002792bool PostBindImageMemory(
2793 VkDevice device,
2794 VkImage image,
2795 VkDeviceMemory mem,
2796 VkDeviceSize memoryOffset,
2797 VkResult result)
2798{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002799
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002800
2801
2802
2803 if(result < VK_SUCCESS)
2804 {
2805 std::string reason = "vkBindImageMemory parameter, VkResult result, is " + EnumeratorString(result);
2806 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 -06002807 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06002808 }
2809
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002810 return true;
2811}
2812
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002813VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindImageMemory(
2814 VkDevice device,
2815 VkImage image,
2816 VkDeviceMemory mem,
2817 VkDeviceSize memoryOffset)
2818{
2819 VkResult result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, mem, memoryOffset);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002820
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002821 PostBindImageMemory(device, image, mem, memoryOffset, result);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002822
2823 return result;
2824}
2825
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002826bool PostGetBufferMemoryRequirements(
2827 VkDevice device,
2828 VkBuffer buffer,
2829 VkMemoryRequirements* pMemoryRequirements)
2830{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002831
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002832
2833 if(pMemoryRequirements != nullptr)
2834 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06002835 }
2836
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002837 return true;
2838}
2839
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002840VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetBufferMemoryRequirements(
2841 VkDevice device,
2842 VkBuffer buffer,
2843 VkMemoryRequirements* pMemoryRequirements)
2844{
Dustin Graves1e92cd72016-02-09 14:00:18 -07002845 VkBool32 skipCall = VK_FALSE;
2846 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2847 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002848
Dustin Graves1e92cd72016-02-09 14:00:18 -07002849 skipCall |= param_check_vkGetBufferMemoryRequirements(
2850 my_data->report_data,
2851 buffer,
2852 pMemoryRequirements);
2853
2854 if (skipCall == VK_FALSE) {
2855 get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
2856
2857 PostGetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
2858 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002859}
2860
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002861bool PostGetImageMemoryRequirements(
2862 VkDevice device,
2863 VkImage image,
2864 VkMemoryRequirements* pMemoryRequirements)
2865{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002866
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002867
2868 if(pMemoryRequirements != nullptr)
2869 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002870 }
2871
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002872 return true;
2873}
2874
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002875VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetImageMemoryRequirements(
2876 VkDevice device,
2877 VkImage image,
2878 VkMemoryRequirements* pMemoryRequirements)
2879{
Dustin Graves1e92cd72016-02-09 14:00:18 -07002880 VkBool32 skipCall = VK_FALSE;
2881 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2882 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002883
Dustin Graves1e92cd72016-02-09 14:00:18 -07002884 skipCall |= param_check_vkGetImageMemoryRequirements(
2885 my_data->report_data,
2886 image,
2887 pMemoryRequirements);
2888
2889 if (skipCall == VK_FALSE) {
2890 get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
2891
2892 PostGetImageMemoryRequirements(device, image, pMemoryRequirements);
2893 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002894}
2895
2896bool PostGetImageSparseMemoryRequirements(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002897 VkDevice device,
2898 VkImage image,
2899 uint32_t* pNumRequirements,
2900 VkSparseImageMemoryRequirements* pSparseMemoryRequirements)
2901{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002902
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002903
2904 if(pNumRequirements != nullptr)
2905 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002906 }
2907
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002908 if(pSparseMemoryRequirements != nullptr)
2909 {
2910 if ((pSparseMemoryRequirements->formatProperties.aspectMask &
2911 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
2912 {
2913 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2914 "vkGetImageSparseMemoryRequirements parameter, VkImageAspect pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
2915 return false;
2916 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002917 }
2918
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002919 return true;
2920}
2921
Chia-I Wu9ab61502015-11-06 06:42:02 +08002922VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetImageSparseMemoryRequirements(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002923 VkDevice device,
2924 VkImage image,
Dustin Graves1e92cd72016-02-09 14:00:18 -07002925 uint32_t* pSparseMemoryRequirementCount,
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002926 VkSparseImageMemoryRequirements* pSparseMemoryRequirements)
2927{
Dustin Graves1e92cd72016-02-09 14:00:18 -07002928 VkBool32 skipCall = VK_FALSE;
2929 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2930 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002931
Dustin Graves1e92cd72016-02-09 14:00:18 -07002932 skipCall |= param_check_vkGetImageSparseMemoryRequirements(
2933 my_data->report_data,
2934 image,
2935 pSparseMemoryRequirementCount,
2936 pSparseMemoryRequirements);
2937
2938 if (skipCall == VK_FALSE) {
2939 get_dispatch_table(pc_device_table_map, device)->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2940
2941 PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2942 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002943}
2944
2945bool PostGetPhysicalDeviceSparseImageFormatProperties(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002946 VkPhysicalDevice physicalDevice,
2947 VkFormat format,
2948 VkImageType type,
2949 VkSampleCountFlagBits samples,
2950 VkImageUsageFlags usage,
2951 VkImageTiling tiling,
2952 uint32_t* pNumProperties,
2953 VkSparseImageFormatProperties* pProperties)
2954{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002955
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002956 if(format < VK_FORMAT_BEGIN_RANGE ||
2957 format > VK_FORMAT_END_RANGE)
2958 {
2959 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2960 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkFormat format, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002961 return false;
2962 }
2963
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002964 if(type < VK_IMAGE_TYPE_BEGIN_RANGE ||
2965 type > VK_IMAGE_TYPE_END_RANGE)
2966 {
2967 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2968 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageType type, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002969 return false;
2970 }
2971
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002972
2973
2974 if(tiling < VK_IMAGE_TILING_BEGIN_RANGE ||
2975 tiling > VK_IMAGE_TILING_END_RANGE)
2976 {
2977 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2978 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageTiling tiling, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002979 return false;
2980 }
2981
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002982 if(pNumProperties != nullptr)
2983 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002984 }
2985
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07002986 if(pProperties != nullptr)
2987 {
2988 if ((pProperties->aspectMask &
2989 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
2990 {
2991 log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
2992 "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an unrecognized enumerator");
2993 return false;
2994 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002995 }
2996
Jeremy Hayes359eeb92015-07-09 17:11:25 -06002997 return true;
2998}
2999
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003000VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceSparseImageFormatProperties(
3001 VkPhysicalDevice physicalDevice,
3002 VkFormat format,
3003 VkImageType type,
3004 VkSampleCountFlagBits samples,
3005 VkImageUsageFlags usage,
3006 VkImageTiling tiling,
Dustin Graves1e92cd72016-02-09 14:00:18 -07003007 uint32_t* pPropertyCount,
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003008 VkSparseImageFormatProperties* pProperties)
3009{
Dustin Graves1e92cd72016-02-09 14:00:18 -07003010 VkBool32 skipCall = VK_FALSE;
3011 layer_data* my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
3012 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003013
Dustin Graves1e92cd72016-02-09 14:00:18 -07003014 skipCall |= param_check_vkGetPhysicalDeviceSparseImageFormatProperties(
3015 my_data->report_data,
3016 format,
3017 type,
3018 samples,
3019 usage,
3020 tiling,
3021 pPropertyCount,
3022 pProperties);
3023
3024 if (skipCall == VK_FALSE) {
3025 get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount, pProperties);
3026
3027 PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount, pProperties);
3028 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003029}
3030
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003031bool PreQueueBindSparse(
3032 VkQueue queue,
3033 uint32_t bindInfoCount,
3034 const VkBindSparseInfo* pBindInfo)
3035{
3036 if(pBindInfo != nullptr)
3037 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003038 }
3039
3040 return true;
3041}
3042
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003043bool PostQueueBindSparse(
3044 VkQueue queue,
3045 uint32_t bindInfoCount,
3046 const VkBindSparseInfo* pBindInfo,
3047 VkFence fence,
3048 VkResult result)
3049{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003050
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003051
3052
3053 if(result < VK_SUCCESS)
3054 {
3055 std::string reason = "vkQueueBindSparse parameter, VkResult result, is " + EnumeratorString(result);
3056 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 -06003057 return false;
3058 }
3059
3060 return true;
3061}
3062
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003063VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueBindSparse(
3064 VkQueue queue,
3065 uint32_t bindInfoCount,
3066 const VkBindSparseInfo* pBindInfo,
3067 VkFence fence)
3068{
Dustin Graves1e92cd72016-02-09 14:00:18 -07003069 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3070 VkBool32 skipCall = VK_FALSE;
3071 layer_data* my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
3072 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003073
Dustin Graves1e92cd72016-02-09 14:00:18 -07003074 skipCall |= param_check_vkQueueBindSparse(
3075 my_data->report_data,
3076 bindInfoCount,
3077 pBindInfo,
3078 fence);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003079
Dustin Graves1e92cd72016-02-09 14:00:18 -07003080 if (skipCall == VK_FALSE) {
3081 PreQueueBindSparse(queue, bindInfoCount, pBindInfo);
3082
3083 result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
3084
3085 PostQueueBindSparse(queue, bindInfoCount, pBindInfo, fence, result);
3086 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003087
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003088 return result;
3089}
3090
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003091bool PreCreateFence(
3092 VkDevice device,
3093 const VkFenceCreateInfo* pCreateInfo)
3094{
3095 if(pCreateInfo != nullptr)
3096 {
3097 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_FENCE_CREATE_INFO)
3098 {
3099 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3100 "vkCreateFence parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
3101 return false;
3102 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003103 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003104
3105 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003106}
3107
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003108bool PostCreateFence(
3109 VkDevice device,
3110 VkFence* pFence,
3111 VkResult result)
3112{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003113
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003114 if(pFence != nullptr)
3115 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003116 }
3117
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003118 if(result < VK_SUCCESS)
3119 {
3120 std::string reason = "vkCreateFence parameter, VkResult result, is " + EnumeratorString(result);
3121 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 -06003122 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003123 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003124
3125 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003126}
3127
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003128VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateFence(
3129 VkDevice device,
3130 const VkFenceCreateInfo* pCreateInfo,
3131 const VkAllocationCallbacks* pAllocator,
3132 VkFence* pFence)
3133{
Dustin Graves1e92cd72016-02-09 14:00:18 -07003134 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3135 VkBool32 skipCall = VK_FALSE;
3136 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3137 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003138
Dustin Graves1e92cd72016-02-09 14:00:18 -07003139 skipCall |= param_check_vkCreateFence(
3140 my_data->report_data,
3141 pCreateInfo,
3142 pAllocator,
3143 pFence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003144
Dustin Graves1e92cd72016-02-09 14:00:18 -07003145 if (skipCall == VK_FALSE) {
3146 PreCreateFence(device, pCreateInfo);
3147
3148 result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
3149
3150 PostCreateFence(device, pFence, result);
3151 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003152
3153 return result;
3154}
3155
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003156bool PreResetFences(
3157 VkDevice device,
3158 const VkFence* pFences)
3159{
3160 if(pFences != nullptr)
3161 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003162 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003163
3164 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003165}
3166
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003167bool PostResetFences(
3168 VkDevice device,
3169 uint32_t fenceCount,
3170 VkResult result)
3171{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003172
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003173
3174 if(result < VK_SUCCESS)
3175 {
3176 std::string reason = "vkResetFences parameter, VkResult result, is " + EnumeratorString(result);
3177 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 -06003178 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003179 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003180
3181 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003182}
3183
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003184VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetFences(
3185 VkDevice device,
3186 uint32_t fenceCount,
3187 const VkFence* pFences)
3188{
Dustin Graves1e92cd72016-02-09 14:00:18 -07003189 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3190 VkBool32 skipCall = VK_FALSE;
3191 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3192 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003193
Dustin Graves1e92cd72016-02-09 14:00:18 -07003194 skipCall |= param_check_vkResetFences(
3195 my_data->report_data,
3196 fenceCount,
3197 pFences);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003198
Dustin Graves1e92cd72016-02-09 14:00:18 -07003199 if (skipCall == VK_FALSE) {
3200 PreResetFences(device, pFences);
3201
3202 result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
3203
3204 PostResetFences(device, fenceCount, result);
3205 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003206
3207 return result;
3208}
3209
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003210bool PostGetFenceStatus(
3211 VkDevice device,
3212 VkFence fence,
3213 VkResult result)
3214{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003215
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003216
3217 if(result < VK_SUCCESS)
3218 {
3219 std::string reason = "vkGetFenceStatus parameter, VkResult result, is " + EnumeratorString(result);
3220 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 -06003221 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003222 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003223
3224 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003225}
3226
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003227VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceStatus(
3228 VkDevice device,
3229 VkFence fence)
3230{
3231 VkResult result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003232
3233 PostGetFenceStatus(device, fence, result);
3234
3235 return result;
3236}
3237
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003238bool PreWaitForFences(
3239 VkDevice device,
3240 const VkFence* pFences)
3241{
3242 if(pFences != nullptr)
3243 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003244 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003245
3246 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003247}
3248
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003249bool PostWaitForFences(
3250 VkDevice device,
3251 uint32_t fenceCount,
3252 VkBool32 waitAll,
3253 uint64_t timeout,
3254 VkResult result)
3255{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003256
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003257
3258
3259
3260 if(result < VK_SUCCESS)
3261 {
3262 std::string reason = "vkWaitForFences parameter, VkResult result, is " + EnumeratorString(result);
3263 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 -06003264 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003265 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003266
3267 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003268}
3269
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003270VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkWaitForFences(
3271 VkDevice device,
3272 uint32_t fenceCount,
3273 const VkFence* pFences,
3274 VkBool32 waitAll,
3275 uint64_t timeout)
3276{
Dustin Graves1e92cd72016-02-09 14:00:18 -07003277 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3278 VkBool32 skipCall = VK_FALSE;
3279 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3280 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003281
Dustin Graves1e92cd72016-02-09 14:00:18 -07003282 skipCall |= param_check_vkWaitForFences(
3283 my_data->report_data,
3284 fenceCount,
3285 pFences,
3286 waitAll,
3287 timeout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003288
Dustin Graves1e92cd72016-02-09 14:00:18 -07003289 if (skipCall == VK_FALSE) {
3290 PreWaitForFences(device, pFences);
3291
3292 result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
3293
3294 PostWaitForFences(device, fenceCount, waitAll, timeout, result);
3295 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003296
3297 return result;
3298}
3299
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003300bool PreCreateSemaphore(
3301 VkDevice device,
3302 const VkSemaphoreCreateInfo* pCreateInfo)
3303{
3304 if(pCreateInfo != nullptr)
3305 {
3306 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO)
3307 {
3308 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3309 "vkCreateSemaphore parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
3310 return false;
3311 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003312 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003313
3314 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003315}
3316
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003317bool PostCreateSemaphore(
3318 VkDevice device,
3319 VkSemaphore* pSemaphore,
3320 VkResult result)
3321{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003322
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003323 if(pSemaphore != nullptr)
3324 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003325 }
3326
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003327 if(result < VK_SUCCESS)
3328 {
3329 std::string reason = "vkCreateSemaphore parameter, VkResult result, is " + EnumeratorString(result);
3330 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 -06003331 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003332 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003333
3334 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003335}
3336
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003337VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSemaphore(
3338 VkDevice device,
3339 const VkSemaphoreCreateInfo* pCreateInfo,
3340 const VkAllocationCallbacks* pAllocator,
3341 VkSemaphore* pSemaphore)
3342{
Dustin Graves1e92cd72016-02-09 14:00:18 -07003343 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3344 VkBool32 skipCall = VK_FALSE;
3345 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3346 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003347
Dustin Graves1e92cd72016-02-09 14:00:18 -07003348 skipCall |= param_check_vkCreateSemaphore(
3349 my_data->report_data,
3350 pCreateInfo,
3351 pAllocator,
3352 pSemaphore);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003353
Dustin Graves1e92cd72016-02-09 14:00:18 -07003354 if (skipCall == VK_FALSE) {
3355 PreCreateSemaphore(device, pCreateInfo);
3356
3357 result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
3358
3359 PostCreateSemaphore(device, pSemaphore, result);
3360 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003361
3362 return result;
3363}
3364
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003365bool PreCreateEvent(
3366 VkDevice device,
3367 const VkEventCreateInfo* pCreateInfo)
3368{
3369 if(pCreateInfo != nullptr)
3370 {
3371 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_EVENT_CREATE_INFO)
3372 {
3373 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3374 "vkCreateEvent parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
3375 return false;
3376 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003377 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003378
3379 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003380}
3381
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003382bool PostCreateEvent(
3383 VkDevice device,
3384 VkEvent* pEvent,
3385 VkResult result)
3386{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003387
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003388 if(pEvent != nullptr)
3389 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003390 }
3391
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003392 if(result < VK_SUCCESS)
3393 {
3394 std::string reason = "vkCreateEvent parameter, VkResult result, is " + EnumeratorString(result);
3395 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 -06003396 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -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 -07003402VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateEvent(
3403 VkDevice device,
3404 const VkEventCreateInfo* pCreateInfo,
3405 const VkAllocationCallbacks* pAllocator,
3406 VkEvent* pEvent)
3407{
Dustin Graves1e92cd72016-02-09 14:00:18 -07003408 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3409 VkBool32 skipCall = VK_FALSE;
3410 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3411 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003412
Dustin Graves1e92cd72016-02-09 14:00:18 -07003413 skipCall |= param_check_vkCreateEvent(
3414 my_data->report_data,
3415 pCreateInfo,
3416 pAllocator,
3417 pEvent);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003418
Dustin Graves1e92cd72016-02-09 14:00:18 -07003419 if (skipCall == VK_FALSE) {
3420 PreCreateEvent(device, pCreateInfo);
3421
3422 result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
3423
3424 PostCreateEvent(device, pEvent, result);
3425 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003426
3427 return result;
3428}
3429
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003430bool PostGetEventStatus(
3431 VkDevice device,
3432 VkEvent event,
3433 VkResult result)
3434{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003435
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003436
3437 if(result < VK_SUCCESS)
3438 {
3439 std::string reason = "vkGetEventStatus parameter, VkResult result, is " + EnumeratorString(result);
3440 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 -06003441 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003442 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003443
3444 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003445}
3446
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003447VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetEventStatus(
3448 VkDevice device,
3449 VkEvent event)
3450{
3451 VkResult result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003452
3453 PostGetEventStatus(device, event, result);
3454
3455 return result;
3456}
3457
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003458bool PostSetEvent(
3459 VkDevice device,
3460 VkEvent event,
3461 VkResult result)
3462{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003463
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003464
3465 if(result < VK_SUCCESS)
3466 {
3467 std::string reason = "vkSetEvent parameter, VkResult result, is " + EnumeratorString(result);
3468 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 -06003469 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003470 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003471
3472 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003473}
3474
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003475VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkSetEvent(
3476 VkDevice device,
3477 VkEvent event)
3478{
3479 VkResult result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003480
3481 PostSetEvent(device, event, result);
3482
3483 return result;
3484}
3485
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003486bool PostResetEvent(
3487 VkDevice device,
3488 VkEvent event,
3489 VkResult result)
3490{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003491
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003492
3493 if(result < VK_SUCCESS)
3494 {
3495 std::string reason = "vkResetEvent parameter, VkResult result, is " + EnumeratorString(result);
3496 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 -06003497 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003498 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003499
3500 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003501}
3502
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003503VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetEvent(
3504 VkDevice device,
3505 VkEvent event)
3506{
3507 VkResult result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003508
3509 PostResetEvent(device, event, result);
3510
3511 return result;
3512}
3513
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003514bool PreCreateQueryPool(
3515 VkDevice device,
3516 const VkQueryPoolCreateInfo* pCreateInfo)
3517{
3518 if(pCreateInfo != nullptr)
3519 {
3520 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO)
3521 {
3522 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3523 "vkCreateQueryPool parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
3524 return false;
3525 }
3526 if(pCreateInfo->queryType < VK_QUERY_TYPE_BEGIN_RANGE ||
3527 pCreateInfo->queryType > VK_QUERY_TYPE_END_RANGE)
3528 {
3529 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3530 "vkCreateQueryPool parameter, VkQueryType pCreateInfo->queryType, is an unrecognized enumerator");
3531 return false;
3532 }
Jeremy Hayes99a96322015-06-26 12:48:09 -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 PostCreateQueryPool(
3539 VkDevice device,
3540 VkQueryPool* pQueryPool,
3541 VkResult result)
3542{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003543
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003544 if(pQueryPool != nullptr)
3545 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003546 }
3547
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003548 if(result < VK_SUCCESS)
3549 {
3550 std::string reason = "vkCreateQueryPool parameter, VkResult result, is " + EnumeratorString(result);
3551 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 -06003552 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003553 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003554
3555 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003556}
3557
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003558VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateQueryPool(
3559 VkDevice device,
3560 const VkQueryPoolCreateInfo* pCreateInfo,
3561 const VkAllocationCallbacks* pAllocator,
3562 VkQueryPool* pQueryPool)
3563{
Dustin Graves1e92cd72016-02-09 14:00:18 -07003564 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3565 VkBool32 skipCall = VK_FALSE;
3566 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3567 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003568
Dustin Graves1e92cd72016-02-09 14:00:18 -07003569 skipCall |= param_check_vkCreateQueryPool(
3570 my_data->report_data,
3571 pCreateInfo,
3572 pAllocator,
3573 pQueryPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003574
Dustin Graves1e92cd72016-02-09 14:00:18 -07003575 if (skipCall == VK_FALSE) {
3576 PreCreateQueryPool(device, pCreateInfo);
3577
3578 result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
3579
3580 PostCreateQueryPool(device, pQueryPool, result);
3581 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003582
3583 return result;
3584}
3585
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003586bool PostGetQueryPoolResults(
3587 VkDevice device,
3588 VkQueryPool queryPool,
3589 uint32_t firstQuery,
3590 uint32_t queryCount,
3591 size_t dataSize,
3592 void* pData,
3593 VkDeviceSize stride,
3594 VkQueryResultFlags flags,
3595 VkResult result)
3596{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003597
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003598
3599
3600
3601 if(pData != nullptr)
3602 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003603 }
3604
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003605
3606 if(result < VK_SUCCESS)
3607 {
3608 std::string reason = "vkGetQueryPoolResults parameter, VkResult result, is " + EnumeratorString(result);
3609 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 -06003610 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003611 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003612
3613 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003614}
3615
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003616VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetQueryPoolResults(
3617 VkDevice device,
3618 VkQueryPool queryPool,
3619 uint32_t firstQuery,
3620 uint32_t queryCount,
3621 size_t dataSize,
3622 void* pData,
3623 VkDeviceSize stride,
3624 VkQueryResultFlags flags)
3625{
Dustin Graves1e92cd72016-02-09 14:00:18 -07003626 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3627 VkBool32 skipCall = VK_FALSE;
3628 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3629 assert(my_data != NULL);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003630
Dustin Graves1e92cd72016-02-09 14:00:18 -07003631 skipCall |= param_check_vkGetQueryPoolResults(
3632 my_data->report_data,
3633 queryPool,
3634 firstQuery,
3635 queryCount,
3636 dataSize,
3637 pData,
3638 stride,
3639 flags);
3640
3641 if (skipCall == VK_FALSE) {
3642 result = get_dispatch_table(pc_device_table_map, device)->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
3643
3644 PostGetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags, result);
3645 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003646
3647 return result;
3648}
3649
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003650bool PreCreateBuffer(
3651 VkDevice device,
3652 const VkBufferCreateInfo* pCreateInfo)
3653{
3654 if(pCreateInfo != nullptr)
3655 {
3656 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO)
3657 {
3658 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3659 "vkCreateBuffer parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
3660 return false;
3661 }
3662 if(pCreateInfo->sharingMode < VK_SHARING_MODE_BEGIN_RANGE ||
3663 pCreateInfo->sharingMode > VK_SHARING_MODE_END_RANGE)
3664 {
3665 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3666 "vkCreateBuffer parameter, VkSharingMode pCreateInfo->sharingMode, is an unrecognized enumerator");
3667 return false;
3668 }
3669 if(pCreateInfo->pQueueFamilyIndices != nullptr)
3670 {
3671 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003672 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003673
3674 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003675}
3676
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003677bool PostCreateBuffer(
3678 VkDevice device,
3679 VkBuffer* pBuffer,
3680 VkResult result)
3681{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003682
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003683 if(pBuffer != nullptr)
3684 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003685 }
3686
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003687 if(result < VK_SUCCESS)
3688 {
3689 std::string reason = "vkCreateBuffer 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());
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003691 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003692 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003693
3694 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003695}
3696
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003697VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateBuffer(
3698 VkDevice device,
3699 const VkBufferCreateInfo* pCreateInfo,
3700 const VkAllocationCallbacks* pAllocator,
3701 VkBuffer* pBuffer)
3702{
Dustin Graves1e92cd72016-02-09 14:00:18 -07003703 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3704 VkBool32 skipCall = VK_FALSE;
3705 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3706 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003707
Dustin Graves1e92cd72016-02-09 14:00:18 -07003708 skipCall |= param_check_vkCreateBuffer(
3709 my_data->report_data,
3710 pCreateInfo,
3711 pAllocator,
3712 pBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003713
Dustin Graves1e92cd72016-02-09 14:00:18 -07003714 if (skipCall == VK_FALSE) {
3715 PreCreateBuffer(device, pCreateInfo);
3716
3717 result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
3718
3719 PostCreateBuffer(device, pBuffer, result);
3720 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003721
3722 return result;
3723}
3724
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003725bool PreCreateBufferView(
3726 VkDevice device,
3727 const VkBufferViewCreateInfo* pCreateInfo)
3728{
3729 if(pCreateInfo != nullptr)
3730 {
3731 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO)
3732 {
3733 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3734 "vkCreateBufferView parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
3735 return false;
3736 }
3737 if(pCreateInfo->format < VK_FORMAT_BEGIN_RANGE ||
3738 pCreateInfo->format > VK_FORMAT_END_RANGE)
3739 {
3740 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3741 "vkCreateBufferView parameter, VkFormat pCreateInfo->format, is an unrecognized enumerator");
3742 return false;
3743 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003744 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003745
3746 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003747}
3748
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003749bool PostCreateBufferView(
3750 VkDevice device,
3751 VkBufferView* pView,
3752 VkResult result)
3753{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003754
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003755 if(pView != nullptr)
3756 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003757 }
3758
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003759 if(result < VK_SUCCESS)
3760 {
3761 std::string reason = "vkCreateBufferView parameter, VkResult result, is " + EnumeratorString(result);
3762 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 -06003763 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003764 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003765
3766 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003767}
3768
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003769VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateBufferView(
3770 VkDevice device,
3771 const VkBufferViewCreateInfo* pCreateInfo,
3772 const VkAllocationCallbacks* pAllocator,
3773 VkBufferView* pView)
3774{
Dustin Graves1e92cd72016-02-09 14:00:18 -07003775 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3776 VkBool32 skipCall = VK_FALSE;
3777 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3778 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003779
Dustin Graves1e92cd72016-02-09 14:00:18 -07003780 skipCall |= param_check_vkCreateBufferView(
3781 my_data->report_data,
3782 pCreateInfo,
3783 pAllocator,
3784 pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003785
Dustin Graves1e92cd72016-02-09 14:00:18 -07003786 if (skipCall == VK_FALSE) {
3787 PreCreateBufferView(device, pCreateInfo);
3788
3789 result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
3790
3791 PostCreateBufferView(device, pView, result);
3792 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003793
3794 return result;
3795}
3796
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003797bool PreCreateImage(
3798 VkDevice device,
3799 const VkImageCreateInfo* pCreateInfo)
3800{
3801 if(pCreateInfo != nullptr)
3802 {
3803 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO)
3804 {
3805 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3806 "vkCreateImage parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
3807 return false;
3808 }
3809 if(pCreateInfo->imageType < VK_IMAGE_TYPE_BEGIN_RANGE ||
3810 pCreateInfo->imageType > VK_IMAGE_TYPE_END_RANGE)
3811 {
3812 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3813 "vkCreateImage parameter, VkImageType pCreateInfo->imageType, is an unrecognized enumerator");
3814 return false;
3815 }
3816 if(pCreateInfo->format < VK_FORMAT_BEGIN_RANGE ||
3817 pCreateInfo->format > VK_FORMAT_END_RANGE)
3818 {
3819 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3820 "vkCreateImage parameter, VkFormat pCreateInfo->format, is an unrecognized enumerator");
3821 return false;
3822 }
3823 if(pCreateInfo->tiling < VK_IMAGE_TILING_BEGIN_RANGE ||
3824 pCreateInfo->tiling > VK_IMAGE_TILING_END_RANGE)
3825 {
3826 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3827 "vkCreateImage parameter, VkImageTiling pCreateInfo->tiling, is an unrecognized enumerator");
3828 return false;
3829 }
3830 if(pCreateInfo->sharingMode < VK_SHARING_MODE_BEGIN_RANGE ||
3831 pCreateInfo->sharingMode > VK_SHARING_MODE_END_RANGE)
3832 {
3833 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3834 "vkCreateImage parameter, VkSharingMode pCreateInfo->sharingMode, is an unrecognized enumerator");
3835 return false;
3836 }
3837 if(pCreateInfo->pQueueFamilyIndices != nullptr)
3838 {
3839 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003840 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003841
3842 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003843}
3844
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003845bool PostCreateImage(
3846 VkDevice device,
3847 VkImage* pImage,
3848 VkResult result)
3849{
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003850
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003851 if(pImage != nullptr)
3852 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003853 }
3854
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003855 if(result < VK_SUCCESS)
3856 {
3857 std::string reason = "vkCreateImage parameter, VkResult result, is " + EnumeratorString(result);
3858 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 -06003859 return false;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003860 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003861
3862 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003863}
3864
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003865VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImage(
3866 VkDevice device,
3867 const VkImageCreateInfo* pCreateInfo,
3868 const VkAllocationCallbacks* pAllocator,
3869 VkImage* pImage)
3870{
Dustin Graves1e92cd72016-02-09 14:00:18 -07003871 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3872 VkBool32 skipCall = VK_FALSE;
3873 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3874 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003875
Dustin Graves1e92cd72016-02-09 14:00:18 -07003876 skipCall |= param_check_vkCreateImage(
3877 my_data->report_data,
3878 pCreateInfo,
3879 pAllocator,
3880 pImage);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003881
Dustin Graves1e92cd72016-02-09 14:00:18 -07003882 if (skipCall == VK_FALSE) {
3883 PreCreateImage(device, pCreateInfo);
3884
3885 result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
3886
3887 PostCreateImage(device, pImage, result);
3888 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003889
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003890 return result;
3891}
3892
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003893bool PreGetImageSubresourceLayout(
3894 VkDevice device,
3895 const VkImageSubresource* pSubresource)
3896{
3897 if(pSubresource != nullptr)
3898 {
3899 if ((pSubresource->aspectMask &
3900 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
3901 {
3902 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3903 "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
3904 return false;
3905 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06003906 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003907
3908 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003909}
3910
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003911bool PostGetImageSubresourceLayout(
3912 VkDevice device,
3913 VkImage image,
3914 VkSubresourceLayout* pLayout)
3915{
Jeremy Hayes99a96322015-06-26 12:48:09 -06003916
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003917
3918 if(pLayout != nullptr)
3919 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06003920 }
3921
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003922 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06003923}
3924
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003925VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetImageSubresourceLayout(
3926 VkDevice device,
3927 VkImage image,
3928 const VkImageSubresource* pSubresource,
3929 VkSubresourceLayout* pLayout)
3930{
Dustin Graves1e92cd72016-02-09 14:00:18 -07003931 VkBool32 skipCall = VK_FALSE;
3932 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3933 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06003934
Dustin Graves1e92cd72016-02-09 14:00:18 -07003935 skipCall |= param_check_vkGetImageSubresourceLayout(
3936 my_data->report_data,
3937 image,
3938 pSubresource,
3939 pLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06003940
Dustin Graves1e92cd72016-02-09 14:00:18 -07003941 if (skipCall == VK_FALSE) {
3942 PreGetImageSubresourceLayout(device, pSubresource);
3943
3944 get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
3945
3946 PostGetImageSubresourceLayout(device, image, pLayout);
3947 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06003948}
3949
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07003950bool PreCreateImageView(
3951 VkDevice device,
3952 const VkImageViewCreateInfo* pCreateInfo)
3953{
3954 if(pCreateInfo != nullptr)
3955 {
3956 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO)
3957 {
3958 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3959 "vkCreateImageView parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
3960 return false;
3961 }
3962 if(pCreateInfo->viewType < VK_IMAGE_VIEW_TYPE_BEGIN_RANGE ||
3963 pCreateInfo->viewType > VK_IMAGE_VIEW_TYPE_END_RANGE)
3964 {
3965 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3966 "vkCreateImageView parameter, VkImageViewType pCreateInfo->viewType, is an unrecognized enumerator");
3967 return false;
3968 }
3969 if(pCreateInfo->format < VK_FORMAT_BEGIN_RANGE ||
3970 pCreateInfo->format > VK_FORMAT_END_RANGE)
3971 {
3972 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3973 "vkCreateImageView parameter, VkFormat pCreateInfo->format, is an unrecognized enumerator");
3974 return false;
3975 }
3976 if(pCreateInfo->components.r < VK_COMPONENT_SWIZZLE_BEGIN_RANGE ||
3977 pCreateInfo->components.r > VK_COMPONENT_SWIZZLE_END_RANGE)
3978 {
3979 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3980 "vkCreateImageView parameter, VkComponentSwizzle pCreateInfo->components.r, is an unrecognized enumerator");
3981 return false;
3982 }
3983 if(pCreateInfo->components.g < VK_COMPONENT_SWIZZLE_BEGIN_RANGE ||
3984 pCreateInfo->components.g > VK_COMPONENT_SWIZZLE_END_RANGE)
3985 {
3986 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3987 "vkCreateImageView parameter, VkComponentSwizzle pCreateInfo->components.g, is an unrecognized enumerator");
3988 return false;
3989 }
3990 if(pCreateInfo->components.b < VK_COMPONENT_SWIZZLE_BEGIN_RANGE ||
3991 pCreateInfo->components.b > VK_COMPONENT_SWIZZLE_END_RANGE)
3992 {
3993 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
3994 "vkCreateImageView parameter, VkComponentSwizzle pCreateInfo->components.b, is an unrecognized enumerator");
3995 return false;
3996 }
3997 if(pCreateInfo->components.a < VK_COMPONENT_SWIZZLE_BEGIN_RANGE ||
3998 pCreateInfo->components.a > VK_COMPONENT_SWIZZLE_END_RANGE)
3999 {
4000 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4001 "vkCreateImageView parameter, VkComponentSwizzle pCreateInfo->components.a, is an unrecognized enumerator");
4002 return false;
4003 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004004 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004005
4006 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06004007}
4008
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004009bool PostCreateImageView(
4010 VkDevice device,
4011 VkImageView* pView,
4012 VkResult result)
4013{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004014
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004015 if(pView != nullptr)
4016 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004017 }
4018
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004019 if(result < VK_SUCCESS)
4020 {
4021 std::string reason = "vkCreateImageView parameter, VkResult result, is " + EnumeratorString(result);
4022 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 -06004023 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004024 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004025
4026 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004027}
4028
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004029VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImageView(
4030 VkDevice device,
4031 const VkImageViewCreateInfo* pCreateInfo,
4032 const VkAllocationCallbacks* pAllocator,
4033 VkImageView* pView)
4034{
Dustin Graves1e92cd72016-02-09 14:00:18 -07004035 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4036 VkBool32 skipCall = VK_FALSE;
4037 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4038 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004039
Dustin Graves1e92cd72016-02-09 14:00:18 -07004040 skipCall |= param_check_vkCreateImageView(
4041 my_data->report_data,
4042 pCreateInfo,
4043 pAllocator,
4044 pView);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004045
Dustin Graves1e92cd72016-02-09 14:00:18 -07004046 if (skipCall == VK_FALSE) {
4047 PreCreateImageView(device, pCreateInfo);
4048
4049 result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
4050
4051 PostCreateImageView(device, pView, result);
4052 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004053
4054 return result;
4055}
4056
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004057bool PreCreateShaderModule(
4058 VkDevice device,
4059 const VkShaderModuleCreateInfo* pCreateInfo)
4060{
4061 if(pCreateInfo) {
4062 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO) {
4063 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4064 "vkCreateShaderModule parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
Michael Lentine03d8e572015-09-15 14:59:14 -05004065 return false;
4066 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004067 if(!pCreateInfo->pCode) {
4068 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4069 "vkCreateShaderModule paramter, void* pCreateInfo->pCode, is null");
Michael Lentine03d8e572015-09-15 14:59:14 -05004070 return false;
4071 }
4072 } else {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004073 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4074 "vkCreateShaderModule parameter, VkShaderModuleCreateInfo pCreateInfo, is null");
Michael Lentine03d8e572015-09-15 14:59:14 -05004075 return false;
4076 }
4077
4078 return true;
4079}
4080
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004081bool PostCreateShaderModule(
4082 VkDevice device,
4083 VkShaderModule* pShaderModule,
4084 VkResult result)
4085{
4086 if(result < VK_SUCCESS) {
4087 std::string reason = "vkCreateShaderModule parameter, VkResult result, is " + EnumeratorString(result);
4088 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 -05004089 return false;
4090 }
4091
4092 return true;
4093}
4094
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004095VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateShaderModule(
4096 VkDevice device,
4097 const VkShaderModuleCreateInfo* pCreateInfo,
4098 const VkAllocationCallbacks* pAllocator,
4099 VkShaderModule* pShaderModule)
4100{
Dustin Graves1e92cd72016-02-09 14:00:18 -07004101 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4102 VkBool32 skipCall = VK_FALSE;
4103 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4104 assert(my_data != NULL);
4105
4106 skipCall |= param_check_vkCreateShaderModule(
4107 my_data->report_data,
4108 pCreateInfo,
4109 pAllocator,
4110 pShaderModule);
4111
4112 if (skipCall == VK_FALSE) {
4113 PreCreateShaderModule(device, pCreateInfo);
4114
4115 result = get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
4116
4117 PostCreateShaderModule(device, pShaderModule, result);
4118 }
4119
Michael Lentine03d8e572015-09-15 14:59:14 -05004120 return result;
4121}
4122
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004123bool PreCreatePipelineCache(
4124 VkDevice device,
4125 const VkPipelineCacheCreateInfo* pCreateInfo)
4126{
4127 if(pCreateInfo != nullptr)
4128 {
4129 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO)
4130 {
4131 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4132 "vkCreatePipelineCache parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
4133 return false;
4134 }
4135 if(pCreateInfo->pInitialData != nullptr)
4136 {
4137 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004138 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004139
4140 return true;
4141}
4142
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004143bool PostCreatePipelineCache(
4144 VkDevice device,
4145 VkPipelineCache* pPipelineCache,
4146 VkResult result)
4147{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004148
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004149 if(pPipelineCache != nullptr)
4150 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004151 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004152
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004153 if(result < VK_SUCCESS)
4154 {
4155 std::string reason = "vkCreatePipelineCache parameter, VkResult result, is " + EnumeratorString(result);
4156 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 -06004157 return false;
4158 }
4159
4160 return true;
4161}
4162
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004163VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineCache(
4164 VkDevice device,
4165 const VkPipelineCacheCreateInfo* pCreateInfo,
4166 const VkAllocationCallbacks* pAllocator,
4167 VkPipelineCache* pPipelineCache)
4168{
Dustin Graves1e92cd72016-02-09 14:00:18 -07004169 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4170 VkBool32 skipCall = VK_FALSE;
4171 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4172 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004173
Dustin Graves1e92cd72016-02-09 14:00:18 -07004174 skipCall |= param_check_vkCreatePipelineCache(
4175 my_data->report_data,
4176 pCreateInfo,
4177 pAllocator,
4178 pPipelineCache);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004179
Dustin Graves1e92cd72016-02-09 14:00:18 -07004180 if (skipCall == VK_FALSE) {
4181 PreCreatePipelineCache(device, pCreateInfo);
4182
4183 result = get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
4184
4185 PostCreatePipelineCache(device, pPipelineCache, result);
4186 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004187
4188 return result;
4189}
4190
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004191bool PostGetPipelineCacheData(
4192 VkDevice device,
4193 VkPipelineCache pipelineCache,
4194 size_t* pDataSize,
4195 void* pData,
4196 VkResult result)
4197{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004198
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004199
4200 if(pDataSize != nullptr)
4201 {
Chia-I Wub16facd2015-10-26 19:17:06 +08004202 }
4203
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004204 if(pData != nullptr)
4205 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004206 }
4207
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004208 if(result < VK_SUCCESS)
4209 {
4210 std::string reason = "vkGetPipelineCacheData parameter, VkResult result, is " + EnumeratorString(result);
4211 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 -06004212 return false;
4213 }
4214
4215 return true;
4216}
4217
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004218VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPipelineCacheData(
4219 VkDevice device,
4220 VkPipelineCache pipelineCache,
4221 size_t* pDataSize,
4222 void* pData)
4223{
Dustin Graves1e92cd72016-02-09 14:00:18 -07004224 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4225 VkBool32 skipCall = VK_FALSE;
4226 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4227 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004228
Dustin Graves1e92cd72016-02-09 14:00:18 -07004229 skipCall |= param_check_vkGetPipelineCacheData(
4230 my_data->report_data,
4231 pipelineCache,
4232 pDataSize,
4233 pData);
4234
4235 if (skipCall == VK_FALSE) {
4236 result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
4237
4238 PostGetPipelineCacheData(device, pipelineCache, pDataSize, pData, result);
4239 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004240
4241 return result;
4242}
4243
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004244bool PreMergePipelineCaches(
4245 VkDevice device,
4246 const VkPipelineCache* pSrcCaches)
4247{
4248 if(pSrcCaches != nullptr)
4249 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004250 }
4251
4252 return true;
4253}
4254
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004255bool PostMergePipelineCaches(
4256 VkDevice device,
4257 VkPipelineCache dstCache,
4258 uint32_t srcCacheCount,
4259 VkResult result)
4260{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004261
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004262
4263
4264 if(result < VK_SUCCESS)
4265 {
4266 std::string reason = "vkMergePipelineCaches parameter, VkResult result, is " + EnumeratorString(result);
4267 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 -06004268 return false;
4269 }
4270
4271 return true;
4272}
4273
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004274VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkMergePipelineCaches(
4275 VkDevice device,
4276 VkPipelineCache dstCache,
4277 uint32_t srcCacheCount,
4278 const VkPipelineCache* pSrcCaches)
4279{
Dustin Graves1e92cd72016-02-09 14:00:18 -07004280 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4281 VkBool32 skipCall = VK_FALSE;
4282 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4283 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004284
Dustin Graves1e92cd72016-02-09 14:00:18 -07004285 skipCall |= param_check_vkMergePipelineCaches(
4286 my_data->report_data,
4287 dstCache,
4288 srcCacheCount,
4289 pSrcCaches);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004290
Dustin Graves1e92cd72016-02-09 14:00:18 -07004291 if (skipCall == VK_FALSE) {
4292 PreMergePipelineCaches(device, pSrcCaches);
4293
4294 result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
4295
4296 PostMergePipelineCaches(device, dstCache, srcCacheCount, result);
4297 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004298
4299 return result;
4300}
4301
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004302bool PreCreateGraphicsPipelines(
4303 VkDevice device,
4304 const VkGraphicsPipelineCreateInfo* pCreateInfos)
4305{
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004306 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4307
4308 // TODO: Handle count
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004309 if(pCreateInfos != nullptr)
4310 {
4311 if(pCreateInfos->sType != VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO)
4312 {
4313 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4314 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->sType, is an invalid enumerator");
4315 return false;
4316 }
4317 if(pCreateInfos->pStages != nullptr)
4318 {
4319 if(pCreateInfos->pStages->sType != VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO)
4320 {
4321 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4322 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pStages->sType, is an invalid enumerator");
4323 return false;
4324 }
4325 if(pCreateInfos->pStages->pSpecializationInfo != nullptr)
4326 {
4327 if(pCreateInfos->pStages->pSpecializationInfo->pMapEntries != nullptr)
4328 {
4329 }
4330 if(pCreateInfos->pStages->pSpecializationInfo->pData != nullptr)
4331 {
4332 }
4333 }
4334 }
4335 if(pCreateInfos->pVertexInputState != nullptr)
4336 {
4337 if(pCreateInfos->pVertexInputState->sType != VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO)
4338 {
4339 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4340 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pVertexInputState->sType, is an invalid enumerator");
4341 return false;
4342 }
4343 if(pCreateInfos->pVertexInputState->pVertexBindingDescriptions != nullptr)
4344 {
4345 if(pCreateInfos->pVertexInputState->pVertexBindingDescriptions->inputRate < VK_VERTEX_INPUT_RATE_BEGIN_RANGE ||
4346 pCreateInfos->pVertexInputState->pVertexBindingDescriptions->inputRate > VK_VERTEX_INPUT_RATE_END_RANGE)
4347 {
4348 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4349 "vkCreateGraphicsPipelines parameter, VkVertexInputRate pCreateInfos->pVertexInputState->pVertexBindingDescriptions->inputRate, is an unrecognized enumerator");
4350 return false;
4351 }
4352 }
4353 if(pCreateInfos->pVertexInputState->pVertexAttributeDescriptions != nullptr)
4354 {
4355 if(pCreateInfos->pVertexInputState->pVertexAttributeDescriptions->format < VK_FORMAT_BEGIN_RANGE ||
4356 pCreateInfos->pVertexInputState->pVertexAttributeDescriptions->format > VK_FORMAT_END_RANGE)
4357 {
4358 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4359 "vkCreateGraphicsPipelines parameter, VkFormat pCreateInfos->pVertexInputState->pVertexAttributeDescriptions->format, is an unrecognized enumerator");
4360 return false;
4361 }
4362 }
4363 }
4364 if(pCreateInfos->pInputAssemblyState != nullptr)
4365 {
4366 if(pCreateInfos->pInputAssemblyState->sType != VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO)
4367 {
4368 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4369 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pInputAssemblyState->sType, is an invalid enumerator");
4370 return false;
4371 }
4372 if(pCreateInfos->pInputAssemblyState->topology < VK_PRIMITIVE_TOPOLOGY_BEGIN_RANGE ||
4373 pCreateInfos->pInputAssemblyState->topology > VK_PRIMITIVE_TOPOLOGY_END_RANGE)
4374 {
4375 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4376 "vkCreateGraphicsPipelines parameter, VkPrimitiveTopology pCreateInfos->pInputAssemblyState->topology, is an unrecognized enumerator");
4377 return false;
4378 }
4379 }
4380 if(pCreateInfos->pTessellationState != nullptr)
4381 {
4382 if(pCreateInfos->pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO)
4383 {
4384 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4385 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pTessellationState->sType, is an invalid enumerator");
4386 return false;
4387 }
4388 }
4389 if(pCreateInfos->pViewportState != nullptr)
4390 {
4391 if(pCreateInfos->pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO)
4392 {
4393 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4394 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pViewportState->sType, is an invalid enumerator");
4395 return false;
4396 }
4397 }
4398 if(pCreateInfos->pRasterizationState != nullptr)
4399 {
4400 if(pCreateInfos->pRasterizationState->sType != VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO)
4401 {
4402 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4403 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pRasterizationState->sType, is an invalid enumerator");
4404 return false;
4405 }
4406 if(pCreateInfos->pRasterizationState->polygonMode < VK_POLYGON_MODE_BEGIN_RANGE ||
4407 pCreateInfos->pRasterizationState->polygonMode > VK_POLYGON_MODE_END_RANGE)
4408 {
4409 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4410 "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode, is an unrecognized enumerator");
4411 return false;
4412 }
4413 if(pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK)
4414 {
4415 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4416 "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an unrecognized enumerator");
4417 return false;
4418 }
4419 if(pCreateInfos->pRasterizationState->frontFace < VK_FRONT_FACE_BEGIN_RANGE ||
4420 pCreateInfos->pRasterizationState->frontFace > VK_FRONT_FACE_END_RANGE)
4421 {
4422 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4423 "vkCreateGraphicsPipelines parameter, VkFrontFace pCreateInfos->pRasterizationState->frontFace, is an unrecognized enumerator");
4424 return false;
4425 }
4426 }
4427 if(pCreateInfos->pMultisampleState != nullptr)
4428 {
4429 if(pCreateInfos->pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO)
4430 {
4431 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4432 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pMultisampleState->sType, is an invalid enumerator");
4433 return false;
4434 }
4435 }
4436 if(pCreateInfos->pDepthStencilState != nullptr)
4437 {
4438 if(pCreateInfos->pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO)
4439 {
4440 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4441 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pDepthStencilState->sType, is an invalid enumerator");
4442 return false;
4443 }
4444 if(pCreateInfos->pDepthStencilState->depthCompareOp < VK_COMPARE_OP_BEGIN_RANGE ||
4445 pCreateInfos->pDepthStencilState->depthCompareOp > VK_COMPARE_OP_END_RANGE)
4446 {
4447 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4448 "vkCreateGraphicsPipelines parameter, VkCompareOp pCreateInfos->pDepthStencilState->depthCompareOp, is an unrecognized enumerator");
4449 return false;
4450 }
4451 if(pCreateInfos->pDepthStencilState->front.failOp < VK_STENCIL_OP_BEGIN_RANGE ||
4452 pCreateInfos->pDepthStencilState->front.failOp > VK_STENCIL_OP_END_RANGE)
4453 {
4454 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4455 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->front.failOp, is an unrecognized enumerator");
4456 return false;
4457 }
4458 if(pCreateInfos->pDepthStencilState->front.passOp < VK_STENCIL_OP_BEGIN_RANGE ||
4459 pCreateInfos->pDepthStencilState->front.passOp > VK_STENCIL_OP_END_RANGE)
4460 {
4461 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4462 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->front.passOp, is an unrecognized enumerator");
4463 return false;
4464 }
4465 if(pCreateInfos->pDepthStencilState->front.depthFailOp < VK_STENCIL_OP_BEGIN_RANGE ||
4466 pCreateInfos->pDepthStencilState->front.depthFailOp > VK_STENCIL_OP_END_RANGE)
4467 {
4468 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4469 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->front.depthFailOp, is an unrecognized enumerator");
4470 return false;
4471 }
4472 if(pCreateInfos->pDepthStencilState->front.compareOp < VK_COMPARE_OP_BEGIN_RANGE ||
4473 pCreateInfos->pDepthStencilState->front.compareOp > VK_COMPARE_OP_END_RANGE)
4474 {
4475 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4476 "vkCreateGraphicsPipelines parameter, VkCompareOp pCreateInfos->pDepthStencilState->front.compareOp, is an unrecognized enumerator");
4477 return false;
4478 }
4479 if(pCreateInfos->pDepthStencilState->back.failOp < VK_STENCIL_OP_BEGIN_RANGE ||
4480 pCreateInfos->pDepthStencilState->back.failOp > VK_STENCIL_OP_END_RANGE)
4481 {
4482 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4483 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->back.failOp, is an unrecognized enumerator");
4484 return false;
4485 }
4486 if(pCreateInfos->pDepthStencilState->back.passOp < VK_STENCIL_OP_BEGIN_RANGE ||
4487 pCreateInfos->pDepthStencilState->back.passOp > VK_STENCIL_OP_END_RANGE)
4488 {
4489 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4490 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->back.passOp, is an unrecognized enumerator");
4491 return false;
4492 }
4493 if(pCreateInfos->pDepthStencilState->back.depthFailOp < VK_STENCIL_OP_BEGIN_RANGE ||
4494 pCreateInfos->pDepthStencilState->back.depthFailOp > VK_STENCIL_OP_END_RANGE)
4495 {
4496 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4497 "vkCreateGraphicsPipelines parameter, VkStencilOp pCreateInfos->pDepthStencilState->back.depthFailOp, is an unrecognized enumerator");
4498 return false;
4499 }
4500 if(pCreateInfos->pDepthStencilState->back.compareOp < VK_COMPARE_OP_BEGIN_RANGE ||
4501 pCreateInfos->pDepthStencilState->back.compareOp > VK_COMPARE_OP_END_RANGE)
4502 {
4503 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4504 "vkCreateGraphicsPipelines parameter, VkCompareOp pCreateInfos->pDepthStencilState->back.compareOp, is an unrecognized enumerator");
4505 return false;
4506 }
4507 }
4508 if(pCreateInfos->pColorBlendState != nullptr)
4509 {
4510 if(pCreateInfos->pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO)
4511 {
4512 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4513 "vkCreateGraphicsPipelines parameter, VkStructureType pCreateInfos->pColorBlendState->sType, is an invalid enumerator");
4514 return false;
4515 }
Michael Lentine0a369f62016-02-03 16:51:46 -06004516 if (pCreateInfos->pColorBlendState->logicOpEnable == VK_TRUE &&
4517 (pCreateInfos->pColorBlendState->logicOp < VK_LOGIC_OP_BEGIN_RANGE ||
4518 pCreateInfos->pColorBlendState->logicOp > VK_LOGIC_OP_END_RANGE)) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004519 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4520 "vkCreateGraphicsPipelines parameter, VkLogicOp pCreateInfos->pColorBlendState->logicOp, is an unrecognized enumerator");
4521 return false;
4522 }
4523 if(pCreateInfos->pColorBlendState->pAttachments != nullptr && pCreateInfos->pColorBlendState->pAttachments->blendEnable == VK_TRUE)
4524 {
4525 if(pCreateInfos->pColorBlendState->pAttachments->srcColorBlendFactor < VK_BLEND_FACTOR_BEGIN_RANGE ||
4526 pCreateInfos->pColorBlendState->pAttachments->srcColorBlendFactor > VK_BLEND_FACTOR_END_RANGE)
4527 {
4528 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4529 "vkCreateGraphicsPipelines parameter, VkBlendFactor pCreateInfos->pColorBlendState->pAttachments->srcColorBlendFactor, is an unrecognized enumerator");
4530 return false;
4531 }
4532 if(pCreateInfos->pColorBlendState->pAttachments->dstColorBlendFactor < VK_BLEND_FACTOR_BEGIN_RANGE ||
4533 pCreateInfos->pColorBlendState->pAttachments->dstColorBlendFactor > VK_BLEND_FACTOR_END_RANGE)
4534 {
4535 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4536 "vkCreateGraphicsPipelines parameter, VkBlendFactor pCreateInfos->pColorBlendState->pAttachments->dstColorBlendFactor, is an unrecognized enumerator");
4537 return false;
4538 }
4539 if(pCreateInfos->pColorBlendState->pAttachments->colorBlendOp < VK_BLEND_OP_BEGIN_RANGE ||
4540 pCreateInfos->pColorBlendState->pAttachments->colorBlendOp > VK_BLEND_OP_END_RANGE)
4541 {
4542 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4543 "vkCreateGraphicsPipelines parameter, VkBlendOp pCreateInfos->pColorBlendState->pAttachments->colorBlendOp, is an unrecognized enumerator");
4544 return false;
4545 }
4546 if(pCreateInfos->pColorBlendState->pAttachments->srcAlphaBlendFactor < VK_BLEND_FACTOR_BEGIN_RANGE ||
4547 pCreateInfos->pColorBlendState->pAttachments->srcAlphaBlendFactor > VK_BLEND_FACTOR_END_RANGE)
4548 {
4549 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4550 "vkCreateGraphicsPipelines parameter, VkBlendFactor pCreateInfos->pColorBlendState->pAttachments->srcAlphaBlendFactor, is an unrecognized enumerator");
4551 return false;
4552 }
4553 if(pCreateInfos->pColorBlendState->pAttachments->dstAlphaBlendFactor < VK_BLEND_FACTOR_BEGIN_RANGE ||
4554 pCreateInfos->pColorBlendState->pAttachments->dstAlphaBlendFactor > VK_BLEND_FACTOR_END_RANGE)
4555 {
4556 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4557 "vkCreateGraphicsPipelines parameter, VkBlendFactor pCreateInfos->pColorBlendState->pAttachments->dstAlphaBlendFactor, is an unrecognized enumerator");
4558 return false;
4559 }
4560 if(pCreateInfos->pColorBlendState->pAttachments->alphaBlendOp < VK_BLEND_OP_BEGIN_RANGE ||
4561 pCreateInfos->pColorBlendState->pAttachments->alphaBlendOp > VK_BLEND_OP_END_RANGE)
4562 {
4563 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4564 "vkCreateGraphicsPipelines parameter, VkBlendOp pCreateInfos->pColorBlendState->pAttachments->alphaBlendOp, is an unrecognized enumerator");
4565 return false;
4566 }
4567 }
4568 }
4569 if(pCreateInfos->renderPass == VK_NULL_HANDLE)
4570 {
4571 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4572 "vkCreateGraphicsPipelines parameter, VkRenderPass pCreateInfos->renderPass, is null pointer");
4573 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004574
4575 int i = 0;
4576 for (auto j = 0; j < pCreateInfos[i].stageCount; j++) {
4577 validate_string(data, "vkCreateGraphicsPipelines()", "pCreateInfos[i].pStages[j].pName", pCreateInfos[i].pStages[j].pName);
4578 }
4579
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004580 }
4581
4582 return true;
4583}
4584
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004585bool PostCreateGraphicsPipelines(
4586 VkDevice device,
4587 VkPipelineCache pipelineCache,
4588 uint32_t count,
4589 VkPipeline* pPipelines,
4590 VkResult result)
4591{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004592
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004593
4594
4595 if(pPipelines != nullptr)
4596 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004597 }
4598
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004599 if(result < VK_SUCCESS)
4600 {
4601 std::string reason = "vkCreateGraphicsPipelines parameter, VkResult result, is " + EnumeratorString(result);
4602 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 -06004603 return false;
4604 }
4605
4606 return true;
4607}
4608
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004609VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateGraphicsPipelines(
4610 VkDevice device,
4611 VkPipelineCache pipelineCache,
Dustin Graves1e92cd72016-02-09 14:00:18 -07004612 uint32_t createInfoCount,
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004613 const VkGraphicsPipelineCreateInfo* pCreateInfos,
4614 const VkAllocationCallbacks* pAllocator,
4615 VkPipeline* pPipelines)
4616{
Dustin Graves1e92cd72016-02-09 14:00:18 -07004617 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4618 VkBool32 skipCall = VK_FALSE;
4619 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4620 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004621
Dustin Graves1e92cd72016-02-09 14:00:18 -07004622 skipCall |= param_check_vkCreateGraphicsPipelines(
4623 my_data->report_data,
4624 pipelineCache,
4625 createInfoCount,
4626 pCreateInfos,
4627 pAllocator,
4628 pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004629
Dustin Graves1e92cd72016-02-09 14:00:18 -07004630 if (skipCall == VK_FALSE) {
4631 PreCreateGraphicsPipelines(device, pCreateInfos);
4632
4633 result = get_dispatch_table(pc_device_table_map, device)->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
4634
4635 PostCreateGraphicsPipelines(device, pipelineCache, createInfoCount, pPipelines, result);
4636 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004637
4638 return result;
4639}
4640
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004641bool PreCreateComputePipelines(
4642 VkDevice device,
4643 const VkComputePipelineCreateInfo* pCreateInfos)
4644{
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004645 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4646
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004647 if(pCreateInfos != nullptr)
4648 {
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004649 // TODO: Handle count!
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004650 if(pCreateInfos->sType != VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO)
4651 {
4652 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4653 "vkCreateComputePipelines parameter, VkStructureType pCreateInfos->sType, is an invalid enumerator");
4654 return false;
4655 }
4656 if(pCreateInfos->stage.sType != VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO)
4657 {
4658 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4659 "vkCreateComputePipelines parameter, VkStructureType pCreateInfos->cs.sType, is an invalid enumerator");
4660 return false;
4661 }
4662 if(pCreateInfos->stage.pSpecializationInfo != nullptr)
4663 {
4664 if(pCreateInfos->stage.pSpecializationInfo->pMapEntries != nullptr)
4665 {
4666 }
4667 if(pCreateInfos->stage.pSpecializationInfo->pData != nullptr)
4668 {
4669 }
4670 }
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07004671
4672 int i = 0;
4673 validate_string(data, "vkCreateComputePipelines()", "pCreateInfos[i].stage.pName", pCreateInfos[i].stage.pName);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004674 }
4675
4676 return true;
4677}
4678
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004679bool PostCreateComputePipelines(
4680 VkDevice device,
4681 VkPipelineCache pipelineCache,
4682 uint32_t count,
4683 VkPipeline* pPipelines,
4684 VkResult result)
4685{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004686
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004687
4688
4689 if(pPipelines != nullptr)
4690 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004691 }
4692
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004693 if(result < VK_SUCCESS)
4694 {
4695 std::string reason = "vkCreateComputePipelines parameter, VkResult result, is " + EnumeratorString(result);
4696 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 -06004697 return false;
4698 }
4699
4700 return true;
4701}
4702
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004703VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateComputePipelines(
4704 VkDevice device,
4705 VkPipelineCache pipelineCache,
Dustin Graves1e92cd72016-02-09 14:00:18 -07004706 uint32_t createInfoCount,
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004707 const VkComputePipelineCreateInfo* pCreateInfos,
4708 const VkAllocationCallbacks* pAllocator,
4709 VkPipeline* pPipelines)
4710{
Dustin Graves1e92cd72016-02-09 14:00:18 -07004711 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4712 VkBool32 skipCall = VK_FALSE;
4713 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4714 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004715
Dustin Graves1e92cd72016-02-09 14:00:18 -07004716 skipCall |= param_check_vkCreateComputePipelines(
4717 my_data->report_data,
4718 pipelineCache,
4719 createInfoCount,
4720 pCreateInfos,
4721 pAllocator,
4722 pPipelines);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004723
Dustin Graves1e92cd72016-02-09 14:00:18 -07004724 if (skipCall == VK_FALSE) {
4725 PreCreateComputePipelines(device, pCreateInfos);
4726
4727 result = get_dispatch_table(pc_device_table_map, device)->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
4728
4729 PostCreateComputePipelines(device, pipelineCache, createInfoCount, pPipelines, result);
4730 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004731
4732 return result;
4733}
4734
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004735bool PreCreatePipelineLayout(
4736 VkDevice device,
4737 const VkPipelineLayoutCreateInfo* pCreateInfo)
4738{
4739 if(pCreateInfo != nullptr)
4740 {
4741 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO)
4742 {
4743 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4744 "vkCreatePipelineLayout parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
4745 return false;
4746 }
4747 if(pCreateInfo->pSetLayouts != nullptr)
4748 {
4749 }
4750 if(pCreateInfo->pPushConstantRanges != nullptr)
4751 {
4752 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06004753 }
4754
4755 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004756}
4757
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004758bool PostCreatePipelineLayout(
4759 VkDevice device,
4760 VkPipelineLayout* pPipelineLayout,
4761 VkResult result)
4762{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004763
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004764 if(pPipelineLayout != nullptr)
4765 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004766 }
4767
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004768 if(result < VK_SUCCESS)
4769 {
4770 std::string reason = "vkCreatePipelineLayout parameter, VkResult result, is " + EnumeratorString(result);
4771 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 -06004772 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004773 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004774
4775 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004776}
4777
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004778VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineLayout(
4779 VkDevice device,
4780 const VkPipelineLayoutCreateInfo* pCreateInfo,
4781 const VkAllocationCallbacks* pAllocator,
4782 VkPipelineLayout* pPipelineLayout)
4783{
Dustin Graves1e92cd72016-02-09 14:00:18 -07004784 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4785 VkBool32 skipCall = VK_FALSE;
4786 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4787 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004788
Dustin Graves1e92cd72016-02-09 14:00:18 -07004789 skipCall |= param_check_vkCreatePipelineLayout(
4790 my_data->report_data,
4791 pCreateInfo,
4792 pAllocator,
4793 pPipelineLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004794
Dustin Graves1e92cd72016-02-09 14:00:18 -07004795 if (skipCall == VK_FALSE) {
4796 PreCreatePipelineLayout(device, pCreateInfo);
4797
4798 result = get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
4799
4800 PostCreatePipelineLayout(device, pPipelineLayout, result);
4801 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004802
4803 return result;
4804}
4805
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004806bool PreCreateSampler(
4807 VkDevice device,
4808 const VkSamplerCreateInfo* pCreateInfo)
4809{
4810 if(pCreateInfo != nullptr)
4811 {
4812 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO)
4813 {
4814 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4815 "vkCreateSampler parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
4816 return false;
4817 }
4818 if(pCreateInfo->magFilter < VK_FILTER_BEGIN_RANGE ||
4819 pCreateInfo->magFilter > VK_FILTER_END_RANGE)
4820 {
4821 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4822 "vkCreateSampler parameter, VkFilter pCreateInfo->magFilter, is an unrecognized enumerator");
4823 return false;
4824 }
4825 if(pCreateInfo->minFilter < VK_FILTER_BEGIN_RANGE ||
4826 pCreateInfo->minFilter > VK_FILTER_END_RANGE)
4827 {
4828 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4829 "vkCreateSampler parameter, VkFilter pCreateInfo->minFilter, is an unrecognized enumerator");
4830 return false;
4831 }
4832 if(pCreateInfo->mipmapMode < VK_SAMPLER_MIPMAP_MODE_BEGIN_RANGE ||
4833 pCreateInfo->mipmapMode > VK_SAMPLER_MIPMAP_MODE_END_RANGE)
4834 {
4835 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4836 "vkCreateSampler parameter, VkSamplerMipmapMode pCreateInfo->mipmapMode, is an unrecognized enumerator");
4837 return false;
4838 }
4839 if(pCreateInfo->addressModeU < VK_SAMPLER_ADDRESS_MODE_BEGIN_RANGE ||
4840 pCreateInfo->addressModeU > VK_SAMPLER_ADDRESS_MODE_END_RANGE)
4841 {
4842 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4843 "vkCreateSampler parameter, VkTexAddress pCreateInfo->addressModeU, is an unrecognized enumerator");
4844 return false;
4845 }
4846 if(pCreateInfo->addressModeV < VK_SAMPLER_ADDRESS_MODE_BEGIN_RANGE ||
4847 pCreateInfo->addressModeV > VK_SAMPLER_ADDRESS_MODE_END_RANGE)
4848 {
4849 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4850 "vkCreateSampler parameter, VkTexAddress pCreateInfo->addressModeV, is an unrecognized enumerator");
4851 return false;
4852 }
4853 if(pCreateInfo->addressModeW < VK_SAMPLER_ADDRESS_MODE_BEGIN_RANGE ||
4854 pCreateInfo->addressModeW > VK_SAMPLER_ADDRESS_MODE_END_RANGE)
4855 {
4856 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4857 "vkCreateSampler parameter, VkTexAddress pCreateInfo->addressModeW, is an unrecognized enumerator");
4858 return false;
4859 }
rdb941f46e2016-02-21 02:14:18 +01004860 if(pCreateInfo->anisotropyEnable > VK_TRUE)
4861 {
4862 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4863 "vkCreateSampler parameter, VkBool32 pCreateInfo->anisotropyEnable, is an unrecognized boolean");
4864 return false;
4865 }
4866 if(pCreateInfo->compareEnable > VK_TRUE)
4867 {
4868 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4869 "vkCreateSampler parameter, VkBool32 pCreateInfo->compareEnable, is an unrecognized boolean");
4870 return false;
4871 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004872 if(pCreateInfo->compareEnable)
4873 {
4874 if(pCreateInfo->compareOp < VK_COMPARE_OP_BEGIN_RANGE ||
4875 pCreateInfo->compareOp > VK_COMPARE_OP_END_RANGE)
4876 {
4877 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4878 "vkCreateSampler parameter, VkCompareOp pCreateInfo->compareOp, is an unrecognized enumerator");
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004879 return false;
4880 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004881 }
4882 if(pCreateInfo->borderColor < VK_BORDER_COLOR_BEGIN_RANGE ||
4883 pCreateInfo->borderColor > VK_BORDER_COLOR_END_RANGE)
4884 {
4885 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4886 "vkCreateSampler parameter, VkBorderColor pCreateInfo->borderColor, is an unrecognized enumerator");
4887 return false;
4888 }
rdb941f46e2016-02-21 02:14:18 +01004889 if(pCreateInfo->unnormalizedCoordinates > VK_TRUE)
4890 {
4891 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4892 "vkCreateSampler parameter, VkBool32 pCreateInfo->unnormalizedCoordinates, is an unrecognized boolean");
4893 return false;
4894 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004895 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004896
4897 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004898}
4899
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004900bool PostCreateSampler(
4901 VkDevice device,
4902 VkSampler* pSampler,
4903 VkResult result)
4904{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004905
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004906 if(pSampler != nullptr)
4907 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004908 }
4909
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004910 if(result < VK_SUCCESS)
4911 {
4912 std::string reason = "vkCreateSampler parameter, VkResult result, is " + EnumeratorString(result);
4913 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 -06004914 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004915 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004916
4917 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004918}
4919
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004920VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSampler(
4921 VkDevice device,
4922 const VkSamplerCreateInfo* pCreateInfo,
4923 const VkAllocationCallbacks* pAllocator,
4924 VkSampler* pSampler)
4925{
Dustin Graves1e92cd72016-02-09 14:00:18 -07004926 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4927 VkBool32 skipCall = VK_FALSE;
4928 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4929 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004930
Dustin Graves1e92cd72016-02-09 14:00:18 -07004931 skipCall |= param_check_vkCreateSampler(
4932 my_data->report_data,
4933 pCreateInfo,
4934 pAllocator,
4935 pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004936
Dustin Graves1e92cd72016-02-09 14:00:18 -07004937 if (skipCall == VK_FALSE) {
4938 PreCreateSampler(device, pCreateInfo);
4939
4940 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
4941
4942 PostCreateSampler(device, pSampler, result);
4943 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004944
4945 return result;
4946}
4947
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004948bool PreCreateDescriptorSetLayout(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004949 VkDevice device,
4950 const VkDescriptorSetLayoutCreateInfo* pCreateInfo)
4951{
4952 if(pCreateInfo != nullptr)
4953 {
4954 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO)
4955 {
4956 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4957 "vkCreateDescriptorSetLayout parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
4958 return false;
4959 }
4960 if(pCreateInfo->pBindings != nullptr)
4961 {
4962 if(pCreateInfo->pBindings->descriptorType < VK_DESCRIPTOR_TYPE_BEGIN_RANGE ||
4963 pCreateInfo->pBindings->descriptorType > VK_DESCRIPTOR_TYPE_END_RANGE)
4964 {
4965 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4966 "vkCreateDescriptorSetLayout parameter, VkDescriptorType pCreateInfo->pBindings->descriptorType, is an unrecognized enumerator");
4967 return false;
4968 }
4969 if(pCreateInfo->pBindings->pImmutableSamplers != nullptr)
4970 {
4971 }
4972 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004973 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004974
4975 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004976}
4977
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004978bool PostCreateDescriptorSetLayout(
4979 VkDevice device,
4980 VkDescriptorSetLayout* pSetLayout,
4981 VkResult result)
4982{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004983
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004984 if(pSetLayout != nullptr)
4985 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004986 }
4987
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004988 if(result < VK_SUCCESS)
4989 {
4990 std::string reason = "vkCreateDescriptorSetLayout parameter, VkResult result, is " + EnumeratorString(result);
4991 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 -06004992 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004993 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004994
4995 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004996}
4997
Chia-I Wu9ab61502015-11-06 06:42:02 +08004998VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorSetLayout(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004999 VkDevice device,
5000 const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
5001 const VkAllocationCallbacks* pAllocator,
5002 VkDescriptorSetLayout* pSetLayout)
5003{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005004 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5005 VkBool32 skipCall = VK_FALSE;
5006 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5007 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005008
Dustin Graves1e92cd72016-02-09 14:00:18 -07005009 skipCall |= param_check_vkCreateDescriptorSetLayout(
5010 my_data->report_data,
5011 pCreateInfo,
5012 pAllocator,
5013 pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005014
Dustin Graves1e92cd72016-02-09 14:00:18 -07005015 if (skipCall == VK_FALSE) {
5016 PreCreateDescriptorSetLayout(device, pCreateInfo);
5017
5018 result = get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
5019
5020 PostCreateDescriptorSetLayout(device, pSetLayout, result);
5021 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06005022
5023 return result;
5024}
5025
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005026bool PreCreateDescriptorPool(
5027 VkDevice device,
5028 const VkDescriptorPoolCreateInfo* pCreateInfo)
5029{
5030 if(pCreateInfo != nullptr)
5031 {
5032 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO)
5033 {
5034 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5035 "vkCreateDescriptorPool parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
5036 return false;
5037 }
5038 if(pCreateInfo->pPoolSizes != nullptr)
5039 {
5040 if(pCreateInfo->pPoolSizes->type < VK_DESCRIPTOR_TYPE_BEGIN_RANGE ||
5041 pCreateInfo->pPoolSizes->type > VK_DESCRIPTOR_TYPE_END_RANGE)
5042 {
5043 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5044 "vkCreateDescriptorPool parameter, VkDescriptorType pCreateInfo->pTypeCount->type, is an unrecognized enumerator");
5045 return false;
5046 }
5047 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005048 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005049
5050 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005051}
5052
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005053bool PostCreateDescriptorPool(
5054 VkDevice device,
5055 uint32_t maxSets,
5056 VkDescriptorPool* pDescriptorPool,
5057 VkResult result)
5058{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005059
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005060 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
Jeremy Hayes99a96322015-06-26 12:48:09 -06005061
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005062 if(pDescriptorPool != nullptr)
5063 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005064 }
5065
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005066 if(result < VK_SUCCESS)
5067 {
5068 std::string reason = "vkCreateDescriptorPool parameter, VkResult result, is " + EnumeratorString(result);
5069 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 -06005070 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005071 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005072
5073 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005074}
5075
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005076VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorPool(
5077 VkDevice device,
5078 const VkDescriptorPoolCreateInfo* pCreateInfo,
5079 const VkAllocationCallbacks* pAllocator,
5080 VkDescriptorPool* pDescriptorPool)
5081{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005082 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5083 VkBool32 skipCall = VK_FALSE;
5084 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5085 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005086
Dustin Graves1e92cd72016-02-09 14:00:18 -07005087 skipCall |= param_check_vkCreateDescriptorPool(
5088 my_data->report_data,
5089 pCreateInfo,
5090 pAllocator,
5091 pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005092
Dustin Graves1e92cd72016-02-09 14:00:18 -07005093 if (skipCall == VK_FALSE) {
5094 PreCreateDescriptorPool(device, pCreateInfo);
5095
5096 result = get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
5097
5098 PostCreateDescriptorPool(device, pCreateInfo->maxSets, pDescriptorPool, result);
5099 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06005100
5101 return result;
5102}
5103
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005104bool PostResetDescriptorPool(
5105 VkDevice device,
5106 VkDescriptorPool descriptorPool,
5107 VkResult result)
5108{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005109
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005110
5111 if(result < VK_SUCCESS)
5112 {
5113 std::string reason = "vkResetDescriptorPool parameter, VkResult result, is " + EnumeratorString(result);
5114 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 -06005115 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005116 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005117
5118 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005119}
5120
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005121VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetDescriptorPool(
5122 VkDevice device,
5123 VkDescriptorPool descriptorPool,
5124 VkDescriptorPoolResetFlags flags)
5125{
5126 VkResult result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005127
5128 PostResetDescriptorPool(device, descriptorPool, result);
5129
5130 return result;
5131}
5132
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005133bool PreAllocateDescriptorSets(
5134 VkDevice device,
5135 const VkDescriptorSetLayout* pSetLayouts)
5136{
5137 if(pSetLayouts != nullptr)
5138 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005139 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005140
5141 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005142}
5143
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005144bool PostAllocateDescriptorSets(
5145 VkDevice device,
5146 VkDescriptorPool descriptorPool,
5147 uint32_t count,
5148 VkDescriptorSet* pDescriptorSets,
5149 VkResult result)
5150{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005151
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005152
5153 if(pDescriptorSets != nullptr)
5154 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005155 }
5156
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005157 if(result < VK_SUCCESS)
5158 {
5159 std::string reason = "vkAllocateDescriptorSets parameter, VkResult result, is " + EnumeratorString(result);
5160 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 -06005161 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005162 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005163
5164 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005165}
5166
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005167VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateDescriptorSets(
5168 VkDevice device,
5169 const VkDescriptorSetAllocateInfo* pAllocateInfo,
5170 VkDescriptorSet* pDescriptorSets)
5171{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005172 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5173 VkBool32 skipCall = VK_FALSE;
5174 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5175 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005176
Dustin Graves1e92cd72016-02-09 14:00:18 -07005177 skipCall |= param_check_vkAllocateDescriptorSets(
5178 my_data->report_data,
5179 pAllocateInfo,
5180 pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005181
Dustin Graves1e92cd72016-02-09 14:00:18 -07005182 if (skipCall == VK_FALSE) {
5183 PreAllocateDescriptorSets(device, pAllocateInfo->pSetLayouts);
5184
5185 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
5186
5187 PostAllocateDescriptorSets(device, pAllocateInfo->descriptorPool, pAllocateInfo->descriptorSetCount, pDescriptorSets, result);
5188 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06005189
5190 return result;
5191}
5192
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005193bool PreFreeDescriptorSets(
5194 VkDevice device,
5195 const VkDescriptorSet* pDescriptorSets)
5196{
5197 if(pDescriptorSets != nullptr)
5198 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005199 }
5200
5201 return true;
5202}
5203
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005204bool PostFreeDescriptorSets(
5205 VkDevice device,
5206 VkDescriptorPool descriptorPool,
5207 uint32_t count,
5208 VkResult result)
5209{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005210
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005211
5212
5213 if(result < VK_SUCCESS)
5214 {
5215 std::string reason = "vkFreeDescriptorSets parameter, VkResult result, is " + EnumeratorString(result);
5216 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 -06005217 return false;
5218 }
5219
5220 return true;
5221}
5222
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005223VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFreeDescriptorSets(
5224 VkDevice device,
5225 VkDescriptorPool descriptorPool,
Dustin Graves1e92cd72016-02-09 14:00:18 -07005226 uint32_t descriptorSetCount,
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005227 const VkDescriptorSet* pDescriptorSets)
5228{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005229 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5230 VkBool32 skipCall = VK_FALSE;
5231 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5232 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005233
Dustin Graves1e92cd72016-02-09 14:00:18 -07005234 skipCall |= param_check_vkFreeDescriptorSets(
5235 my_data->report_data,
5236 descriptorPool,
5237 descriptorSetCount,
5238 pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005239
Dustin Graves1e92cd72016-02-09 14:00:18 -07005240 if (skipCall == VK_FALSE) {
5241 PreFreeDescriptorSets(device, pDescriptorSets);
5242
5243 result = get_dispatch_table(pc_device_table_map, device)->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
5244
5245 PostFreeDescriptorSets(device, descriptorPool, descriptorSetCount, result);
5246 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005247
5248 return result;
5249}
5250
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005251bool PreUpdateDescriptorSets(
5252 VkDevice device,
5253 const VkWriteDescriptorSet* pDescriptorWrites,
5254 const VkCopyDescriptorSet* pDescriptorCopies)
5255{
5256 if(pDescriptorWrites != nullptr)
5257 {
5258 if(pDescriptorWrites->sType != VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET)
5259 {
5260 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5261 "vkUpdateDescriptorSets parameter, VkStructureType pDescriptorWrites->sType, is an invalid enumerator");
5262 return false;
5263 }
5264 if(pDescriptorWrites->descriptorType < VK_DESCRIPTOR_TYPE_BEGIN_RANGE ||
5265 pDescriptorWrites->descriptorType > VK_DESCRIPTOR_TYPE_END_RANGE)
5266 {
5267 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5268 "vkUpdateDescriptorSets parameter, VkDescriptorType pDescriptorWrites->descriptorType, is an unrecognized enumerator");
5269 return false;
5270 }
5271 /* TODO: Validate other parts of pImageInfo, pBufferInfo, pTexelBufferView? */
5272 /* TODO: This test should probably only be done if descriptorType is correct type of descriptor */
5273 if(pDescriptorWrites->pImageInfo != nullptr)
5274 {
5275 if (((pDescriptorWrites->pImageInfo->imageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
5276 (pDescriptorWrites->pImageInfo->imageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5277 (pDescriptorWrites->pImageInfo->imageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5278 {
5279 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5280 "vkUpdateDescriptorSets parameter, VkImageLayout pDescriptorWrites->pDescriptors->imageLayout, is an unrecognized enumerator");
5281 return false;
5282 }
5283 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005284 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06005285
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005286 if(pDescriptorCopies != nullptr)
5287 {
5288 if(pDescriptorCopies->sType != VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET)
5289 {
5290 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5291 "vkUpdateDescriptorSets parameter, VkStructureType pDescriptorCopies->sType, is an invalid enumerator");
5292 return false;
5293 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06005294 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005295
5296 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005297}
5298
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005299VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkUpdateDescriptorSets(
5300 VkDevice device,
5301 uint32_t descriptorWriteCount,
5302 const VkWriteDescriptorSet* pDescriptorWrites,
5303 uint32_t descriptorCopyCount,
5304 const VkCopyDescriptorSet* pDescriptorCopies)
5305{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005306 VkBool32 skipCall = VK_FALSE;
5307 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5308 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005309
Dustin Graves1e92cd72016-02-09 14:00:18 -07005310 skipCall |= param_check_vkUpdateDescriptorSets(
5311 my_data->report_data,
5312 descriptorWriteCount,
5313 pDescriptorWrites,
5314 descriptorCopyCount,
5315 pDescriptorCopies);
5316
5317 if (skipCall == VK_FALSE) {
5318 PreUpdateDescriptorSets(device, pDescriptorWrites, pDescriptorCopies);
5319
5320 get_dispatch_table(pc_device_table_map, device)->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
5321 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06005322}
5323
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005324bool PreCreateFramebuffer(
5325 VkDevice device,
5326 const VkFramebufferCreateInfo* pCreateInfo)
5327{
5328 if(pCreateInfo != nullptr)
5329 {
5330 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO)
5331 {
5332 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5333 "vkCreateFramebuffer parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
5334 return false;
5335 }
5336 if(pCreateInfo->pAttachments != nullptr)
5337 {
5338 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005339 }
5340
5341 return true;
5342}
5343
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005344bool PostCreateFramebuffer(
5345 VkDevice device,
5346 VkFramebuffer* pFramebuffer,
5347 VkResult result)
5348{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005349
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005350 if(pFramebuffer != nullptr)
5351 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005352 }
5353
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005354 if(result < VK_SUCCESS)
5355 {
5356 std::string reason = "vkCreateFramebuffer parameter, VkResult result, is " + EnumeratorString(result);
5357 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 -06005358 return false;
5359 }
5360
5361 return true;
5362}
5363
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005364VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateFramebuffer(
5365 VkDevice device,
5366 const VkFramebufferCreateInfo* pCreateInfo,
5367 const VkAllocationCallbacks* pAllocator,
5368 VkFramebuffer* pFramebuffer)
5369{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005370 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5371 VkBool32 skipCall = VK_FALSE;
5372 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5373 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005374
Dustin Graves1e92cd72016-02-09 14:00:18 -07005375 skipCall |= param_check_vkCreateFramebuffer(
5376 my_data->report_data,
5377 pCreateInfo,
5378 pAllocator,
5379 pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005380
Dustin Graves1e92cd72016-02-09 14:00:18 -07005381 if (skipCall == VK_FALSE) {
5382 PreCreateFramebuffer(device, pCreateInfo);
5383
5384 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
5385
5386 PostCreateFramebuffer(device, pFramebuffer, result);
5387 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005388
5389 return result;
5390}
5391
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005392bool PreCreateRenderPass(
5393 VkDevice device,
5394 const VkRenderPassCreateInfo* pCreateInfo)
5395{
5396 if(pCreateInfo != nullptr)
5397 {
5398 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO)
5399 {
5400 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5401 "vkCreateRenderPass parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
5402 return false;
5403 }
5404 if(pCreateInfo->pAttachments != nullptr)
5405 {
5406 if(pCreateInfo->pAttachments->format < VK_FORMAT_BEGIN_RANGE ||
5407 pCreateInfo->pAttachments->format > VK_FORMAT_END_RANGE)
5408 {
5409 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5410 "vkCreateRenderPass parameter, VkFormat pCreateInfo->pAttachments->format, is an unrecognized enumerator");
5411 return false;
5412 }
5413 if(pCreateInfo->pAttachments->loadOp < VK_ATTACHMENT_LOAD_OP_BEGIN_RANGE ||
5414 pCreateInfo->pAttachments->loadOp > VK_ATTACHMENT_LOAD_OP_END_RANGE)
5415 {
5416 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5417 "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->pAttachments->loadOp, is an unrecognized enumerator");
5418 return false;
5419 }
5420 if(pCreateInfo->pAttachments->storeOp < VK_ATTACHMENT_STORE_OP_BEGIN_RANGE ||
5421 pCreateInfo->pAttachments->storeOp > VK_ATTACHMENT_STORE_OP_END_RANGE)
5422 {
5423 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5424 "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->pAttachments->storeOp, is an unrecognized enumerator");
5425 return false;
5426 }
5427 if(pCreateInfo->pAttachments->stencilLoadOp < VK_ATTACHMENT_LOAD_OP_BEGIN_RANGE ||
5428 pCreateInfo->pAttachments->stencilLoadOp > VK_ATTACHMENT_LOAD_OP_END_RANGE)
5429 {
5430 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5431 "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->pAttachments->stencilLoadOp, is an unrecognized enumerator");
5432 return false;
5433 }
5434 if(pCreateInfo->pAttachments->stencilStoreOp < VK_ATTACHMENT_STORE_OP_BEGIN_RANGE ||
5435 pCreateInfo->pAttachments->stencilStoreOp > VK_ATTACHMENT_STORE_OP_END_RANGE)
5436 {
5437 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5438 "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->pAttachments->stencilStoreOp, is an unrecognized enumerator");
5439 return false;
5440 }
5441 if (((pCreateInfo->pAttachments->initialLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
5442 (pCreateInfo->pAttachments->initialLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5443 (pCreateInfo->pAttachments->initialLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5444 {
5445 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5446 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pAttachments->initialLayout, is an unrecognized enumerator");
5447 return false;
5448 }
5449 if (((pCreateInfo->pAttachments->initialLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
5450 (pCreateInfo->pAttachments->initialLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5451 (pCreateInfo->pAttachments->initialLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5452 {
5453 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5454 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pAttachments->finalLayout, is an unrecognized enumerator");
5455 return false;
5456 }
5457 }
5458 if(pCreateInfo->pSubpasses != nullptr)
5459 {
5460 if(pCreateInfo->pSubpasses->pipelineBindPoint < VK_PIPELINE_BIND_POINT_BEGIN_RANGE ||
5461 pCreateInfo->pSubpasses->pipelineBindPoint > VK_PIPELINE_BIND_POINT_END_RANGE)
5462 {
5463 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5464 "vkCreateRenderPass parameter, VkPipelineBindPoint pCreateInfo->pSubpasses->pipelineBindPoint, is an unrecognized enumerator");
5465 return false;
5466 }
5467 if(pCreateInfo->pSubpasses->pInputAttachments != nullptr)
5468 {
5469 if (((pCreateInfo->pSubpasses->pInputAttachments->layout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
5470 (pCreateInfo->pSubpasses->pInputAttachments->layout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5471 (pCreateInfo->pSubpasses->pInputAttachments->layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5472 {
5473 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5474 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pSubpasses->pInputAttachments->layout, is an unrecognized enumerator");
5475 return false;
5476 }
5477 }
5478 if(pCreateInfo->pSubpasses->pColorAttachments != nullptr)
5479 {
5480 if (((pCreateInfo->pSubpasses->pColorAttachments->layout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
5481 (pCreateInfo->pSubpasses->pColorAttachments->layout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5482 (pCreateInfo->pSubpasses->pColorAttachments->layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5483 {
5484 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5485 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pSubpasses->pColorAttachments->layout, is an unrecognized enumerator");
5486 return false;
5487 }
5488 }
5489 if(pCreateInfo->pSubpasses->pResolveAttachments != nullptr)
5490 {
5491 if (((pCreateInfo->pSubpasses->pResolveAttachments->layout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
5492 (pCreateInfo->pSubpasses->pResolveAttachments->layout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5493 (pCreateInfo->pSubpasses->pResolveAttachments->layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5494 {
5495 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5496 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pSubpasses->pResolveAttachments->layout, is an unrecognized enumerator");
5497 return false;
5498 }
5499 }
5500 if(pCreateInfo->pSubpasses->pDepthStencilAttachment &&
5501 ((pCreateInfo->pSubpasses->pDepthStencilAttachment->layout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
5502 (pCreateInfo->pSubpasses->pDepthStencilAttachment->layout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5503 (pCreateInfo->pSubpasses->pDepthStencilAttachment->layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5504 {
5505 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5506 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pSubpasses->pDepthStencilAttachment->layout, is an unrecognized enumerator");
5507 return false;
5508 }
5509 }
5510 if(pCreateInfo->pDependencies != nullptr)
5511 {
5512 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005513 }
5514
5515 return true;
5516}
5517
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005518bool PostCreateRenderPass(
5519 VkDevice device,
5520 VkRenderPass* pRenderPass,
5521 VkResult result)
5522{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005523
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005524 if(pRenderPass != nullptr)
5525 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005526 }
5527
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005528 if(result < VK_SUCCESS)
5529 {
5530 std::string reason = "vkCreateRenderPass parameter, VkResult result, is " + EnumeratorString(result);
5531 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 -06005532 return false;
5533 }
5534
5535 return true;
5536}
5537
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005538VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(
5539 VkDevice device,
5540 const VkRenderPassCreateInfo* pCreateInfo,
5541 const VkAllocationCallbacks* pAllocator,
5542 VkRenderPass* pRenderPass)
5543{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005544 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5545 VkBool32 skipCall = VK_FALSE;
5546 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5547 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005548
Dustin Graves1e92cd72016-02-09 14:00:18 -07005549 skipCall |= param_check_vkCreateRenderPass(
5550 my_data->report_data,
5551 pCreateInfo,
5552 pAllocator,
5553 pRenderPass);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005554
Dustin Graves1e92cd72016-02-09 14:00:18 -07005555 if (skipCall == VK_FALSE) {
5556 PreCreateRenderPass(device, pCreateInfo);
5557
5558 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
5559
5560 PostCreateRenderPass(device, pRenderPass, result);
5561 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005562
5563 return result;
5564}
5565
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005566bool PostGetRenderAreaGranularity(
5567 VkDevice device,
5568 VkRenderPass renderPass,
5569 VkExtent2D* pGranularity)
5570{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005571
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005572
5573 if(pGranularity != nullptr)
5574 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005575 }
5576
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005577 return true;
5578}
5579
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005580VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetRenderAreaGranularity(
5581 VkDevice device,
5582 VkRenderPass renderPass,
5583 VkExtent2D* pGranularity)
5584{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005585 VkBool32 skipCall = VK_FALSE;
5586 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5587 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005588
Dustin Graves1e92cd72016-02-09 14:00:18 -07005589 skipCall |= param_check_vkGetRenderAreaGranularity(
5590 my_data->report_data,
5591 renderPass,
5592 pGranularity);
5593
5594 if (skipCall == VK_FALSE) {
5595 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
5596
5597 PostGetRenderAreaGranularity(device, renderPass, pGranularity);
5598 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005599}
5600
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005601bool PreCreateCommandPool(
5602 VkDevice device,
5603 const VkCommandPoolCreateInfo* pCreateInfo)
5604{
5605 if(pCreateInfo != nullptr)
5606 {
5607 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO)
5608 {
5609 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5610 "vkCreateCommandPool parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
5611 return false;
5612 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005613 }
5614
5615 return true;
5616}
5617
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005618bool PostCreateCommandPool(
5619 VkDevice device,
5620 VkCommandPool* pCommandPool,
5621 VkResult result)
5622{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005623
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005624 if(pCommandPool != nullptr)
5625 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005626 }
5627
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005628 if(result < VK_SUCCESS)
5629 {
5630 std::string reason = "vkCreateCommandPool parameter, VkResult result, is " + EnumeratorString(result);
5631 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 -06005632 return false;
5633 }
5634
5635 return true;
5636}
5637
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005638VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool(
5639 VkDevice device,
5640 const VkCommandPoolCreateInfo* pCreateInfo,
5641 const VkAllocationCallbacks* pAllocator,
5642 VkCommandPool* pCommandPool)
5643{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005644 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5645 VkBool32 skipCall = VK_FALSE;
5646 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5647 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005648
Dustin Graves1e92cd72016-02-09 14:00:18 -07005649 skipCall |= param_check_vkCreateCommandPool(
5650 my_data->report_data,
5651 pCreateInfo,
5652 pAllocator,
5653 pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005654
Dustin Graves1e92cd72016-02-09 14:00:18 -07005655 if (skipCall == VK_FALSE) {
5656 PreCreateCommandPool(device, pCreateInfo);
5657
5658 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
5659
5660 PostCreateCommandPool(device, pCommandPool, result);
5661 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005662
5663 return result;
5664}
5665
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005666bool PostResetCommandPool(
5667 VkDevice device,
5668 VkCommandPool commandPool,
5669 VkCommandPoolResetFlags flags,
5670 VkResult result)
5671{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005672
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005673
5674
5675 if(result < VK_SUCCESS)
5676 {
5677 std::string reason = "vkResetCommandPool parameter, VkResult result, is " + EnumeratorString(result);
5678 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 -06005679 return false;
5680 }
5681
5682 return true;
5683}
5684
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005685VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetCommandPool(
5686 VkDevice device,
5687 VkCommandPool commandPool,
5688 VkCommandPoolResetFlags flags)
5689{
5690 VkResult result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005691
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005692 PostResetCommandPool(device, commandPool, flags, result);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005693
5694 return result;
5695}
5696
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005697bool PreCreateCommandBuffer(
5698 VkDevice device,
5699 const VkCommandBufferAllocateInfo* pCreateInfo)
5700{
5701 if(pCreateInfo != nullptr)
5702 {
5703 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO)
5704 {
5705 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5706 "vkAllocateCommandBuffers parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
5707 return false;
5708 }
5709 if(pCreateInfo->level < VK_COMMAND_BUFFER_LEVEL_BEGIN_RANGE ||
5710 pCreateInfo->level > VK_COMMAND_BUFFER_LEVEL_END_RANGE)
5711 {
5712 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5713 "vkAllocateCommandBuffers parameter, VkCommandBufferLevel pCreateInfo->level, is an unrecognized enumerator");
5714 return false;
5715 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005716 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005717
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005718 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005719}
5720
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005721bool PostCreateCommandBuffer(
5722 VkDevice device,
5723 VkCommandBuffer* pCommandBuffer,
5724 VkResult result)
5725{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005726
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005727 if(pCommandBuffer != nullptr)
5728 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005729 }
5730
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005731 if(result < VK_SUCCESS)
5732 {
5733 std::string reason = "vkAllocateCommandBuffers parameter, VkResult result, is " + EnumeratorString(result);
5734 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 -06005735 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005736 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005737
5738 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005739}
5740
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005741VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateCommandBuffers(
5742 VkDevice device,
Dustin Graves1e92cd72016-02-09 14:00:18 -07005743 const VkCommandBufferAllocateInfo* pAllocateInfo,
5744 VkCommandBuffer* pCommandBuffers)
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005745{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005746 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5747 VkBool32 skipCall = VK_FALSE;
5748 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5749 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005750
Dustin Graves1e92cd72016-02-09 14:00:18 -07005751 skipCall |= param_check_vkAllocateCommandBuffers(
5752 my_data->report_data,
5753 pAllocateInfo,
5754 pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005755
Dustin Graves1e92cd72016-02-09 14:00:18 -07005756 if (skipCall == VK_FALSE) {
5757 PreCreateCommandBuffer(device, pAllocateInfo);
5758
5759 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
5760
5761 PostCreateCommandBuffer(device, pCommandBuffers, result);
5762 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06005763
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005764 return result;
5765}
5766
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005767bool PreBeginCommandBuffer(
5768 VkCommandBuffer commandBuffer,
5769 const VkCommandBufferBeginInfo* pBeginInfo)
5770{
5771 if(pBeginInfo != nullptr)
5772 {
5773 if(pBeginInfo->sType != VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO)
5774 {
5775 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5776 "vkBeginCommandBuffer parameter, VkStructureType pBeginInfo->sType, is an invalid enumerator");
5777 return false;
5778 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06005779 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005780
5781 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005782}
5783
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005784bool PostBeginCommandBuffer(
5785 VkCommandBuffer commandBuffer,
5786 VkResult result)
5787{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005788
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005789 if(result < VK_SUCCESS)
5790 {
5791 std::string reason = "vkBeginCommandBuffer parameter, VkResult result, is " + EnumeratorString(result);
5792 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 -06005793 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005794 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005795
5796 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005797}
5798
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005799VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBeginCommandBuffer(
5800 VkCommandBuffer commandBuffer,
5801 const VkCommandBufferBeginInfo* pBeginInfo)
5802{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005803 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5804 VkBool32 skipCall = VK_FALSE;
5805 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5806 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005807
Dustin Graves1e92cd72016-02-09 14:00:18 -07005808 skipCall |= param_check_vkBeginCommandBuffer(
5809 my_data->report_data,
5810 pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005811
Dustin Graves1e92cd72016-02-09 14:00:18 -07005812 if (skipCall == VK_FALSE) {
5813 PreBeginCommandBuffer(commandBuffer, pBeginInfo);
5814
5815 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
5816
5817 PostBeginCommandBuffer(commandBuffer, result);
5818 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06005819
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005820 return result;
5821}
5822
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005823bool PostEndCommandBuffer(
5824 VkCommandBuffer commandBuffer,
5825 VkResult result)
5826{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005827
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005828 if(result < VK_SUCCESS)
5829 {
5830 std::string reason = "vkEndCommandBuffer parameter, VkResult result, is " + EnumeratorString(result);
5831 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 -06005832 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005833 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005834
5835 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005836}
5837
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005838VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer(
5839 VkCommandBuffer commandBuffer)
5840{
5841 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005842
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005843 PostEndCommandBuffer(commandBuffer, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005844
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005845 return result;
5846}
5847
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005848bool PostResetCommandBuffer(
5849 VkCommandBuffer commandBuffer,
5850 VkCommandBufferResetFlags flags,
5851 VkResult result)
5852{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005853
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005854
5855 if(result < VK_SUCCESS)
5856 {
5857 std::string reason = "vkResetCommandBuffer parameter, VkResult result, is " + EnumeratorString(result);
5858 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 -06005859 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005860 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005861
5862 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005863}
5864
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005865VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetCommandBuffer(
5866 VkCommandBuffer commandBuffer,
5867 VkCommandBufferResetFlags flags)
5868{
5869 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005870
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005871 PostResetCommandBuffer(commandBuffer, flags, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005872
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005873 return result;
5874}
5875
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005876bool PostCmdBindPipeline(
5877 VkCommandBuffer commandBuffer,
5878 VkPipelineBindPoint pipelineBindPoint,
5879 VkPipeline pipeline)
5880{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005881
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005882 if(pipelineBindPoint < VK_PIPELINE_BIND_POINT_BEGIN_RANGE ||
5883 pipelineBindPoint > VK_PIPELINE_BIND_POINT_END_RANGE)
5884 {
5885 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5886 "vkCmdBindPipeline parameter, VkPipelineBindPoint pipelineBindPoint, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005887 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005888 }
5889
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005890
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005891 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005892}
5893
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005894VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindPipeline(
5895 VkCommandBuffer commandBuffer,
5896 VkPipelineBindPoint pipelineBindPoint,
5897 VkPipeline pipeline)
5898{
5899 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005900
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005901 PostCmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005902}
5903
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005904VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport* pViewports)
5905{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005906 VkBool32 skipCall = VK_FALSE;
5907 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5908 assert(my_data != NULL);
5909
5910 skipCall |= param_check_vkCmdSetViewport(
5911 my_data->report_data,
5912 firstViewport,
5913 viewportCount,
5914 pViewports);
5915
5916 if (skipCall == VK_FALSE) {
5917 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
5918 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06005919}
5920
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005921VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D* pScissors)
5922{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005923 VkBool32 skipCall = VK_FALSE;
5924 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5925 assert(my_data != NULL);
5926
5927 skipCall |= param_check_vkCmdSetScissor(
5928 my_data->report_data,
5929 firstScissor,
5930 scissorCount,
5931 pScissors);
5932
5933 if (skipCall == VK_FALSE) {
5934 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
5935 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06005936}
5937
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005938VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth)
5939{
5940 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005941}
5942
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005943VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor)
5944{
5945 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005946}
5947
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005948VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4])
5949{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005950 VkBool32 skipCall = VK_FALSE;
5951 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5952 assert(my_data != NULL);
5953
5954 skipCall |= param_check_vkCmdSetBlendConstants(
5955 my_data->report_data,
5956 blendConstants);
5957
5958 if (skipCall == VK_FALSE) {
5959 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
5960 }
Cody Northrop12365112015-08-17 11:10:49 -06005961}
5962
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005963VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds)
5964{
5965 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06005966}
5967
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005968VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask)
5969{
5970 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005971}
5972
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005973VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask)
5974{
5975 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005976}
5977
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005978VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference)
5979{
5980 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005981}
5982
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005983bool PreCmdBindDescriptorSets(
5984 VkCommandBuffer commandBuffer,
5985 const VkDescriptorSet* pDescriptorSets,
5986 const uint32_t* pDynamicOffsets)
5987{
5988 if(pDescriptorSets != nullptr)
5989 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005990 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005991
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005992 if(pDynamicOffsets != nullptr)
5993 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005994 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005995
5996 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005997}
5998
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005999bool PostCmdBindDescriptorSets(
6000 VkCommandBuffer commandBuffer,
6001 VkPipelineBindPoint pipelineBindPoint,
6002 VkPipelineLayout layout,
6003 uint32_t firstSet,
6004 uint32_t setCount,
6005 uint32_t dynamicOffsetCount)
6006{
Jeremy Hayes99a96322015-06-26 12:48:09 -06006007
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006008 if(pipelineBindPoint < VK_PIPELINE_BIND_POINT_BEGIN_RANGE ||
6009 pipelineBindPoint > VK_PIPELINE_BIND_POINT_END_RANGE)
6010 {
6011 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6012 "vkCmdBindDescriptorSets parameter, VkPipelineBindPoint pipelineBindPoint, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006013 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006014 }
6015
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006016
6017
6018
6019
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006020 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006021}
6022
Chia-I Wu9ab61502015-11-06 06:42:02 +08006023VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorSets(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006024 VkCommandBuffer commandBuffer,
6025 VkPipelineBindPoint pipelineBindPoint,
6026 VkPipelineLayout layout,
6027 uint32_t firstSet,
Dustin Graves1e92cd72016-02-09 14:00:18 -07006028 uint32_t descriptorSetCount,
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006029 const VkDescriptorSet* pDescriptorSets,
6030 uint32_t dynamicOffsetCount,
6031 const uint32_t* pDynamicOffsets)
6032{
Dustin Graves1e92cd72016-02-09 14:00:18 -07006033 VkBool32 skipCall = VK_FALSE;
6034 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
6035 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006036
Dustin Graves1e92cd72016-02-09 14:00:18 -07006037 skipCall |= param_check_vkCmdBindDescriptorSets(
6038 my_data->report_data,
6039 pipelineBindPoint,
6040 layout,
6041 firstSet,
6042 descriptorSetCount,
6043 pDescriptorSets,
6044 dynamicOffsetCount,
6045 pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006046
Dustin Graves1e92cd72016-02-09 14:00:18 -07006047 if (skipCall == VK_FALSE) {
6048 PreCmdBindDescriptorSets(commandBuffer, pDescriptorSets, pDynamicOffsets);
6049
6050 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
6051
6052 PostCmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, dynamicOffsetCount);
6053 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06006054}
6055
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006056bool PostCmdBindIndexBuffer(
6057 VkCommandBuffer commandBuffer,
6058 VkBuffer buffer,
6059 VkDeviceSize offset,
6060 VkIndexType indexType)
6061{
Jeremy Hayes99a96322015-06-26 12:48:09 -06006062
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006063
6064
6065 if(indexType < VK_INDEX_TYPE_BEGIN_RANGE ||
6066 indexType > VK_INDEX_TYPE_END_RANGE)
6067 {
6068 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6069 "vkCmdBindIndexBuffer parameter, VkIndexType indexType, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006070 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006071 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006072
6073 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006074}
6075
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006076VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindIndexBuffer(
6077 VkCommandBuffer commandBuffer,
6078 VkBuffer buffer,
6079 VkDeviceSize offset,
6080 VkIndexType indexType)
6081{
6082 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006083
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006084 PostCmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006085}
6086
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006087bool PreCmdBindVertexBuffers(
6088 VkCommandBuffer commandBuffer,
6089 const VkBuffer* pBuffers,
6090 const VkDeviceSize* pOffsets)
6091{
6092 if(pBuffers != nullptr)
6093 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06006094 }
6095
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006096 if(pOffsets != nullptr)
6097 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06006098 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006099
6100 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006101}
6102
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006103bool PostCmdBindVertexBuffers(
6104 VkCommandBuffer commandBuffer,
6105 uint32_t firstBinding,
6106 uint32_t bindingCount)
6107{
6108
6109
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006110
6111 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006112}
6113
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006114VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers(
6115 VkCommandBuffer commandBuffer,
6116 uint32_t firstBinding,
6117 uint32_t bindingCount,
6118 const VkBuffer* pBuffers,
6119 const VkDeviceSize* pOffsets)
6120{
Dustin Graves1e92cd72016-02-09 14:00:18 -07006121 VkBool32 skipCall = VK_FALSE;
6122 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
6123 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006124
Dustin Graves1e92cd72016-02-09 14:00:18 -07006125 skipCall |= param_check_vkCmdBindVertexBuffers(
6126 my_data->report_data,
6127 firstBinding,
6128 bindingCount,
6129 pBuffers,
6130 pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006131
Dustin Graves1e92cd72016-02-09 14:00:18 -07006132 if (skipCall == VK_FALSE) {
6133 PreCmdBindVertexBuffers(commandBuffer, pBuffers, pOffsets);
6134
6135 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
6136
6137 PostCmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount);
6138 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006139}
6140
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006141bool PreCmdDraw(
6142 VkCommandBuffer commandBuffer,
6143 uint32_t vertexCount,
6144 uint32_t instanceCount,
6145 uint32_t firstVertex,
6146 uint32_t firstInstance)
6147{
Michael Lentine55a913f2015-11-24 09:48:23 -06006148 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006149 // 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 -07006150 // this an error or leave as is.
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006151 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006152 "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06006153 return false;
6154 }
6155
6156 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006157 // 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 -07006158 // this an error or leave as is.
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006159 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006160 "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06006161 return false;
6162 }
6163
6164 return true;
6165}
6166
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006167bool PostCmdDraw(
6168 VkCommandBuffer commandBuffer,
6169 uint32_t firstVertex,
6170 uint32_t vertexCount,
6171 uint32_t firstInstance,
6172 uint32_t instanceCount)
6173{
6174
6175
6176
6177
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006178
6179 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006180}
6181
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006182VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDraw(
6183 VkCommandBuffer commandBuffer,
6184 uint32_t vertexCount,
6185 uint32_t instanceCount,
6186 uint32_t firstVertex,
6187 uint32_t firstInstance)
6188{
6189 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06006190
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006191 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006192
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006193 PostCmdDraw(commandBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006194}
6195
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006196bool PostCmdDrawIndexed(
6197 VkCommandBuffer commandBuffer,
6198 uint32_t firstIndex,
6199 uint32_t indexCount,
6200 int32_t vertexOffset,
6201 uint32_t firstInstance,
6202 uint32_t instanceCount)
6203{
6204
6205
6206
6207
6208
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006209
6210 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006211}
6212
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006213VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexed(
6214 VkCommandBuffer commandBuffer,
6215 uint32_t indexCount,
6216 uint32_t instanceCount,
6217 uint32_t firstIndex,
6218 int32_t vertexOffset,
6219 uint32_t firstInstance)
6220{
6221 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006222
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006223 PostCmdDrawIndexed(commandBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006224}
6225
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006226bool PostCmdDrawIndirect(
6227 VkCommandBuffer commandBuffer,
6228 VkBuffer buffer,
6229 VkDeviceSize offset,
6230 uint32_t count,
6231 uint32_t stride)
6232{
6233
6234
6235
6236
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006237
6238 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006239}
6240
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006241VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirect(
6242 VkCommandBuffer commandBuffer,
6243 VkBuffer buffer,
6244 VkDeviceSize offset,
6245 uint32_t count,
6246 uint32_t stride)
6247{
6248 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006249
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006250 PostCmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006251}
6252
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006253bool PostCmdDrawIndexedIndirect(
6254 VkCommandBuffer commandBuffer,
6255 VkBuffer buffer,
6256 VkDeviceSize offset,
6257 uint32_t count,
6258 uint32_t stride)
6259{
6260
6261
6262
6263
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006264
6265 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006266}
6267
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006268VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirect(
6269 VkCommandBuffer commandBuffer,
6270 VkBuffer buffer,
6271 VkDeviceSize offset,
6272 uint32_t count,
6273 uint32_t stride)
6274{
6275 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006276
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006277 PostCmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006278}
6279
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006280bool PostCmdDispatch(
6281 VkCommandBuffer commandBuffer,
6282 uint32_t x,
6283 uint32_t y,
6284 uint32_t z)
6285{
6286
6287
6288
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006289
6290 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006291}
6292
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006293VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDispatch(
6294 VkCommandBuffer commandBuffer,
6295 uint32_t x,
6296 uint32_t y,
6297 uint32_t z)
6298{
6299 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006300
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006301 PostCmdDispatch(commandBuffer, x, y, z);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006302}
6303
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006304bool PostCmdDispatchIndirect(
6305 VkCommandBuffer commandBuffer,
6306 VkBuffer buffer,
6307 VkDeviceSize offset)
6308{
6309
6310
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006311
6312 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006313}
6314
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006315VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDispatchIndirect(
6316 VkCommandBuffer commandBuffer,
6317 VkBuffer buffer,
6318 VkDeviceSize offset)
6319{
6320 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006321
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006322 PostCmdDispatchIndirect(commandBuffer, buffer, offset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006323}
6324
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006325bool PreCmdCopyBuffer(
6326 VkCommandBuffer commandBuffer,
6327 const VkBufferCopy* pRegions)
6328{
6329 if(pRegions != nullptr)
6330 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06006331 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006332
6333 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006334}
6335
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006336bool PostCmdCopyBuffer(
6337 VkCommandBuffer commandBuffer,
6338 VkBuffer srcBuffer,
6339 VkBuffer dstBuffer,
6340 uint32_t regionCount)
6341{
6342
6343
6344
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006345
6346 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006347}
6348
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006349VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer(
6350 VkCommandBuffer commandBuffer,
6351 VkBuffer srcBuffer,
6352 VkBuffer dstBuffer,
6353 uint32_t regionCount,
6354 const VkBufferCopy* pRegions)
6355{
Dustin Graves1e92cd72016-02-09 14:00:18 -07006356 VkBool32 skipCall = VK_FALSE;
6357 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
6358 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006359
Dustin Graves1e92cd72016-02-09 14:00:18 -07006360 skipCall |= param_check_vkCmdCopyBuffer(
6361 my_data->report_data,
6362 srcBuffer,
6363 dstBuffer,
6364 regionCount,
6365 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006366
Dustin Graves1e92cd72016-02-09 14:00:18 -07006367 if (skipCall == VK_FALSE) {
6368 PreCmdCopyBuffer(commandBuffer, pRegions);
6369
6370 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
6371
6372 PostCmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount);
6373 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06006374}
6375
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006376bool PreCmdCopyImage(
6377 VkCommandBuffer commandBuffer,
6378 const VkImageCopy* pRegions)
6379{
6380 if(pRegions != nullptr)
6381 {
6382 if ((pRegions->srcSubresource.aspectMask &
6383 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
6384 {
6385 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6386 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
6387 return false;
6388 }
6389 if ((pRegions->dstSubresource.aspectMask &
6390 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
6391 {
6392 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6393 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
6394 return false;
6395 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006396 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006397
6398 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006399}
6400
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006401bool PostCmdCopyImage(
6402 VkCommandBuffer commandBuffer,
6403 VkImage srcImage,
6404 VkImageLayout srcImageLayout,
6405 VkImage dstImage,
6406 VkImageLayout dstImageLayout,
6407 uint32_t regionCount)
6408{
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006409 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006410 (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6411 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6412 {
6413 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6414 "vkCmdCopyImage parameter, VkImageLayout srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006415 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006416 }
6417
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006418
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006419 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006420 (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6421 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6422 {
6423 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6424 "vkCmdCopyImage parameter, VkImageLayout dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006425 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006426 }
6427
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006428
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006429 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006430}
6431
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006432VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImage(
6433 VkCommandBuffer commandBuffer,
6434 VkImage srcImage,
6435 VkImageLayout srcImageLayout,
6436 VkImage dstImage,
6437 VkImageLayout dstImageLayout,
6438 uint32_t regionCount,
6439 const VkImageCopy* pRegions)
6440{
Dustin Graves1e92cd72016-02-09 14:00:18 -07006441 VkBool32 skipCall = VK_FALSE;
6442 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
6443 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006444
Dustin Graves1e92cd72016-02-09 14:00:18 -07006445 skipCall |= param_check_vkCmdCopyImage(
6446 my_data->report_data,
6447 srcImage,
6448 srcImageLayout,
6449 dstImage,
6450 dstImageLayout,
6451 regionCount,
6452 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006453
Dustin Graves1e92cd72016-02-09 14:00:18 -07006454 if (skipCall == VK_FALSE) {
6455 PreCmdCopyImage(commandBuffer, pRegions);
6456
6457 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
6458
6459 PostCmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount);
6460 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06006461}
6462
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006463bool PreCmdBlitImage(
6464 VkCommandBuffer commandBuffer,
6465 const VkImageBlit* pRegions)
6466{
6467 if(pRegions != nullptr)
6468 {
6469 if ((pRegions->srcSubresource.aspectMask &
6470 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
6471 {
6472 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6473 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
6474 return false;
6475 }
6476 if ((pRegions->dstSubresource.aspectMask &
6477 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
6478 {
6479 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6480 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
6481 return false;
6482 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006483 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006484
6485 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006486}
6487
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006488bool PostCmdBlitImage(
6489 VkCommandBuffer commandBuffer,
6490 VkImage srcImage,
6491 VkImageLayout srcImageLayout,
6492 VkImage dstImage,
6493 VkImageLayout dstImageLayout,
6494 uint32_t regionCount,
6495 VkFilter filter)
6496{
6497
Jeremy Hayes99a96322015-06-26 12:48:09 -06006498
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006499 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006500 (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6501 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6502 {
6503 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6504 "vkCmdBlitImage parameter, VkImageLayout srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006505 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006506 }
6507
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006508
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006509 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006510 (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6511 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6512 {
6513 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6514 "vkCmdBlitImage parameter, VkImageLayout dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006515 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006516 }
6517
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006518
6519 if(filter < VK_FILTER_BEGIN_RANGE ||
6520 filter > VK_FILTER_END_RANGE)
6521 {
6522 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6523 "vkCmdBlitImage parameter, VkFilter filter, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006524 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006525 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006526
6527 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006528}
6529
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006530VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBlitImage(
6531 VkCommandBuffer commandBuffer,
6532 VkImage srcImage,
6533 VkImageLayout srcImageLayout,
6534 VkImage dstImage,
6535 VkImageLayout dstImageLayout,
6536 uint32_t regionCount,
6537 const VkImageBlit* pRegions,
6538 VkFilter filter)
6539{
Dustin Graves1e92cd72016-02-09 14:00:18 -07006540 VkBool32 skipCall = VK_FALSE;
6541 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
6542 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006543
Dustin Graves1e92cd72016-02-09 14:00:18 -07006544 skipCall |= param_check_vkCmdBlitImage(
6545 my_data->report_data,
6546 srcImage,
6547 srcImageLayout,
6548 dstImage,
6549 dstImageLayout,
6550 regionCount,
6551 pRegions,
6552 filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006553
Dustin Graves1e92cd72016-02-09 14:00:18 -07006554 if (skipCall == VK_FALSE) {
6555 PreCmdBlitImage(commandBuffer, pRegions);
6556
6557 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
6558
6559 PostCmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, filter);
6560 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06006561}
6562
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006563bool PreCmdCopyBufferToImage(
6564 VkCommandBuffer commandBuffer,
6565 const VkBufferImageCopy* pRegions)
6566{
6567 if(pRegions != nullptr)
6568 {
6569 if ((pRegions->imageSubresource.aspectMask &
6570 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
6571 {
6572 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6573 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized enumerator");
6574 return false;
6575 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006576 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006577
6578 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006579}
6580
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006581bool PostCmdCopyBufferToImage(
6582 VkCommandBuffer commandBuffer,
6583 VkBuffer srcBuffer,
6584 VkImage dstImage,
6585 VkImageLayout dstImageLayout,
6586 uint32_t regionCount)
6587{
6588
6589
Jeremy Hayes99a96322015-06-26 12:48:09 -06006590
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006591 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006592 (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6593 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6594 {
6595 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6596 "vkCmdCopyBufferToImage parameter, VkImageLayout dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006597 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006598 }
6599
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006600
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006601 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006602}
6603
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006604VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage(
6605 VkCommandBuffer commandBuffer,
6606 VkBuffer srcBuffer,
6607 VkImage dstImage,
6608 VkImageLayout dstImageLayout,
6609 uint32_t regionCount,
6610 const VkBufferImageCopy* pRegions)
6611{
Dustin Graves1e92cd72016-02-09 14:00:18 -07006612 VkBool32 skipCall = VK_FALSE;
6613 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
6614 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006615
Dustin Graves1e92cd72016-02-09 14:00:18 -07006616 skipCall |= param_check_vkCmdCopyBufferToImage(
6617 my_data->report_data,
6618 srcBuffer,
6619 dstImage,
6620 dstImageLayout,
6621 regionCount,
6622 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006623
Dustin Graves1e92cd72016-02-09 14:00:18 -07006624 if (skipCall == VK_FALSE) {
6625 PreCmdCopyBufferToImage(commandBuffer, pRegions);
6626
6627 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
6628
6629 PostCmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount);
6630 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06006631}
6632
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006633bool PreCmdCopyImageToBuffer(
6634 VkCommandBuffer commandBuffer,
6635 const VkBufferImageCopy* pRegions)
6636{
6637 if(pRegions != nullptr)
6638 {
6639 if ((pRegions->imageSubresource.aspectMask &
6640 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
6641 {
6642 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6643 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized enumerator");
6644 return false;
6645 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006646 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006647
6648 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006649}
6650
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006651bool PostCmdCopyImageToBuffer(
6652 VkCommandBuffer commandBuffer,
6653 VkImage srcImage,
6654 VkImageLayout srcImageLayout,
6655 VkBuffer dstBuffer,
6656 uint32_t regionCount)
6657{
6658
Jeremy Hayes99a96322015-06-26 12:48:09 -06006659
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006660 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006661 (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6662 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6663 {
6664 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6665 "vkCmdCopyImageToBuffer parameter, VkImageLayout srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006666 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006667 }
6668
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006669
6670
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006671 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006672}
6673
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006674VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer(
6675 VkCommandBuffer commandBuffer,
6676 VkImage srcImage,
6677 VkImageLayout srcImageLayout,
6678 VkBuffer dstBuffer,
6679 uint32_t regionCount,
6680 const VkBufferImageCopy* pRegions)
6681{
Dustin Graves1e92cd72016-02-09 14:00:18 -07006682 VkBool32 skipCall = VK_FALSE;
6683 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
6684 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006685
Dustin Graves1e92cd72016-02-09 14:00:18 -07006686 skipCall |= param_check_vkCmdCopyImageToBuffer(
6687 my_data->report_data,
6688 srcImage,
6689 srcImageLayout,
6690 dstBuffer,
6691 regionCount,
6692 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006693
Dustin Graves1e92cd72016-02-09 14:00:18 -07006694 if (skipCall == VK_FALSE) {
6695 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
6696
6697 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
6698
6699 PostCmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount);
6700 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06006701}
6702
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006703bool PreCmdUpdateBuffer(
6704 VkCommandBuffer commandBuffer,
6705 const uint32_t* pData)
6706{
6707 if(pData != nullptr)
6708 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06006709 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006710
6711 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006712}
6713
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006714bool PostCmdUpdateBuffer(
6715 VkCommandBuffer commandBuffer,
6716 VkBuffer dstBuffer,
6717 VkDeviceSize dstOffset,
6718 VkDeviceSize dataSize)
6719{
6720
6721
6722
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006723
6724 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006725}
6726
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006727VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer(
6728 VkCommandBuffer commandBuffer,
6729 VkBuffer dstBuffer,
6730 VkDeviceSize dstOffset,
6731 VkDeviceSize dataSize,
6732 const uint32_t* pData)
6733{
Dustin Graves1e92cd72016-02-09 14:00:18 -07006734 VkBool32 skipCall = VK_FALSE;
6735 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
6736 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006737
Dustin Graves1e92cd72016-02-09 14:00:18 -07006738 skipCall |= param_check_vkCmdUpdateBuffer(
6739 my_data->report_data,
6740 dstBuffer,
6741 dstOffset,
6742 dataSize,
6743 pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006744
Dustin Graves1e92cd72016-02-09 14:00:18 -07006745 if (skipCall == VK_FALSE) {
6746 PreCmdUpdateBuffer(commandBuffer, pData);
6747
6748 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
6749
6750 PostCmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize);
6751 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06006752}
6753
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006754bool PostCmdFillBuffer(
6755 VkCommandBuffer commandBuffer,
6756 VkBuffer dstBuffer,
6757 VkDeviceSize dstOffset,
6758 VkDeviceSize size,
6759 uint32_t data)
6760{
6761
6762
6763
6764
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006765
6766 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006767}
6768
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006769VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdFillBuffer(
6770 VkCommandBuffer commandBuffer,
6771 VkBuffer dstBuffer,
6772 VkDeviceSize dstOffset,
6773 VkDeviceSize size,
6774 uint32_t data)
6775{
6776 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006777
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006778 PostCmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006779}
6780
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006781bool PreCmdClearColorImage(
6782 VkCommandBuffer commandBuffer,
6783 const VkClearColorValue* pColor,
6784 const VkImageSubresourceRange* pRanges)
6785{
6786 if(pColor != nullptr)
6787 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06006788 }
6789
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006790 if(pRanges != nullptr)
6791 {
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -06006792 /* TODO: How should we validate pRanges->aspectMask */
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006793 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006794
6795 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006796}
6797
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006798bool PostCmdClearColorImage(
6799 VkCommandBuffer commandBuffer,
6800 VkImage image,
6801 VkImageLayout imageLayout,
6802 uint32_t rangeCount)
6803{
6804
Jeremy Hayes99a96322015-06-26 12:48:09 -06006805
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006806 if (((imageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006807 (imageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6808 (imageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6809 {
6810 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6811 "vkCmdClearColorImage parameter, VkImageLayout imageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006812 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006813 }
6814
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006815
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006816 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006817}
6818
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006819VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(
6820 VkCommandBuffer commandBuffer,
6821 VkImage image,
6822 VkImageLayout imageLayout,
6823 const VkClearColorValue* pColor,
6824 uint32_t rangeCount,
6825 const VkImageSubresourceRange* pRanges)
6826{
Dustin Graves1e92cd72016-02-09 14:00:18 -07006827 VkBool32 skipCall = VK_FALSE;
6828 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
6829 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006830
Dustin Graves1e92cd72016-02-09 14:00:18 -07006831 skipCall |= param_check_vkCmdClearColorImage(
6832 my_data->report_data,
6833 image,
6834 imageLayout,
6835 pColor,
6836 rangeCount,
6837 pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006838
Dustin Graves1e92cd72016-02-09 14:00:18 -07006839 if (skipCall == VK_FALSE) {
6840 PreCmdClearColorImage(commandBuffer, pColor, pRanges);
6841
6842 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
6843
6844 PostCmdClearColorImage(commandBuffer, image, imageLayout, rangeCount);
6845 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06006846}
6847
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006848bool PreCmdClearDepthStencilImage(
6849 VkCommandBuffer commandBuffer,
6850 const VkImageSubresourceRange* pRanges)
6851{
6852 if(pRanges != nullptr)
6853 {
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -06006854 /*
6855 * TODO: How do we validation pRanges->aspectMask?
6856 * Allows values are: VK_IMAGE_ASPECT_DEPTH_BIT and
6857 * VK_IMAGE_ASPECT_STENCIL_BIT.
6858 */
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006859 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006860
6861 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006862}
6863
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006864bool PostCmdClearDepthStencilImage(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006865 VkCommandBuffer commandBuffer,
6866 VkImage image,
6867 VkImageLayout imageLayout,
6868 const VkClearDepthStencilValue* pDepthStencil,
6869 uint32_t rangeCount)
6870{
6871
Jeremy Hayes99a96322015-06-26 12:48:09 -06006872
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006873 if (((imageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006874 (imageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6875 (imageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6876 {
6877 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6878 "vkCmdClearDepthStencilImage parameter, VkImageLayout imageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006879 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006880 }
6881
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006882
6883
6884
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006885 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006886}
6887
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006888VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearDepthStencilImage(
6889 VkCommandBuffer commandBuffer,
6890 VkImage image,
6891 VkImageLayout imageLayout,
6892 const VkClearDepthStencilValue* pDepthStencil,
6893 uint32_t rangeCount,
6894 const VkImageSubresourceRange* pRanges)
6895{
Dustin Graves1e92cd72016-02-09 14:00:18 -07006896 VkBool32 skipCall = VK_FALSE;
6897 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
6898 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006899
Dustin Graves1e92cd72016-02-09 14:00:18 -07006900 skipCall |= param_check_vkCmdClearDepthStencilImage(
6901 my_data->report_data,
6902 image,
6903 imageLayout,
6904 pDepthStencil,
6905 rangeCount,
6906 pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006907
Dustin Graves1e92cd72016-02-09 14:00:18 -07006908 if (skipCall == VK_FALSE) {
6909 PreCmdClearDepthStencilImage(commandBuffer, pRanges);
6910
6911 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
6912
6913 PostCmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount);
6914 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06006915}
6916
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006917bool PreCmdClearAttachments(
6918 VkCommandBuffer commandBuffer,
6919 const VkClearColorValue* pColor,
6920 const VkClearRect* pRects)
6921{
6922 if(pColor != nullptr)
6923 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006924 }
6925
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006926 if(pRects != nullptr)
6927 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006928 }
6929
6930 return true;
6931}
6932
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006933VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearAttachments(
6934 VkCommandBuffer commandBuffer,
6935 uint32_t attachmentCount,
6936 const VkClearAttachment* pAttachments,
6937 uint32_t rectCount,
6938 const VkClearRect* pRects)
6939{
Dustin Graves1e92cd72016-02-09 14:00:18 -07006940 VkBool32 skipCall = VK_FALSE;
6941 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
6942 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006943
Dustin Graves1e92cd72016-02-09 14:00:18 -07006944 skipCall |= param_check_vkCmdClearAttachments(
6945 my_data->report_data,
6946 attachmentCount,
6947 pAttachments,
6948 rectCount,
6949 pRects);
6950
6951 if (skipCall == VK_FALSE) {
6952 for (uint32_t i = 0; i < attachmentCount; i++) {
6953 PreCmdClearAttachments(commandBuffer, &pAttachments[i].clearValue.color, pRects);
6954 }
6955
6956 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
6957 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006958}
6959
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006960bool PreCmdResolveImage(
6961 VkCommandBuffer commandBuffer,
6962 const VkImageResolve* pRegions)
6963{
6964 if(pRegions != nullptr)
6965 {
6966 if ((pRegions->srcSubresource.aspectMask &
6967 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
6968 {
6969 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6970 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
6971 return false;
6972 }
6973 if ((pRegions->dstSubresource.aspectMask &
6974 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
6975 {
6976 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6977 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
6978 return false;
6979 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006980 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006981
6982 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006983}
6984
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006985bool PostCmdResolveImage(
6986 VkCommandBuffer commandBuffer,
6987 VkImage srcImage,
6988 VkImageLayout srcImageLayout,
6989 VkImage dstImage,
6990 VkImageLayout dstImageLayout,
6991 uint32_t regionCount)
6992{
6993
Jeremy Hayes99a96322015-06-26 12:48:09 -06006994
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006995 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006996 (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6997 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6998 {
6999 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
7000 "vkCmdResolveImage parameter, VkImageLayout srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007001 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007002 }
7003
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007004
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07007005 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007006 (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
7007 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
7008 {
7009 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
7010 "vkCmdResolveImage parameter, VkImageLayout dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007011 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007012 }
7013
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007014
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007015 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007016}
7017
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007018VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdResolveImage(
7019 VkCommandBuffer commandBuffer,
7020 VkImage srcImage,
7021 VkImageLayout srcImageLayout,
7022 VkImage dstImage,
7023 VkImageLayout dstImageLayout,
7024 uint32_t regionCount,
7025 const VkImageResolve* pRegions)
7026{
Dustin Graves1e92cd72016-02-09 14:00:18 -07007027 VkBool32 skipCall = VK_FALSE;
7028 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
7029 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007030
Dustin Graves1e92cd72016-02-09 14:00:18 -07007031 skipCall |= param_check_vkCmdResolveImage(
7032 my_data->report_data,
7033 srcImage,
7034 srcImageLayout,
7035 dstImage,
7036 dstImageLayout,
7037 regionCount,
7038 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007039
Dustin Graves1e92cd72016-02-09 14:00:18 -07007040 if (skipCall == VK_FALSE) {
7041 PreCmdResolveImage(commandBuffer, pRegions);
7042
7043 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
7044
7045 PostCmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount);
7046 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06007047}
7048
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007049bool PostCmdSetEvent(
7050 VkCommandBuffer commandBuffer,
7051 VkEvent event,
7052 VkPipelineStageFlags stageMask)
7053{
7054
7055
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007056
7057 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007058}
7059
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007060VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetEvent(
7061 VkCommandBuffer commandBuffer,
7062 VkEvent event,
7063 VkPipelineStageFlags stageMask)
7064{
7065 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007066
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007067 PostCmdSetEvent(commandBuffer, event, stageMask);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007068}
7069
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007070bool PostCmdResetEvent(
7071 VkCommandBuffer commandBuffer,
7072 VkEvent event,
7073 VkPipelineStageFlags stageMask)
7074{
7075
7076
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007077
7078 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007079}
7080
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007081VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdResetEvent(
7082 VkCommandBuffer commandBuffer,
7083 VkEvent event,
7084 VkPipelineStageFlags stageMask)
7085{
7086 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007087
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007088 PostCmdResetEvent(commandBuffer, event, stageMask);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007089}
7090
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007091bool PreCmdWaitEvents(
7092 VkCommandBuffer commandBuffer,
7093 const VkEvent* pEvents,
7094 uint32_t memoryBarrierCount,
7095 const VkMemoryBarrier *pMemoryBarriers,
7096 uint32_t bufferMemoryBarrierCount,
7097 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
7098 uint32_t imageMemoryBarrierCount,
7099 const VkImageMemoryBarrier *pImageMemoryBarriers)
7100{
7101 if(pEvents != nullptr)
7102 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06007103 }
7104
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007105 if(pMemoryBarriers != nullptr)
7106 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06007107 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007108
7109 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007110}
7111
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007112bool PostCmdWaitEvents(
7113 VkCommandBuffer commandBuffer,
7114 uint32_t eventCount,
7115 VkPipelineStageFlags srcStageMask,
7116 VkPipelineStageFlags dstStageMask,
7117 uint32_t memoryBarrierCount)
7118{
7119
7120
7121
7122
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007123
7124 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007125}
7126
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007127VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWaitEvents(
7128 VkCommandBuffer commandBuffer,
7129 uint32_t eventCount,
7130 const VkEvent *pEvents,
7131 VkPipelineStageFlags srcStageMask,
7132 VkPipelineStageFlags dstStageMask,
7133 uint32_t memoryBarrierCount,
7134 const VkMemoryBarrier *pMemoryBarriers,
7135 uint32_t bufferMemoryBarrierCount,
7136 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
7137 uint32_t imageMemoryBarrierCount,
7138 const VkImageMemoryBarrier *pImageMemoryBarriers)
7139{
Dustin Graves1e92cd72016-02-09 14:00:18 -07007140 VkBool32 skipCall = VK_FALSE;
7141 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
7142 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007143
Dustin Graves1e92cd72016-02-09 14:00:18 -07007144 skipCall |= param_check_vkCmdWaitEvents(
7145 my_data->report_data,
7146 eventCount,
7147 pEvents,
7148 srcStageMask,
7149 dstStageMask,
7150 memoryBarrierCount,
7151 pMemoryBarriers,
7152 bufferMemoryBarrierCount,
7153 pBufferMemoryBarriers,
7154 imageMemoryBarrierCount,
7155 pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007156
Dustin Graves1e92cd72016-02-09 14:00:18 -07007157 if (skipCall == VK_FALSE) {
7158 PreCmdWaitEvents(commandBuffer, pEvents, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
7159
7160 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
7161
7162 PostCmdWaitEvents(commandBuffer, eventCount, srcStageMask, dstStageMask, memoryBarrierCount);
7163 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06007164}
7165
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007166bool PreCmdPipelineBarrier(
7167 VkCommandBuffer commandBuffer,
7168 uint32_t memoryBarrierCount,
7169 const VkMemoryBarrier *pMemoryBarriers,
7170 uint32_t bufferMemoryBarrierCount,
7171 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
7172 uint32_t imageMemoryBarrierCount,
7173 const VkImageMemoryBarrier *pImageMemoryBarriers)
7174{
7175 if(pMemoryBarriers != nullptr)
7176 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06007177 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007178
7179 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007180}
7181
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007182bool PostCmdPipelineBarrier(
7183 VkCommandBuffer commandBuffer,
7184 VkPipelineStageFlags srcStageMask,
7185 VkPipelineStageFlags dstStageMask,
7186 VkDependencyFlags dependencyFlags,
7187 uint32_t memoryBarrierCount)
7188{
7189
7190
7191
7192
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007193
7194 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007195}
7196
Chia-I Wu9ab61502015-11-06 06:42:02 +08007197VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPipelineBarrier(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007198 VkCommandBuffer commandBuffer,
7199 VkPipelineStageFlags srcStageMask,
7200 VkPipelineStageFlags dstStageMask,
7201 VkDependencyFlags dependencyFlags,
7202 uint32_t memoryBarrierCount,
7203 const VkMemoryBarrier *pMemoryBarriers,
7204 uint32_t bufferMemoryBarrierCount,
Jon Ashburnf19916e2016-01-11 13:12:43 -07007205 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007206 uint32_t imageMemoryBarrierCount,
7207 const VkImageMemoryBarrier *pImageMemoryBarriers)
7208{
Dustin Graves1e92cd72016-02-09 14:00:18 -07007209 VkBool32 skipCall = VK_FALSE;
7210 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
7211 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007212
Dustin Graves1e92cd72016-02-09 14:00:18 -07007213 skipCall |= param_check_vkCmdPipelineBarrier(
7214 my_data->report_data,
7215 srcStageMask,
7216 dstStageMask,
7217 dependencyFlags,
7218 memoryBarrierCount,
7219 pMemoryBarriers,
7220 bufferMemoryBarrierCount,
7221 pBufferMemoryBarriers,
7222 imageMemoryBarrierCount,
7223 pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007224
Dustin Graves1e92cd72016-02-09 14:00:18 -07007225 if (skipCall == VK_FALSE) {
7226 PreCmdPipelineBarrier(commandBuffer, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
7227
7228 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
7229
7230 PostCmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount);
7231 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06007232}
7233
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007234bool PostCmdBeginQuery(
7235 VkCommandBuffer commandBuffer,
7236 VkQueryPool queryPool,
7237 uint32_t slot,
7238 VkQueryControlFlags flags)
7239{
7240
7241
7242
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007243
7244 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007245}
7246
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007247VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBeginQuery(
7248 VkCommandBuffer commandBuffer,
7249 VkQueryPool queryPool,
7250 uint32_t slot,
7251 VkQueryControlFlags flags)
7252{
7253 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007254
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007255 PostCmdBeginQuery(commandBuffer, queryPool, slot, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007256}
7257
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007258bool PostCmdEndQuery(
7259 VkCommandBuffer commandBuffer,
7260 VkQueryPool queryPool,
7261 uint32_t slot)
7262{
7263
7264
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007265
7266 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007267}
7268
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007269VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndQuery(
7270 VkCommandBuffer commandBuffer,
7271 VkQueryPool queryPool,
7272 uint32_t slot)
7273{
7274 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007275
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007276 PostCmdEndQuery(commandBuffer, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007277}
7278
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007279bool PostCmdResetQueryPool(
7280 VkCommandBuffer commandBuffer,
7281 VkQueryPool queryPool,
7282 uint32_t firstQuery,
7283 uint32_t queryCount)
7284{
7285
7286
7287
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007288
7289 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007290}
7291
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007292VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdResetQueryPool(
7293 VkCommandBuffer commandBuffer,
7294 VkQueryPool queryPool,
7295 uint32_t firstQuery,
7296 uint32_t queryCount)
7297{
7298 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007299
Jon Ashburn19d3bf12015-12-30 14:06:55 -07007300 PostCmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007301}
7302
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007303bool PostCmdWriteTimestamp(
7304 VkCommandBuffer commandBuffer,
7305 VkPipelineStageFlagBits pipelineStage,
7306 VkQueryPool queryPool,
7307 uint32_t slot)
7308{
Jeremy Hayes99a96322015-06-26 12:48:09 -06007309
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08007310 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007311
7312 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007313}
7314
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007315VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp(
7316 VkCommandBuffer commandBuffer,
7317 VkPipelineStageFlagBits pipelineStage,
7318 VkQueryPool queryPool,
7319 uint32_t slot)
7320{
7321 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007322
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007323 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007324}
7325
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007326bool PostCmdCopyQueryPoolResults(
7327 VkCommandBuffer commandBuffer,
7328 VkQueryPool queryPool,
7329 uint32_t firstQuery,
7330 uint32_t queryCount,
7331 VkBuffer dstBuffer,
7332 VkDeviceSize dstOffset,
7333 VkDeviceSize stride,
7334 VkQueryResultFlags flags)
7335{
7336
7337
7338
7339
7340
7341
7342
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007343
7344 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06007345}
7346
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007347VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyQueryPoolResults(
7348 VkCommandBuffer commandBuffer,
7349 VkQueryPool queryPool,
7350 uint32_t firstQuery,
7351 uint32_t queryCount,
7352 VkBuffer dstBuffer,
7353 VkDeviceSize dstOffset,
7354 VkDeviceSize stride,
7355 VkQueryResultFlags flags)
7356{
7357 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007358
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007359 PostCmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
Jeremy Hayesad367152015-04-17 10:36:53 -06007360}
7361
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007362bool PreCmdPushConstants(
7363 VkCommandBuffer commandBuffer,
7364 const void* pValues)
7365{
7366 if(pValues != nullptr)
7367 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06007368 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007369
7370 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007371}
7372
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007373bool PostCmdPushConstants(
7374 VkCommandBuffer commandBuffer,
7375 VkPipelineLayout layout,
7376 VkShaderStageFlags stageFlags,
7377 uint32_t offset,
7378 uint32_t size)
7379{
7380
7381
7382
7383
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007384
7385 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007386}
7387
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007388VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants(
7389 VkCommandBuffer commandBuffer,
7390 VkPipelineLayout layout,
7391 VkShaderStageFlags stageFlags,
7392 uint32_t offset,
7393 uint32_t size,
7394 const void* pValues)
7395{
Dustin Graves1e92cd72016-02-09 14:00:18 -07007396 VkBool32 skipCall = VK_FALSE;
7397 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
7398 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007399
Dustin Graves1e92cd72016-02-09 14:00:18 -07007400 skipCall |= param_check_vkCmdPushConstants(
7401 my_data->report_data,
7402 layout,
7403 stageFlags,
7404 offset,
7405 size,
7406 pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007407
Dustin Graves1e92cd72016-02-09 14:00:18 -07007408 if (skipCall == VK_FALSE) {
7409 PreCmdPushConstants(commandBuffer, pValues);
7410
7411 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
7412
7413 PostCmdPushConstants(commandBuffer, layout, stageFlags, offset, size);
7414 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06007415}
7416
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007417bool PreCmdBeginRenderPass(
7418 VkCommandBuffer commandBuffer,
7419 const VkRenderPassBeginInfo* pRenderPassBegin)
7420{
7421 if(pRenderPassBegin != nullptr)
7422 {
7423 if(pRenderPassBegin->sType != VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO)
7424 {
7425 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
7426 "vkCmdBeginRenderPass parameter, VkStructureType pRenderPassBegin->sType, is an invalid enumerator");
7427 return false;
7428 }
7429 if(pRenderPassBegin->pClearValues != nullptr)
7430 {
7431 }
Jon Ashburne68a9ff2015-05-25 14:11:37 -06007432 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007433
7434 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06007435}
7436
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007437bool PostCmdBeginRenderPass(
7438 VkCommandBuffer commandBuffer,
7439 VkSubpassContents contents)
7440{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007441
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007442 if(contents < VK_SUBPASS_CONTENTS_BEGIN_RANGE ||
7443 contents > VK_SUBPASS_CONTENTS_END_RANGE)
7444 {
7445 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
7446 "vkCmdBeginRenderPass parameter, VkSubpassContents contents, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06007447 return false;
7448 }
7449
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007450 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06007451}
7452
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007453VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBeginRenderPass(
7454 VkCommandBuffer commandBuffer,
7455 const VkRenderPassBeginInfo* pRenderPassBegin,
7456 VkSubpassContents contents)
7457{
Dustin Graves1e92cd72016-02-09 14:00:18 -07007458 VkBool32 skipCall = VK_FALSE;
7459 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
7460 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06007461
Dustin Graves1e92cd72016-02-09 14:00:18 -07007462 skipCall |= param_check_vkCmdBeginRenderPass(
7463 my_data->report_data,
7464 pRenderPassBegin,
7465 contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007466
Dustin Graves1e92cd72016-02-09 14:00:18 -07007467 if (skipCall == VK_FALSE) {
7468 PreCmdBeginRenderPass(commandBuffer, pRenderPassBegin);
7469
7470 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
7471
7472 PostCmdBeginRenderPass(commandBuffer, contents);
7473 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06007474}
7475
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007476bool PostCmdNextSubpass(
7477 VkCommandBuffer commandBuffer,
7478 VkSubpassContents contents)
7479{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007480
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007481 if(contents < VK_SUBPASS_CONTENTS_BEGIN_RANGE ||
7482 contents > VK_SUBPASS_CONTENTS_END_RANGE)
7483 {
7484 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
7485 "vkCmdNextSubpass parameter, VkSubpassContents contents, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06007486 return false;
Chia-I Wu08accc62015-07-07 11:50:03 +08007487 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007488
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06007489 return true;
Chia-I Wu08accc62015-07-07 11:50:03 +08007490}
7491
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007492VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass(
7493 VkCommandBuffer commandBuffer,
7494 VkSubpassContents contents)
7495{
7496 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
Chia-I Wu08accc62015-07-07 11:50:03 +08007497
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007498 PostCmdNextSubpass(commandBuffer, contents);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06007499}
7500
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007501bool PostCmdEndRenderPass(
7502 VkCommandBuffer commandBuffer)
7503{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06007504
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007505 return true;
7506}
7507
7508VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass(
7509 VkCommandBuffer commandBuffer)
7510{
7511 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06007512
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007513 PostCmdEndRenderPass(commandBuffer);
Chia-I Wu08accc62015-07-07 11:50:03 +08007514}
7515
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007516bool PreCmdExecuteCommands(
7517 VkCommandBuffer commandBuffer,
7518 const VkCommandBuffer* pCommandBuffers)
7519{
7520 if(pCommandBuffers != nullptr)
7521 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007522 }
7523
7524 return true;
7525}
7526
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007527bool PostCmdExecuteCommands(
7528 VkCommandBuffer commandBuffer,
7529 uint32_t commandBuffersCount)
7530{
7531
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007532
7533 return true;
7534}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06007535
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007536VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdExecuteCommands(
7537 VkCommandBuffer commandBuffer,
Dustin Graves1e92cd72016-02-09 14:00:18 -07007538 uint32_t commandBufferCount,
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007539 const VkCommandBuffer* pCommandBuffers)
7540{
Dustin Graves1e92cd72016-02-09 14:00:18 -07007541 VkBool32 skipCall = VK_FALSE;
7542 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
7543 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007544
Dustin Graves1e92cd72016-02-09 14:00:18 -07007545 skipCall |= param_check_vkCmdExecuteCommands(
7546 my_data->report_data,
7547 commandBufferCount,
7548 pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08007549
Dustin Graves1e92cd72016-02-09 14:00:18 -07007550 if (skipCall == VK_FALSE) {
7551 PreCmdExecuteCommands(commandBuffer, pCommandBuffers);
7552
7553 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
7554
7555 PostCmdExecuteCommands(commandBuffer, commandBufferCount);
7556 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06007557}
7558
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007559VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char* funcName)
7560{
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07007561 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
7562
7563 if (validate_string(data, "vkGetDeviceProcAddr()", "funcName", funcName) == VK_TRUE) {
7564 return NULL;
7565 }
7566
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07007567 if (!strcmp(funcName, "vkGetDeviceProcAddr"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007568 return (PFN_vkVoidFunction) vkGetDeviceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007569 if (!strcmp(funcName, "vkDestroyDevice"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007570 return (PFN_vkVoidFunction) vkDestroyDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007571 if (!strcmp(funcName, "vkGetDeviceQueue"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007572 return (PFN_vkVoidFunction) vkGetDeviceQueue;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007573 if (!strcmp(funcName, "vkQueueSubmit"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007574 return (PFN_vkVoidFunction) vkQueueSubmit;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007575 if (!strcmp(funcName, "vkQueueWaitIdle"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007576 return (PFN_vkVoidFunction) vkQueueWaitIdle;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007577 if (!strcmp(funcName, "vkDeviceWaitIdle"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007578 return (PFN_vkVoidFunction) vkDeviceWaitIdle;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007579 if (!strcmp(funcName, "vkAllocateMemory"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007580 return (PFN_vkVoidFunction) vkAllocateMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007581 if (!strcmp(funcName, "vkMapMemory"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007582 return (PFN_vkVoidFunction) vkMapMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007583 if (!strcmp(funcName, "vkFlushMappedMemoryRanges"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007584 return (PFN_vkVoidFunction) vkFlushMappedMemoryRanges;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007585 if (!strcmp(funcName, "vkInvalidateMappedMemoryRanges"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007586 return (PFN_vkVoidFunction) vkInvalidateMappedMemoryRanges;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007587 if (!strcmp(funcName, "vkCreateFence"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007588 return (PFN_vkVoidFunction) vkCreateFence;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007589 if (!strcmp(funcName, "vkResetFences"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007590 return (PFN_vkVoidFunction) vkResetFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007591 if (!strcmp(funcName, "vkGetFenceStatus"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007592 return (PFN_vkVoidFunction) vkGetFenceStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007593 if (!strcmp(funcName, "vkWaitForFences"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007594 return (PFN_vkVoidFunction) vkWaitForFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007595 if (!strcmp(funcName, "vkCreateSemaphore"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007596 return (PFN_vkVoidFunction) vkCreateSemaphore;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007597 if (!strcmp(funcName, "vkCreateEvent"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007598 return (PFN_vkVoidFunction) vkCreateEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007599 if (!strcmp(funcName, "vkGetEventStatus"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007600 return (PFN_vkVoidFunction) vkGetEventStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007601 if (!strcmp(funcName, "vkSetEvent"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007602 return (PFN_vkVoidFunction) vkSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007603 if (!strcmp(funcName, "vkResetEvent"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007604 return (PFN_vkVoidFunction) vkResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007605 if (!strcmp(funcName, "vkCreateQueryPool"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007606 return (PFN_vkVoidFunction) vkCreateQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007607 if (!strcmp(funcName, "vkGetQueryPoolResults"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007608 return (PFN_vkVoidFunction) vkGetQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007609 if (!strcmp(funcName, "vkCreateBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007610 return (PFN_vkVoidFunction) vkCreateBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007611 if (!strcmp(funcName, "vkCreateBufferView"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007612 return (PFN_vkVoidFunction) vkCreateBufferView;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007613 if (!strcmp(funcName, "vkCreateImage"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007614 return (PFN_vkVoidFunction) vkCreateImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007615 if (!strcmp(funcName, "vkGetImageSubresourceLayout"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007616 return (PFN_vkVoidFunction) vkGetImageSubresourceLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007617 if (!strcmp(funcName, "vkCreateImageView"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007618 return (PFN_vkVoidFunction) vkCreateImageView;
Michael Lentine03d8e572015-09-15 14:59:14 -05007619 if (!strcmp(funcName, "vkCreateShaderModule"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007620 return (PFN_vkVoidFunction) vkCreateShaderModule;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007621 if (!strcmp(funcName, "vkCreateGraphicsPipelines"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007622 return (PFN_vkVoidFunction) vkCreateGraphicsPipelines;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007623 if (!strcmp(funcName, "vkCreateComputePipelines"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007624 return (PFN_vkVoidFunction) vkCreateComputePipelines;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007625 if (!strcmp(funcName, "vkCreatePipelineLayout"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007626 return (PFN_vkVoidFunction) vkCreatePipelineLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007627 if (!strcmp(funcName, "vkCreateSampler"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007628 return (PFN_vkVoidFunction) vkCreateSampler;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007629 if (!strcmp(funcName, "vkCreateDescriptorSetLayout"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007630 return (PFN_vkVoidFunction) vkCreateDescriptorSetLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007631 if (!strcmp(funcName, "vkCreateDescriptorPool"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007632 return (PFN_vkVoidFunction) vkCreateDescriptorPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007633 if (!strcmp(funcName, "vkResetDescriptorPool"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007634 return (PFN_vkVoidFunction) vkResetDescriptorPool;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007635 if (!strcmp(funcName, "vkAllocateDescriptorSets"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007636 return (PFN_vkVoidFunction) vkAllocateDescriptorSets;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06007637 if (!strcmp(funcName, "vkCmdSetViewport"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007638 return (PFN_vkVoidFunction) vkCmdSetViewport;
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06007639 if (!strcmp(funcName, "vkCmdSetScissor"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007640 return (PFN_vkVoidFunction) vkCmdSetScissor;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06007641 if (!strcmp(funcName, "vkCmdSetLineWidth"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007642 return (PFN_vkVoidFunction) vkCmdSetLineWidth;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06007643 if (!strcmp(funcName, "vkCmdSetDepthBias"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007644 return (PFN_vkVoidFunction) vkCmdSetDepthBias;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06007645 if (!strcmp(funcName, "vkCmdSetBlendConstants"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007646 return (PFN_vkVoidFunction) vkCmdSetBlendConstants;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06007647 if (!strcmp(funcName, "vkCmdSetDepthBounds"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007648 return (PFN_vkVoidFunction) vkCmdSetDepthBounds;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06007649 if (!strcmp(funcName, "vkCmdSetStencilCompareMask"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007650 return (PFN_vkVoidFunction) vkCmdSetStencilCompareMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06007651 if (!strcmp(funcName, "vkCmdSetStencilWriteMask"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007652 return (PFN_vkVoidFunction) vkCmdSetStencilWriteMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06007653 if (!strcmp(funcName, "vkCmdSetStencilReference"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007654 return (PFN_vkVoidFunction) vkCmdSetStencilReference;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007655 if (!strcmp(funcName, "vkAllocateCommandBuffers"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007656 return (PFN_vkVoidFunction) vkAllocateCommandBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007657 if (!strcmp(funcName, "vkBeginCommandBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007658 return (PFN_vkVoidFunction) vkBeginCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007659 if (!strcmp(funcName, "vkEndCommandBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007660 return (PFN_vkVoidFunction) vkEndCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007661 if (!strcmp(funcName, "vkResetCommandBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007662 return (PFN_vkVoidFunction) vkResetCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007663 if (!strcmp(funcName, "vkCmdBindPipeline"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007664 return (PFN_vkVoidFunction) vkCmdBindPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007665 if (!strcmp(funcName, "vkCmdBindDescriptorSets"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007666 return (PFN_vkVoidFunction) vkCmdBindDescriptorSets;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007667 if (!strcmp(funcName, "vkCmdBindVertexBuffers"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007668 return (PFN_vkVoidFunction) vkCmdBindVertexBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007669 if (!strcmp(funcName, "vkCmdBindIndexBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007670 return (PFN_vkVoidFunction) vkCmdBindIndexBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007671 if (!strcmp(funcName, "vkCmdDraw"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007672 return (PFN_vkVoidFunction) vkCmdDraw;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007673 if (!strcmp(funcName, "vkCmdDrawIndexed"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007674 return (PFN_vkVoidFunction) vkCmdDrawIndexed;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007675 if (!strcmp(funcName, "vkCmdDrawIndirect"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007676 return (PFN_vkVoidFunction) vkCmdDrawIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007677 if (!strcmp(funcName, "vkCmdDrawIndexedIndirect"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007678 return (PFN_vkVoidFunction) vkCmdDrawIndexedIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007679 if (!strcmp(funcName, "vkCmdDispatch"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007680 return (PFN_vkVoidFunction) vkCmdDispatch;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007681 if (!strcmp(funcName, "vkCmdDispatchIndirect"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007682 return (PFN_vkVoidFunction) vkCmdDispatchIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007683 if (!strcmp(funcName, "vkCmdCopyBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007684 return (PFN_vkVoidFunction) vkCmdCopyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007685 if (!strcmp(funcName, "vkCmdCopyImage"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007686 return (PFN_vkVoidFunction) vkCmdCopyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007687 if (!strcmp(funcName, "vkCmdBlitImage"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007688 return (PFN_vkVoidFunction) vkCmdBlitImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007689 if (!strcmp(funcName, "vkCmdCopyBufferToImage"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007690 return (PFN_vkVoidFunction) vkCmdCopyBufferToImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007691 if (!strcmp(funcName, "vkCmdCopyImageToBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007692 return (PFN_vkVoidFunction) vkCmdCopyImageToBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007693 if (!strcmp(funcName, "vkCmdUpdateBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007694 return (PFN_vkVoidFunction) vkCmdUpdateBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007695 if (!strcmp(funcName, "vkCmdFillBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007696 return (PFN_vkVoidFunction) vkCmdFillBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007697 if (!strcmp(funcName, "vkCmdClearColorImage"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007698 return (PFN_vkVoidFunction) vkCmdClearColorImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007699 if (!strcmp(funcName, "vkCmdResolveImage"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007700 return (PFN_vkVoidFunction) vkCmdResolveImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007701 if (!strcmp(funcName, "vkCmdSetEvent"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007702 return (PFN_vkVoidFunction) vkCmdSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007703 if (!strcmp(funcName, "vkCmdResetEvent"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007704 return (PFN_vkVoidFunction) vkCmdResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007705 if (!strcmp(funcName, "vkCmdWaitEvents"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007706 return (PFN_vkVoidFunction) vkCmdWaitEvents;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007707 if (!strcmp(funcName, "vkCmdPipelineBarrier"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007708 return (PFN_vkVoidFunction) vkCmdPipelineBarrier;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007709 if (!strcmp(funcName, "vkCmdBeginQuery"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007710 return (PFN_vkVoidFunction) vkCmdBeginQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007711 if (!strcmp(funcName, "vkCmdEndQuery"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007712 return (PFN_vkVoidFunction) vkCmdEndQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007713 if (!strcmp(funcName, "vkCmdResetQueryPool"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007714 return (PFN_vkVoidFunction) vkCmdResetQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007715 if (!strcmp(funcName, "vkCmdWriteTimestamp"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007716 return (PFN_vkVoidFunction) vkCmdWriteTimestamp;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007717 if (!strcmp(funcName, "vkCmdCopyQueryPoolResults"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007718 return (PFN_vkVoidFunction) vkCmdCopyQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007719 if (!strcmp(funcName, "vkCreateFramebuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007720 return (PFN_vkVoidFunction) vkCreateFramebuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007721 if (!strcmp(funcName, "vkCreateRenderPass"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007722 return (PFN_vkVoidFunction) vkCreateRenderPass;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007723 if (!strcmp(funcName, "vkCmdBeginRenderPass"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007724 return (PFN_vkVoidFunction) vkCmdBeginRenderPass;
Chia-I Wu08accc62015-07-07 11:50:03 +08007725 if (!strcmp(funcName, "vkCmdNextSubpass"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007726 return (PFN_vkVoidFunction) vkCmdNextSubpass;
Jon Ashburneab34492015-06-01 09:37:38 -06007727
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07007728 if (device == NULL) {
7729 return NULL;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06007730 }
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07007731
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007732 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07007733 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007734 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06007735}
7736
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007737VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char* funcName)
7738{
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07007739 if (!strcmp(funcName, "vkGetInstanceProcAddr"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007740 return (PFN_vkVoidFunction) vkGetInstanceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007741 if (!strcmp(funcName, "vkCreateInstance"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007742 return (PFN_vkVoidFunction) vkCreateInstance;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007743 if (!strcmp(funcName, "vkDestroyInstance"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007744 return (PFN_vkVoidFunction) vkDestroyInstance;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07007745 if (!strcmp(funcName, "vkCreateDevice"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007746 return (PFN_vkVoidFunction) vkCreateDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007747 if (!strcmp(funcName, "vkEnumeratePhysicalDevices"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007748 return (PFN_vkVoidFunction) vkEnumeratePhysicalDevices;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007749 if (!strcmp(funcName, "vkGetPhysicalDeviceProperties"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007750 return (PFN_vkVoidFunction) vkGetPhysicalDeviceProperties;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007751 if (!strcmp(funcName, "vkGetPhysicalDeviceFeatures"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007752 return (PFN_vkVoidFunction) vkGetPhysicalDeviceFeatures;
Courtney Goeltzenleuchter2caec862015-07-12 12:52:09 -06007753 if (!strcmp(funcName, "vkGetPhysicalDeviceFormatProperties"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007754 return (PFN_vkVoidFunction) vkGetPhysicalDeviceFormatProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06007755 if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007756 return (PFN_vkVoidFunction) vkEnumerateInstanceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06007757 if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007758 return (PFN_vkVoidFunction) vkEnumerateInstanceExtensionProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06007759 if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007760 return (PFN_vkVoidFunction) vkEnumerateDeviceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06007761 if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007762 return (PFN_vkVoidFunction) vkEnumerateDeviceExtensionProperties;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06007763
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07007764 if (instance == NULL) {
7765 return NULL;
7766 }
7767
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007768 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07007769
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007770 PFN_vkVoidFunction fptr = debug_report_get_instance_proc_addr(data->report_data, funcName);
7771 if(fptr)
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06007772 return fptr;
7773
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007774 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07007775 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007776 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06007777}