blob: 70099b6ca9542de937fee7322058cc414235c073 [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;
Jeremy Hayes99a96322015-06-26 12:48:09 -0600102 uint32_t report_flags = getLayerOptionFlags("ParamCheckerReportFlags", 0);
103
104 uint32_t debug_action = 0;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700105 getLayerOptionEnum("ParamCheckerDebugAction", (uint32_t *) &debug_action);
106 if(debug_action & VK_DBG_LAYER_ACTION_LOG_MSG)
107 {
Jeremy Hayes99a96322015-06-26 12:48:09 -0600108 FILE *log_output = NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700109 const char* option_str = getLayerOption("ParamCheckerLogFilename");
Tobin Ehlisb1df55e2015-09-15 09:55:54 -0600110 log_output = getLayerLogOutput(option_str, "ParamChecker");
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{
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -0600218 /* ParamChecker 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
Courtney Goeltzenleuchterf13293f2015-07-07 11:02:42 -0600236 /* ParamChecker'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 }
4860 if(pCreateInfo->compareEnable)
4861 {
4862 if(pCreateInfo->compareOp < VK_COMPARE_OP_BEGIN_RANGE ||
4863 pCreateInfo->compareOp > VK_COMPARE_OP_END_RANGE)
4864 {
4865 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4866 "vkCreateSampler parameter, VkCompareOp pCreateInfo->compareOp, is an unrecognized enumerator");
Mark Lobodzinskib39d9e62016-02-02 17:06:29 -07004867 return false;
4868 }
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004869 }
4870 if(pCreateInfo->borderColor < VK_BORDER_COLOR_BEGIN_RANGE ||
4871 pCreateInfo->borderColor > VK_BORDER_COLOR_END_RANGE)
4872 {
4873 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4874 "vkCreateSampler parameter, VkBorderColor pCreateInfo->borderColor, is an unrecognized enumerator");
4875 return false;
4876 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004877 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004878
4879 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004880}
4881
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004882bool PostCreateSampler(
4883 VkDevice device,
4884 VkSampler* pSampler,
4885 VkResult result)
4886{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004887
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004888 if(pSampler != nullptr)
4889 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004890 }
4891
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004892 if(result < VK_SUCCESS)
4893 {
4894 std::string reason = "vkCreateSampler parameter, VkResult result, is " + EnumeratorString(result);
4895 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 -06004896 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004897 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004898
4899 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004900}
4901
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004902VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSampler(
4903 VkDevice device,
4904 const VkSamplerCreateInfo* pCreateInfo,
4905 const VkAllocationCallbacks* pAllocator,
4906 VkSampler* pSampler)
4907{
Dustin Graves1e92cd72016-02-09 14:00:18 -07004908 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4909 VkBool32 skipCall = VK_FALSE;
4910 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4911 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004912
Dustin Graves1e92cd72016-02-09 14:00:18 -07004913 skipCall |= param_check_vkCreateSampler(
4914 my_data->report_data,
4915 pCreateInfo,
4916 pAllocator,
4917 pSampler);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004918
Dustin Graves1e92cd72016-02-09 14:00:18 -07004919 if (skipCall == VK_FALSE) {
4920 PreCreateSampler(device, pCreateInfo);
4921
4922 result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
4923
4924 PostCreateSampler(device, pSampler, result);
4925 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004926
4927 return result;
4928}
4929
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004930bool PreCreateDescriptorSetLayout(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004931 VkDevice device,
4932 const VkDescriptorSetLayoutCreateInfo* pCreateInfo)
4933{
4934 if(pCreateInfo != nullptr)
4935 {
4936 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO)
4937 {
4938 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4939 "vkCreateDescriptorSetLayout parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
4940 return false;
4941 }
4942 if(pCreateInfo->pBindings != nullptr)
4943 {
4944 if(pCreateInfo->pBindings->descriptorType < VK_DESCRIPTOR_TYPE_BEGIN_RANGE ||
4945 pCreateInfo->pBindings->descriptorType > VK_DESCRIPTOR_TYPE_END_RANGE)
4946 {
4947 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
4948 "vkCreateDescriptorSetLayout parameter, VkDescriptorType pCreateInfo->pBindings->descriptorType, is an unrecognized enumerator");
4949 return false;
4950 }
4951 if(pCreateInfo->pBindings->pImmutableSamplers != nullptr)
4952 {
4953 }
4954 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06004955 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004956
4957 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004958}
4959
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004960bool PostCreateDescriptorSetLayout(
4961 VkDevice device,
4962 VkDescriptorSetLayout* pSetLayout,
4963 VkResult result)
4964{
Jeremy Hayes99a96322015-06-26 12:48:09 -06004965
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004966 if(pSetLayout != nullptr)
4967 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06004968 }
4969
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004970 if(result < VK_SUCCESS)
4971 {
4972 std::string reason = "vkCreateDescriptorSetLayout parameter, VkResult result, is " + EnumeratorString(result);
4973 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 -06004974 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004975 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004976
4977 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06004978}
4979
Chia-I Wu9ab61502015-11-06 06:42:02 +08004980VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorSetLayout(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07004981 VkDevice device,
4982 const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
4983 const VkAllocationCallbacks* pAllocator,
4984 VkDescriptorSetLayout* pSetLayout)
4985{
Dustin Graves1e92cd72016-02-09 14:00:18 -07004986 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4987 VkBool32 skipCall = VK_FALSE;
4988 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4989 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06004990
Dustin Graves1e92cd72016-02-09 14:00:18 -07004991 skipCall |= param_check_vkCreateDescriptorSetLayout(
4992 my_data->report_data,
4993 pCreateInfo,
4994 pAllocator,
4995 pSetLayout);
Jeremy Hayes99a96322015-06-26 12:48:09 -06004996
Dustin Graves1e92cd72016-02-09 14:00:18 -07004997 if (skipCall == VK_FALSE) {
4998 PreCreateDescriptorSetLayout(device, pCreateInfo);
4999
5000 result = get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
5001
5002 PostCreateDescriptorSetLayout(device, pSetLayout, result);
5003 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06005004
5005 return result;
5006}
5007
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005008bool PreCreateDescriptorPool(
5009 VkDevice device,
5010 const VkDescriptorPoolCreateInfo* pCreateInfo)
5011{
5012 if(pCreateInfo != nullptr)
5013 {
5014 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO)
5015 {
5016 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5017 "vkCreateDescriptorPool parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
5018 return false;
5019 }
5020 if(pCreateInfo->pPoolSizes != nullptr)
5021 {
5022 if(pCreateInfo->pPoolSizes->type < VK_DESCRIPTOR_TYPE_BEGIN_RANGE ||
5023 pCreateInfo->pPoolSizes->type > VK_DESCRIPTOR_TYPE_END_RANGE)
5024 {
5025 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5026 "vkCreateDescriptorPool parameter, VkDescriptorType pCreateInfo->pTypeCount->type, is an unrecognized enumerator");
5027 return false;
5028 }
5029 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005030 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005031
5032 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005033}
5034
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005035bool PostCreateDescriptorPool(
5036 VkDevice device,
5037 uint32_t maxSets,
5038 VkDescriptorPool* pDescriptorPool,
5039 VkResult result)
5040{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005041
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005042 /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
Jeremy Hayes99a96322015-06-26 12:48:09 -06005043
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005044 if(pDescriptorPool != nullptr)
5045 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005046 }
5047
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005048 if(result < VK_SUCCESS)
5049 {
5050 std::string reason = "vkCreateDescriptorPool parameter, VkResult result, is " + EnumeratorString(result);
5051 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 -06005052 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005053 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005054
5055 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005056}
5057
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005058VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorPool(
5059 VkDevice device,
5060 const VkDescriptorPoolCreateInfo* pCreateInfo,
5061 const VkAllocationCallbacks* pAllocator,
5062 VkDescriptorPool* pDescriptorPool)
5063{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005064 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5065 VkBool32 skipCall = VK_FALSE;
5066 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5067 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005068
Dustin Graves1e92cd72016-02-09 14:00:18 -07005069 skipCall |= param_check_vkCreateDescriptorPool(
5070 my_data->report_data,
5071 pCreateInfo,
5072 pAllocator,
5073 pDescriptorPool);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005074
Dustin Graves1e92cd72016-02-09 14:00:18 -07005075 if (skipCall == VK_FALSE) {
5076 PreCreateDescriptorPool(device, pCreateInfo);
5077
5078 result = get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
5079
5080 PostCreateDescriptorPool(device, pCreateInfo->maxSets, pDescriptorPool, result);
5081 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06005082
5083 return result;
5084}
5085
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005086bool PostResetDescriptorPool(
5087 VkDevice device,
5088 VkDescriptorPool descriptorPool,
5089 VkResult result)
5090{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005091
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005092
5093 if(result < VK_SUCCESS)
5094 {
5095 std::string reason = "vkResetDescriptorPool parameter, VkResult result, is " + EnumeratorString(result);
5096 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 -06005097 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005098 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005099
5100 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005101}
5102
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005103VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetDescriptorPool(
5104 VkDevice device,
5105 VkDescriptorPool descriptorPool,
5106 VkDescriptorPoolResetFlags flags)
5107{
5108 VkResult result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005109
5110 PostResetDescriptorPool(device, descriptorPool, result);
5111
5112 return result;
5113}
5114
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005115bool PreAllocateDescriptorSets(
5116 VkDevice device,
5117 const VkDescriptorSetLayout* pSetLayouts)
5118{
5119 if(pSetLayouts != nullptr)
5120 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005121 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005122
5123 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005124}
5125
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005126bool PostAllocateDescriptorSets(
5127 VkDevice device,
5128 VkDescriptorPool descriptorPool,
5129 uint32_t count,
5130 VkDescriptorSet* pDescriptorSets,
5131 VkResult result)
5132{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005133
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005134
5135 if(pDescriptorSets != nullptr)
5136 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005137 }
5138
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005139 if(result < VK_SUCCESS)
5140 {
5141 std::string reason = "vkAllocateDescriptorSets parameter, VkResult result, is " + EnumeratorString(result);
5142 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 -06005143 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005144 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005145
5146 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005147}
5148
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005149VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateDescriptorSets(
5150 VkDevice device,
5151 const VkDescriptorSetAllocateInfo* pAllocateInfo,
5152 VkDescriptorSet* pDescriptorSets)
5153{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005154 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5155 VkBool32 skipCall = VK_FALSE;
5156 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5157 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005158
Dustin Graves1e92cd72016-02-09 14:00:18 -07005159 skipCall |= param_check_vkAllocateDescriptorSets(
5160 my_data->report_data,
5161 pAllocateInfo,
5162 pDescriptorSets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005163
Dustin Graves1e92cd72016-02-09 14:00:18 -07005164 if (skipCall == VK_FALSE) {
5165 PreAllocateDescriptorSets(device, pAllocateInfo->pSetLayouts);
5166
5167 result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
5168
5169 PostAllocateDescriptorSets(device, pAllocateInfo->descriptorPool, pAllocateInfo->descriptorSetCount, pDescriptorSets, result);
5170 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06005171
5172 return result;
5173}
5174
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005175bool PreFreeDescriptorSets(
5176 VkDevice device,
5177 const VkDescriptorSet* pDescriptorSets)
5178{
5179 if(pDescriptorSets != nullptr)
5180 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005181 }
5182
5183 return true;
5184}
5185
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005186bool PostFreeDescriptorSets(
5187 VkDevice device,
5188 VkDescriptorPool descriptorPool,
5189 uint32_t count,
5190 VkResult result)
5191{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005192
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005193
5194
5195 if(result < VK_SUCCESS)
5196 {
5197 std::string reason = "vkFreeDescriptorSets parameter, VkResult result, is " + EnumeratorString(result);
5198 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 -06005199 return false;
5200 }
5201
5202 return true;
5203}
5204
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005205VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFreeDescriptorSets(
5206 VkDevice device,
5207 VkDescriptorPool descriptorPool,
Dustin Graves1e92cd72016-02-09 14:00:18 -07005208 uint32_t descriptorSetCount,
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005209 const VkDescriptorSet* pDescriptorSets)
5210{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005211 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5212 VkBool32 skipCall = VK_FALSE;
5213 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5214 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005215
Dustin Graves1e92cd72016-02-09 14:00:18 -07005216 skipCall |= param_check_vkFreeDescriptorSets(
5217 my_data->report_data,
5218 descriptorPool,
5219 descriptorSetCount,
5220 pDescriptorSets);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005221
Dustin Graves1e92cd72016-02-09 14:00:18 -07005222 if (skipCall == VK_FALSE) {
5223 PreFreeDescriptorSets(device, pDescriptorSets);
5224
5225 result = get_dispatch_table(pc_device_table_map, device)->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
5226
5227 PostFreeDescriptorSets(device, descriptorPool, descriptorSetCount, result);
5228 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005229
5230 return result;
5231}
5232
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005233bool PreUpdateDescriptorSets(
5234 VkDevice device,
5235 const VkWriteDescriptorSet* pDescriptorWrites,
5236 const VkCopyDescriptorSet* pDescriptorCopies)
5237{
5238 if(pDescriptorWrites != nullptr)
5239 {
5240 if(pDescriptorWrites->sType != VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET)
5241 {
5242 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5243 "vkUpdateDescriptorSets parameter, VkStructureType pDescriptorWrites->sType, is an invalid enumerator");
5244 return false;
5245 }
5246 if(pDescriptorWrites->descriptorType < VK_DESCRIPTOR_TYPE_BEGIN_RANGE ||
5247 pDescriptorWrites->descriptorType > VK_DESCRIPTOR_TYPE_END_RANGE)
5248 {
5249 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5250 "vkUpdateDescriptorSets parameter, VkDescriptorType pDescriptorWrites->descriptorType, is an unrecognized enumerator");
5251 return false;
5252 }
5253 /* TODO: Validate other parts of pImageInfo, pBufferInfo, pTexelBufferView? */
5254 /* TODO: This test should probably only be done if descriptorType is correct type of descriptor */
5255 if(pDescriptorWrites->pImageInfo != nullptr)
5256 {
5257 if (((pDescriptorWrites->pImageInfo->imageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
5258 (pDescriptorWrites->pImageInfo->imageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5259 (pDescriptorWrites->pImageInfo->imageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5260 {
5261 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5262 "vkUpdateDescriptorSets parameter, VkImageLayout pDescriptorWrites->pDescriptors->imageLayout, is an unrecognized enumerator");
5263 return false;
5264 }
5265 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005266 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06005267
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005268 if(pDescriptorCopies != nullptr)
5269 {
5270 if(pDescriptorCopies->sType != VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET)
5271 {
5272 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5273 "vkUpdateDescriptorSets parameter, VkStructureType pDescriptorCopies->sType, is an invalid enumerator");
5274 return false;
5275 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06005276 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005277
5278 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005279}
5280
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005281VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkUpdateDescriptorSets(
5282 VkDevice device,
5283 uint32_t descriptorWriteCount,
5284 const VkWriteDescriptorSet* pDescriptorWrites,
5285 uint32_t descriptorCopyCount,
5286 const VkCopyDescriptorSet* pDescriptorCopies)
5287{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005288 VkBool32 skipCall = VK_FALSE;
5289 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5290 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005291
Dustin Graves1e92cd72016-02-09 14:00:18 -07005292 skipCall |= param_check_vkUpdateDescriptorSets(
5293 my_data->report_data,
5294 descriptorWriteCount,
5295 pDescriptorWrites,
5296 descriptorCopyCount,
5297 pDescriptorCopies);
5298
5299 if (skipCall == VK_FALSE) {
5300 PreUpdateDescriptorSets(device, pDescriptorWrites, pDescriptorCopies);
5301
5302 get_dispatch_table(pc_device_table_map, device)->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
5303 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06005304}
5305
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005306bool PreCreateFramebuffer(
5307 VkDevice device,
5308 const VkFramebufferCreateInfo* pCreateInfo)
5309{
5310 if(pCreateInfo != nullptr)
5311 {
5312 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO)
5313 {
5314 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5315 "vkCreateFramebuffer parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
5316 return false;
5317 }
5318 if(pCreateInfo->pAttachments != nullptr)
5319 {
5320 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005321 }
5322
5323 return true;
5324}
5325
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005326bool PostCreateFramebuffer(
5327 VkDevice device,
5328 VkFramebuffer* pFramebuffer,
5329 VkResult result)
5330{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005331
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005332 if(pFramebuffer != nullptr)
5333 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005334 }
5335
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005336 if(result < VK_SUCCESS)
5337 {
5338 std::string reason = "vkCreateFramebuffer parameter, VkResult result, is " + EnumeratorString(result);
5339 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 -06005340 return false;
5341 }
5342
5343 return true;
5344}
5345
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005346VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateFramebuffer(
5347 VkDevice device,
5348 const VkFramebufferCreateInfo* pCreateInfo,
5349 const VkAllocationCallbacks* pAllocator,
5350 VkFramebuffer* pFramebuffer)
5351{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005352 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5353 VkBool32 skipCall = VK_FALSE;
5354 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5355 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005356
Dustin Graves1e92cd72016-02-09 14:00:18 -07005357 skipCall |= param_check_vkCreateFramebuffer(
5358 my_data->report_data,
5359 pCreateInfo,
5360 pAllocator,
5361 pFramebuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005362
Dustin Graves1e92cd72016-02-09 14:00:18 -07005363 if (skipCall == VK_FALSE) {
5364 PreCreateFramebuffer(device, pCreateInfo);
5365
5366 result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
5367
5368 PostCreateFramebuffer(device, pFramebuffer, result);
5369 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005370
5371 return result;
5372}
5373
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005374bool PreCreateRenderPass(
5375 VkDevice device,
5376 const VkRenderPassCreateInfo* pCreateInfo)
5377{
5378 if(pCreateInfo != nullptr)
5379 {
5380 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO)
5381 {
5382 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5383 "vkCreateRenderPass parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
5384 return false;
5385 }
5386 if(pCreateInfo->pAttachments != nullptr)
5387 {
5388 if(pCreateInfo->pAttachments->format < VK_FORMAT_BEGIN_RANGE ||
5389 pCreateInfo->pAttachments->format > VK_FORMAT_END_RANGE)
5390 {
5391 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5392 "vkCreateRenderPass parameter, VkFormat pCreateInfo->pAttachments->format, is an unrecognized enumerator");
5393 return false;
5394 }
5395 if(pCreateInfo->pAttachments->loadOp < VK_ATTACHMENT_LOAD_OP_BEGIN_RANGE ||
5396 pCreateInfo->pAttachments->loadOp > VK_ATTACHMENT_LOAD_OP_END_RANGE)
5397 {
5398 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5399 "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->pAttachments->loadOp, is an unrecognized enumerator");
5400 return false;
5401 }
5402 if(pCreateInfo->pAttachments->storeOp < VK_ATTACHMENT_STORE_OP_BEGIN_RANGE ||
5403 pCreateInfo->pAttachments->storeOp > VK_ATTACHMENT_STORE_OP_END_RANGE)
5404 {
5405 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5406 "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->pAttachments->storeOp, is an unrecognized enumerator");
5407 return false;
5408 }
5409 if(pCreateInfo->pAttachments->stencilLoadOp < VK_ATTACHMENT_LOAD_OP_BEGIN_RANGE ||
5410 pCreateInfo->pAttachments->stencilLoadOp > VK_ATTACHMENT_LOAD_OP_END_RANGE)
5411 {
5412 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5413 "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->pAttachments->stencilLoadOp, is an unrecognized enumerator");
5414 return false;
5415 }
5416 if(pCreateInfo->pAttachments->stencilStoreOp < VK_ATTACHMENT_STORE_OP_BEGIN_RANGE ||
5417 pCreateInfo->pAttachments->stencilStoreOp > VK_ATTACHMENT_STORE_OP_END_RANGE)
5418 {
5419 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5420 "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->pAttachments->stencilStoreOp, is an unrecognized enumerator");
5421 return false;
5422 }
5423 if (((pCreateInfo->pAttachments->initialLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
5424 (pCreateInfo->pAttachments->initialLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5425 (pCreateInfo->pAttachments->initialLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5426 {
5427 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5428 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pAttachments->initialLayout, is an unrecognized enumerator");
5429 return false;
5430 }
5431 if (((pCreateInfo->pAttachments->initialLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
5432 (pCreateInfo->pAttachments->initialLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5433 (pCreateInfo->pAttachments->initialLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5434 {
5435 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5436 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pAttachments->finalLayout, is an unrecognized enumerator");
5437 return false;
5438 }
5439 }
5440 if(pCreateInfo->pSubpasses != nullptr)
5441 {
5442 if(pCreateInfo->pSubpasses->pipelineBindPoint < VK_PIPELINE_BIND_POINT_BEGIN_RANGE ||
5443 pCreateInfo->pSubpasses->pipelineBindPoint > VK_PIPELINE_BIND_POINT_END_RANGE)
5444 {
5445 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5446 "vkCreateRenderPass parameter, VkPipelineBindPoint pCreateInfo->pSubpasses->pipelineBindPoint, is an unrecognized enumerator");
5447 return false;
5448 }
5449 if(pCreateInfo->pSubpasses->pInputAttachments != nullptr)
5450 {
5451 if (((pCreateInfo->pSubpasses->pInputAttachments->layout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
5452 (pCreateInfo->pSubpasses->pInputAttachments->layout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5453 (pCreateInfo->pSubpasses->pInputAttachments->layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5454 {
5455 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5456 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pSubpasses->pInputAttachments->layout, is an unrecognized enumerator");
5457 return false;
5458 }
5459 }
5460 if(pCreateInfo->pSubpasses->pColorAttachments != nullptr)
5461 {
5462 if (((pCreateInfo->pSubpasses->pColorAttachments->layout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
5463 (pCreateInfo->pSubpasses->pColorAttachments->layout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5464 (pCreateInfo->pSubpasses->pColorAttachments->layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5465 {
5466 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5467 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pSubpasses->pColorAttachments->layout, is an unrecognized enumerator");
5468 return false;
5469 }
5470 }
5471 if(pCreateInfo->pSubpasses->pResolveAttachments != nullptr)
5472 {
5473 if (((pCreateInfo->pSubpasses->pResolveAttachments->layout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
5474 (pCreateInfo->pSubpasses->pResolveAttachments->layout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5475 (pCreateInfo->pSubpasses->pResolveAttachments->layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5476 {
5477 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5478 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pSubpasses->pResolveAttachments->layout, is an unrecognized enumerator");
5479 return false;
5480 }
5481 }
5482 if(pCreateInfo->pSubpasses->pDepthStencilAttachment &&
5483 ((pCreateInfo->pSubpasses->pDepthStencilAttachment->layout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
5484 (pCreateInfo->pSubpasses->pDepthStencilAttachment->layout > VK_IMAGE_LAYOUT_END_RANGE)) &&
5485 (pCreateInfo->pSubpasses->pDepthStencilAttachment->layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
5486 {
5487 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5488 "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pSubpasses->pDepthStencilAttachment->layout, is an unrecognized enumerator");
5489 return false;
5490 }
5491 }
5492 if(pCreateInfo->pDependencies != nullptr)
5493 {
5494 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005495 }
5496
5497 return true;
5498}
5499
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005500bool PostCreateRenderPass(
5501 VkDevice device,
5502 VkRenderPass* pRenderPass,
5503 VkResult result)
5504{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005505
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005506 if(pRenderPass != nullptr)
5507 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005508 }
5509
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005510 if(result < VK_SUCCESS)
5511 {
5512 std::string reason = "vkCreateRenderPass parameter, VkResult result, is " + EnumeratorString(result);
5513 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 -06005514 return false;
5515 }
5516
5517 return true;
5518}
5519
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005520VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(
5521 VkDevice device,
5522 const VkRenderPassCreateInfo* pCreateInfo,
5523 const VkAllocationCallbacks* pAllocator,
5524 VkRenderPass* pRenderPass)
5525{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005526 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5527 VkBool32 skipCall = VK_FALSE;
5528 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5529 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005530
Dustin Graves1e92cd72016-02-09 14:00:18 -07005531 skipCall |= param_check_vkCreateRenderPass(
5532 my_data->report_data,
5533 pCreateInfo,
5534 pAllocator,
5535 pRenderPass);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005536
Dustin Graves1e92cd72016-02-09 14:00:18 -07005537 if (skipCall == VK_FALSE) {
5538 PreCreateRenderPass(device, pCreateInfo);
5539
5540 result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
5541
5542 PostCreateRenderPass(device, pRenderPass, result);
5543 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005544
5545 return result;
5546}
5547
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005548bool PostGetRenderAreaGranularity(
5549 VkDevice device,
5550 VkRenderPass renderPass,
5551 VkExtent2D* pGranularity)
5552{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005553
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005554
5555 if(pGranularity != nullptr)
5556 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005557 }
5558
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005559 return true;
5560}
5561
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005562VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetRenderAreaGranularity(
5563 VkDevice device,
5564 VkRenderPass renderPass,
5565 VkExtent2D* pGranularity)
5566{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005567 VkBool32 skipCall = VK_FALSE;
5568 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5569 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005570
Dustin Graves1e92cd72016-02-09 14:00:18 -07005571 skipCall |= param_check_vkGetRenderAreaGranularity(
5572 my_data->report_data,
5573 renderPass,
5574 pGranularity);
5575
5576 if (skipCall == VK_FALSE) {
5577 get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
5578
5579 PostGetRenderAreaGranularity(device, renderPass, pGranularity);
5580 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005581}
5582
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005583bool PreCreateCommandPool(
5584 VkDevice device,
5585 const VkCommandPoolCreateInfo* pCreateInfo)
5586{
5587 if(pCreateInfo != nullptr)
5588 {
5589 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO)
5590 {
5591 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5592 "vkCreateCommandPool parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
5593 return false;
5594 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005595 }
5596
5597 return true;
5598}
5599
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005600bool PostCreateCommandPool(
5601 VkDevice device,
5602 VkCommandPool* pCommandPool,
5603 VkResult result)
5604{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005605
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005606 if(pCommandPool != nullptr)
5607 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005608 }
5609
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005610 if(result < VK_SUCCESS)
5611 {
5612 std::string reason = "vkCreateCommandPool parameter, VkResult result, is " + EnumeratorString(result);
5613 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 -06005614 return false;
5615 }
5616
5617 return true;
5618}
5619
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005620VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool(
5621 VkDevice device,
5622 const VkCommandPoolCreateInfo* pCreateInfo,
5623 const VkAllocationCallbacks* pAllocator,
5624 VkCommandPool* pCommandPool)
5625{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005626 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5627 VkBool32 skipCall = VK_FALSE;
5628 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5629 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005630
Dustin Graves1e92cd72016-02-09 14:00:18 -07005631 skipCall |= param_check_vkCreateCommandPool(
5632 my_data->report_data,
5633 pCreateInfo,
5634 pAllocator,
5635 pCommandPool);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005636
Dustin Graves1e92cd72016-02-09 14:00:18 -07005637 if (skipCall == VK_FALSE) {
5638 PreCreateCommandPool(device, pCreateInfo);
5639
5640 result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
5641
5642 PostCreateCommandPool(device, pCommandPool, result);
5643 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005644
5645 return result;
5646}
5647
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005648bool PostResetCommandPool(
5649 VkDevice device,
5650 VkCommandPool commandPool,
5651 VkCommandPoolResetFlags flags,
5652 VkResult result)
5653{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005654
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005655
5656
5657 if(result < VK_SUCCESS)
5658 {
5659 std::string reason = "vkResetCommandPool parameter, VkResult result, is " + EnumeratorString(result);
5660 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 -06005661 return false;
5662 }
5663
5664 return true;
5665}
5666
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005667VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetCommandPool(
5668 VkDevice device,
5669 VkCommandPool commandPool,
5670 VkCommandPoolResetFlags flags)
5671{
5672 VkResult result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005673
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005674 PostResetCommandPool(device, commandPool, flags, result);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005675
5676 return result;
5677}
5678
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005679bool PreCreateCommandBuffer(
5680 VkDevice device,
5681 const VkCommandBufferAllocateInfo* pCreateInfo)
5682{
5683 if(pCreateInfo != nullptr)
5684 {
5685 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO)
5686 {
5687 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5688 "vkAllocateCommandBuffers parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator");
5689 return false;
5690 }
5691 if(pCreateInfo->level < VK_COMMAND_BUFFER_LEVEL_BEGIN_RANGE ||
5692 pCreateInfo->level > VK_COMMAND_BUFFER_LEVEL_END_RANGE)
5693 {
5694 log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5695 "vkAllocateCommandBuffers parameter, VkCommandBufferLevel pCreateInfo->level, is an unrecognized enumerator");
5696 return false;
5697 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005698 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005699
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005700 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005701}
5702
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005703bool PostCreateCommandBuffer(
5704 VkDevice device,
5705 VkCommandBuffer* pCommandBuffer,
5706 VkResult result)
5707{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005708
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005709 if(pCommandBuffer != nullptr)
5710 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005711 }
5712
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005713 if(result < VK_SUCCESS)
5714 {
5715 std::string reason = "vkAllocateCommandBuffers parameter, VkResult result, is " + EnumeratorString(result);
5716 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 -06005717 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005718 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005719
5720 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005721}
5722
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005723VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateCommandBuffers(
5724 VkDevice device,
Dustin Graves1e92cd72016-02-09 14:00:18 -07005725 const VkCommandBufferAllocateInfo* pAllocateInfo,
5726 VkCommandBuffer* pCommandBuffers)
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005727{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005728 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5729 VkBool32 skipCall = VK_FALSE;
5730 layer_data* my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5731 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005732
Dustin Graves1e92cd72016-02-09 14:00:18 -07005733 skipCall |= param_check_vkAllocateCommandBuffers(
5734 my_data->report_data,
5735 pAllocateInfo,
5736 pCommandBuffers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005737
Dustin Graves1e92cd72016-02-09 14:00:18 -07005738 if (skipCall == VK_FALSE) {
5739 PreCreateCommandBuffer(device, pAllocateInfo);
5740
5741 result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
5742
5743 PostCreateCommandBuffer(device, pCommandBuffers, result);
5744 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06005745
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005746 return result;
5747}
5748
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005749bool PreBeginCommandBuffer(
5750 VkCommandBuffer commandBuffer,
5751 const VkCommandBufferBeginInfo* pBeginInfo)
5752{
5753 if(pBeginInfo != nullptr)
5754 {
5755 if(pBeginInfo->sType != VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO)
5756 {
5757 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5758 "vkBeginCommandBuffer parameter, VkStructureType pBeginInfo->sType, is an invalid enumerator");
5759 return false;
5760 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06005761 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005762
5763 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005764}
5765
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005766bool PostBeginCommandBuffer(
5767 VkCommandBuffer commandBuffer,
5768 VkResult result)
5769{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005770
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005771 if(result < VK_SUCCESS)
5772 {
5773 std::string reason = "vkBeginCommandBuffer parameter, VkResult result, is " + EnumeratorString(result);
5774 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 -06005775 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005776 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005777
5778 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005779}
5780
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005781VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBeginCommandBuffer(
5782 VkCommandBuffer commandBuffer,
5783 const VkCommandBufferBeginInfo* pBeginInfo)
5784{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005785 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5786 VkBool32 skipCall = VK_FALSE;
5787 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5788 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005789
Dustin Graves1e92cd72016-02-09 14:00:18 -07005790 skipCall |= param_check_vkBeginCommandBuffer(
5791 my_data->report_data,
5792 pBeginInfo);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005793
Dustin Graves1e92cd72016-02-09 14:00:18 -07005794 if (skipCall == VK_FALSE) {
5795 PreBeginCommandBuffer(commandBuffer, pBeginInfo);
5796
5797 result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
5798
5799 PostBeginCommandBuffer(commandBuffer, result);
5800 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06005801
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005802 return result;
5803}
5804
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005805bool PostEndCommandBuffer(
5806 VkCommandBuffer commandBuffer,
5807 VkResult result)
5808{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005809
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005810 if(result < VK_SUCCESS)
5811 {
5812 std::string reason = "vkEndCommandBuffer parameter, VkResult result, is " + EnumeratorString(result);
5813 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 -06005814 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005815 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005816
5817 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005818}
5819
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005820VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer(
5821 VkCommandBuffer commandBuffer)
5822{
5823 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005824
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005825 PostEndCommandBuffer(commandBuffer, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005826
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005827 return result;
5828}
5829
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005830bool PostResetCommandBuffer(
5831 VkCommandBuffer commandBuffer,
5832 VkCommandBufferResetFlags flags,
5833 VkResult result)
5834{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005835
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005836
5837 if(result < VK_SUCCESS)
5838 {
5839 std::string reason = "vkResetCommandBuffer parameter, VkResult result, is " + EnumeratorString(result);
5840 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 -06005841 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005842 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005843
5844 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005845}
5846
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005847VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetCommandBuffer(
5848 VkCommandBuffer commandBuffer,
5849 VkCommandBufferResetFlags flags)
5850{
5851 VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005852
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005853 PostResetCommandBuffer(commandBuffer, flags, result);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005854
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005855 return result;
5856}
5857
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005858bool PostCmdBindPipeline(
5859 VkCommandBuffer commandBuffer,
5860 VkPipelineBindPoint pipelineBindPoint,
5861 VkPipeline pipeline)
5862{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005863
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005864 if(pipelineBindPoint < VK_PIPELINE_BIND_POINT_BEGIN_RANGE ||
5865 pipelineBindPoint > VK_PIPELINE_BIND_POINT_END_RANGE)
5866 {
5867 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5868 "vkCmdBindPipeline parameter, VkPipelineBindPoint pipelineBindPoint, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005869 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005870 }
5871
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005872
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005873 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06005874}
5875
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005876VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindPipeline(
5877 VkCommandBuffer commandBuffer,
5878 VkPipelineBindPoint pipelineBindPoint,
5879 VkPipeline pipeline)
5880{
5881 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005882
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005883 PostCmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005884}
5885
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005886VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport* pViewports)
5887{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005888 VkBool32 skipCall = VK_FALSE;
5889 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5890 assert(my_data != NULL);
5891
5892 skipCall |= param_check_vkCmdSetViewport(
5893 my_data->report_data,
5894 firstViewport,
5895 viewportCount,
5896 pViewports);
5897
5898 if (skipCall == VK_FALSE) {
5899 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
5900 }
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06005901}
5902
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005903VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D* pScissors)
5904{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005905 VkBool32 skipCall = VK_FALSE;
5906 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5907 assert(my_data != NULL);
5908
5909 skipCall |= param_check_vkCmdSetScissor(
5910 my_data->report_data,
5911 firstScissor,
5912 scissorCount,
5913 pScissors);
5914
5915 if (skipCall == VK_FALSE) {
5916 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
5917 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06005918}
5919
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005920VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth)
5921{
5922 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
Jeremy Hayes99a96322015-06-26 12:48:09 -06005923}
5924
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005925VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor)
5926{
5927 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005928}
5929
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005930VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4])
5931{
Dustin Graves1e92cd72016-02-09 14:00:18 -07005932 VkBool32 skipCall = VK_FALSE;
5933 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5934 assert(my_data != NULL);
5935
5936 skipCall |= param_check_vkCmdSetBlendConstants(
5937 my_data->report_data,
5938 blendConstants);
5939
5940 if (skipCall == VK_FALSE) {
5941 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
5942 }
Cody Northrop12365112015-08-17 11:10:49 -06005943}
5944
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005945VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds)
5946{
5947 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
Cody Northrop12365112015-08-17 11:10:49 -06005948}
5949
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005950VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask)
5951{
5952 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005953}
5954
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005955VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask)
5956{
5957 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005958}
5959
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005960VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference)
5961{
5962 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005963}
5964
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005965bool PreCmdBindDescriptorSets(
5966 VkCommandBuffer commandBuffer,
5967 const VkDescriptorSet* pDescriptorSets,
5968 const uint32_t* pDynamicOffsets)
5969{
5970 if(pDescriptorSets != nullptr)
5971 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06005972 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005973
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005974 if(pDynamicOffsets != nullptr)
5975 {
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06005976 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005977
5978 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005979}
5980
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005981bool PostCmdBindDescriptorSets(
5982 VkCommandBuffer commandBuffer,
5983 VkPipelineBindPoint pipelineBindPoint,
5984 VkPipelineLayout layout,
5985 uint32_t firstSet,
5986 uint32_t setCount,
5987 uint32_t dynamicOffsetCount)
5988{
Jeremy Hayes99a96322015-06-26 12:48:09 -06005989
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005990 if(pipelineBindPoint < VK_PIPELINE_BIND_POINT_BEGIN_RANGE ||
5991 pipelineBindPoint > VK_PIPELINE_BIND_POINT_END_RANGE)
5992 {
5993 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
5994 "vkCmdBindDescriptorSets parameter, VkPipelineBindPoint pipelineBindPoint, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06005995 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06005996 }
5997
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07005998
5999
6000
6001
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006002 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006003}
6004
Chia-I Wu9ab61502015-11-06 06:42:02 +08006005VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorSets(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006006 VkCommandBuffer commandBuffer,
6007 VkPipelineBindPoint pipelineBindPoint,
6008 VkPipelineLayout layout,
6009 uint32_t firstSet,
Dustin Graves1e92cd72016-02-09 14:00:18 -07006010 uint32_t descriptorSetCount,
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006011 const VkDescriptorSet* pDescriptorSets,
6012 uint32_t dynamicOffsetCount,
6013 const uint32_t* pDynamicOffsets)
6014{
Dustin Graves1e92cd72016-02-09 14:00:18 -07006015 VkBool32 skipCall = VK_FALSE;
6016 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
6017 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006018
Dustin Graves1e92cd72016-02-09 14:00:18 -07006019 skipCall |= param_check_vkCmdBindDescriptorSets(
6020 my_data->report_data,
6021 pipelineBindPoint,
6022 layout,
6023 firstSet,
6024 descriptorSetCount,
6025 pDescriptorSets,
6026 dynamicOffsetCount,
6027 pDynamicOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006028
Dustin Graves1e92cd72016-02-09 14:00:18 -07006029 if (skipCall == VK_FALSE) {
6030 PreCmdBindDescriptorSets(commandBuffer, pDescriptorSets, pDynamicOffsets);
6031
6032 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
6033
6034 PostCmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, dynamicOffsetCount);
6035 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06006036}
6037
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006038bool PostCmdBindIndexBuffer(
6039 VkCommandBuffer commandBuffer,
6040 VkBuffer buffer,
6041 VkDeviceSize offset,
6042 VkIndexType indexType)
6043{
Jeremy Hayes99a96322015-06-26 12:48:09 -06006044
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006045
6046
6047 if(indexType < VK_INDEX_TYPE_BEGIN_RANGE ||
6048 indexType > VK_INDEX_TYPE_END_RANGE)
6049 {
6050 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6051 "vkCmdBindIndexBuffer parameter, VkIndexType indexType, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006052 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006053 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006054
6055 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006056}
6057
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006058VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindIndexBuffer(
6059 VkCommandBuffer commandBuffer,
6060 VkBuffer buffer,
6061 VkDeviceSize offset,
6062 VkIndexType indexType)
6063{
6064 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006065
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006066 PostCmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006067}
6068
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006069bool PreCmdBindVertexBuffers(
6070 VkCommandBuffer commandBuffer,
6071 const VkBuffer* pBuffers,
6072 const VkDeviceSize* pOffsets)
6073{
6074 if(pBuffers != nullptr)
6075 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06006076 }
6077
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006078 if(pOffsets != nullptr)
6079 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06006080 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006081
6082 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006083}
6084
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006085bool PostCmdBindVertexBuffers(
6086 VkCommandBuffer commandBuffer,
6087 uint32_t firstBinding,
6088 uint32_t bindingCount)
6089{
6090
6091
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006092
6093 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006094}
6095
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006096VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers(
6097 VkCommandBuffer commandBuffer,
6098 uint32_t firstBinding,
6099 uint32_t bindingCount,
6100 const VkBuffer* pBuffers,
6101 const VkDeviceSize* pOffsets)
6102{
Dustin Graves1e92cd72016-02-09 14:00:18 -07006103 VkBool32 skipCall = VK_FALSE;
6104 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
6105 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006106
Dustin Graves1e92cd72016-02-09 14:00:18 -07006107 skipCall |= param_check_vkCmdBindVertexBuffers(
6108 my_data->report_data,
6109 firstBinding,
6110 bindingCount,
6111 pBuffers,
6112 pOffsets);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006113
Dustin Graves1e92cd72016-02-09 14:00:18 -07006114 if (skipCall == VK_FALSE) {
6115 PreCmdBindVertexBuffers(commandBuffer, pBuffers, pOffsets);
6116
6117 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
6118
6119 PostCmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount);
6120 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006121}
6122
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006123bool PreCmdDraw(
6124 VkCommandBuffer commandBuffer,
6125 uint32_t vertexCount,
6126 uint32_t instanceCount,
6127 uint32_t firstVertex,
6128 uint32_t firstInstance)
6129{
Michael Lentine55a913f2015-11-24 09:48:23 -06006130 if (vertexCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006131 // 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 -07006132 // this an error or leave as is.
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006133 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006134 "vkCmdDraw parameter, uint32_t vertexCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06006135 return false;
6136 }
6137
6138 if (instanceCount == 0) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006139 // 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 -07006140 // this an error or leave as is.
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006141 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006142 "vkCmdDraw parameter, uint32_t instanceCount, is 0");
Michael Lentine55a913f2015-11-24 09:48:23 -06006143 return false;
6144 }
6145
6146 return true;
6147}
6148
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006149bool PostCmdDraw(
6150 VkCommandBuffer commandBuffer,
6151 uint32_t firstVertex,
6152 uint32_t vertexCount,
6153 uint32_t firstInstance,
6154 uint32_t instanceCount)
6155{
6156
6157
6158
6159
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006160
6161 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006162}
6163
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006164VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDraw(
6165 VkCommandBuffer commandBuffer,
6166 uint32_t vertexCount,
6167 uint32_t instanceCount,
6168 uint32_t firstVertex,
6169 uint32_t firstInstance)
6170{
6171 PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Michael Lentine55a913f2015-11-24 09:48:23 -06006172
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006173 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006174
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006175 PostCmdDraw(commandBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006176}
6177
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006178bool PostCmdDrawIndexed(
6179 VkCommandBuffer commandBuffer,
6180 uint32_t firstIndex,
6181 uint32_t indexCount,
6182 int32_t vertexOffset,
6183 uint32_t firstInstance,
6184 uint32_t instanceCount)
6185{
6186
6187
6188
6189
6190
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006191
6192 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006193}
6194
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006195VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexed(
6196 VkCommandBuffer commandBuffer,
6197 uint32_t indexCount,
6198 uint32_t instanceCount,
6199 uint32_t firstIndex,
6200 int32_t vertexOffset,
6201 uint32_t firstInstance)
6202{
6203 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006204
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006205 PostCmdDrawIndexed(commandBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006206}
6207
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006208bool PostCmdDrawIndirect(
6209 VkCommandBuffer commandBuffer,
6210 VkBuffer buffer,
6211 VkDeviceSize offset,
6212 uint32_t count,
6213 uint32_t stride)
6214{
6215
6216
6217
6218
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006219
6220 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006221}
6222
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006223VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirect(
6224 VkCommandBuffer commandBuffer,
6225 VkBuffer buffer,
6226 VkDeviceSize offset,
6227 uint32_t count,
6228 uint32_t stride)
6229{
6230 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006231
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006232 PostCmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006233}
6234
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006235bool PostCmdDrawIndexedIndirect(
6236 VkCommandBuffer commandBuffer,
6237 VkBuffer buffer,
6238 VkDeviceSize offset,
6239 uint32_t count,
6240 uint32_t stride)
6241{
6242
6243
6244
6245
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006246
6247 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006248}
6249
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006250VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirect(
6251 VkCommandBuffer commandBuffer,
6252 VkBuffer buffer,
6253 VkDeviceSize offset,
6254 uint32_t count,
6255 uint32_t stride)
6256{
6257 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006258
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006259 PostCmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006260}
6261
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006262bool PostCmdDispatch(
6263 VkCommandBuffer commandBuffer,
6264 uint32_t x,
6265 uint32_t y,
6266 uint32_t z)
6267{
6268
6269
6270
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006271
6272 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006273}
6274
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006275VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDispatch(
6276 VkCommandBuffer commandBuffer,
6277 uint32_t x,
6278 uint32_t y,
6279 uint32_t z)
6280{
6281 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006282
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006283 PostCmdDispatch(commandBuffer, x, y, z);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006284}
6285
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006286bool PostCmdDispatchIndirect(
6287 VkCommandBuffer commandBuffer,
6288 VkBuffer buffer,
6289 VkDeviceSize offset)
6290{
6291
6292
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006293
6294 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006295}
6296
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006297VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDispatchIndirect(
6298 VkCommandBuffer commandBuffer,
6299 VkBuffer buffer,
6300 VkDeviceSize offset)
6301{
6302 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006303
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006304 PostCmdDispatchIndirect(commandBuffer, buffer, offset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06006305}
6306
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006307bool PreCmdCopyBuffer(
6308 VkCommandBuffer commandBuffer,
6309 const VkBufferCopy* pRegions)
6310{
6311 if(pRegions != nullptr)
6312 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06006313 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006314
6315 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006316}
6317
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006318bool PostCmdCopyBuffer(
6319 VkCommandBuffer commandBuffer,
6320 VkBuffer srcBuffer,
6321 VkBuffer dstBuffer,
6322 uint32_t regionCount)
6323{
6324
6325
6326
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006327
6328 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006329}
6330
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006331VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer(
6332 VkCommandBuffer commandBuffer,
6333 VkBuffer srcBuffer,
6334 VkBuffer dstBuffer,
6335 uint32_t regionCount,
6336 const VkBufferCopy* pRegions)
6337{
Dustin Graves1e92cd72016-02-09 14:00:18 -07006338 VkBool32 skipCall = VK_FALSE;
6339 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
6340 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006341
Dustin Graves1e92cd72016-02-09 14:00:18 -07006342 skipCall |= param_check_vkCmdCopyBuffer(
6343 my_data->report_data,
6344 srcBuffer,
6345 dstBuffer,
6346 regionCount,
6347 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006348
Dustin Graves1e92cd72016-02-09 14:00:18 -07006349 if (skipCall == VK_FALSE) {
6350 PreCmdCopyBuffer(commandBuffer, pRegions);
6351
6352 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
6353
6354 PostCmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount);
6355 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06006356}
6357
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006358bool PreCmdCopyImage(
6359 VkCommandBuffer commandBuffer,
6360 const VkImageCopy* pRegions)
6361{
6362 if(pRegions != nullptr)
6363 {
6364 if ((pRegions->srcSubresource.aspectMask &
6365 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
6366 {
6367 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6368 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
6369 return false;
6370 }
6371 if ((pRegions->dstSubresource.aspectMask &
6372 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
6373 {
6374 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6375 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
6376 return false;
6377 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006378 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006379
6380 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006381}
6382
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006383bool PostCmdCopyImage(
6384 VkCommandBuffer commandBuffer,
6385 VkImage srcImage,
6386 VkImageLayout srcImageLayout,
6387 VkImage dstImage,
6388 VkImageLayout dstImageLayout,
6389 uint32_t regionCount)
6390{
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006391 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006392 (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6393 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6394 {
6395 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6396 "vkCmdCopyImage parameter, VkImageLayout srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006397 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006398 }
6399
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006400
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006401 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006402 (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6403 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6404 {
6405 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6406 "vkCmdCopyImage parameter, VkImageLayout dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006407 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006408 }
6409
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006410
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006411 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006412}
6413
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006414VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImage(
6415 VkCommandBuffer commandBuffer,
6416 VkImage srcImage,
6417 VkImageLayout srcImageLayout,
6418 VkImage dstImage,
6419 VkImageLayout dstImageLayout,
6420 uint32_t regionCount,
6421 const VkImageCopy* pRegions)
6422{
Dustin Graves1e92cd72016-02-09 14:00:18 -07006423 VkBool32 skipCall = VK_FALSE;
6424 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
6425 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006426
Dustin Graves1e92cd72016-02-09 14:00:18 -07006427 skipCall |= param_check_vkCmdCopyImage(
6428 my_data->report_data,
6429 srcImage,
6430 srcImageLayout,
6431 dstImage,
6432 dstImageLayout,
6433 regionCount,
6434 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006435
Dustin Graves1e92cd72016-02-09 14:00:18 -07006436 if (skipCall == VK_FALSE) {
6437 PreCmdCopyImage(commandBuffer, pRegions);
6438
6439 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
6440
6441 PostCmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount);
6442 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06006443}
6444
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006445bool PreCmdBlitImage(
6446 VkCommandBuffer commandBuffer,
6447 const VkImageBlit* pRegions)
6448{
6449 if(pRegions != nullptr)
6450 {
6451 if ((pRegions->srcSubresource.aspectMask &
6452 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
6453 {
6454 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6455 "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
6456 return false;
6457 }
6458 if ((pRegions->dstSubresource.aspectMask &
6459 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
6460 {
6461 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6462 "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
6463 return false;
6464 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006465 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006466
6467 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006468}
6469
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006470bool PostCmdBlitImage(
6471 VkCommandBuffer commandBuffer,
6472 VkImage srcImage,
6473 VkImageLayout srcImageLayout,
6474 VkImage dstImage,
6475 VkImageLayout dstImageLayout,
6476 uint32_t regionCount,
6477 VkFilter filter)
6478{
6479
Jeremy Hayes99a96322015-06-26 12:48:09 -06006480
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006481 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006482 (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6483 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6484 {
6485 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6486 "vkCmdBlitImage parameter, VkImageLayout srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006487 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006488 }
6489
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006490
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006491 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006492 (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6493 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6494 {
6495 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6496 "vkCmdBlitImage parameter, VkImageLayout dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006497 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006498 }
6499
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006500
6501 if(filter < VK_FILTER_BEGIN_RANGE ||
6502 filter > VK_FILTER_END_RANGE)
6503 {
6504 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6505 "vkCmdBlitImage parameter, VkFilter filter, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006506 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006507 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006508
6509 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006510}
6511
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006512VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBlitImage(
6513 VkCommandBuffer commandBuffer,
6514 VkImage srcImage,
6515 VkImageLayout srcImageLayout,
6516 VkImage dstImage,
6517 VkImageLayout dstImageLayout,
6518 uint32_t regionCount,
6519 const VkImageBlit* pRegions,
6520 VkFilter filter)
6521{
Dustin Graves1e92cd72016-02-09 14:00:18 -07006522 VkBool32 skipCall = VK_FALSE;
6523 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
6524 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006525
Dustin Graves1e92cd72016-02-09 14:00:18 -07006526 skipCall |= param_check_vkCmdBlitImage(
6527 my_data->report_data,
6528 srcImage,
6529 srcImageLayout,
6530 dstImage,
6531 dstImageLayout,
6532 regionCount,
6533 pRegions,
6534 filter);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006535
Dustin Graves1e92cd72016-02-09 14:00:18 -07006536 if (skipCall == VK_FALSE) {
6537 PreCmdBlitImage(commandBuffer, pRegions);
6538
6539 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
6540
6541 PostCmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, filter);
6542 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06006543}
6544
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006545bool PreCmdCopyBufferToImage(
6546 VkCommandBuffer commandBuffer,
6547 const VkBufferImageCopy* pRegions)
6548{
6549 if(pRegions != nullptr)
6550 {
6551 if ((pRegions->imageSubresource.aspectMask &
6552 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
6553 {
6554 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6555 "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized enumerator");
6556 return false;
6557 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006558 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006559
6560 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006561}
6562
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006563bool PostCmdCopyBufferToImage(
6564 VkCommandBuffer commandBuffer,
6565 VkBuffer srcBuffer,
6566 VkImage dstImage,
6567 VkImageLayout dstImageLayout,
6568 uint32_t regionCount)
6569{
6570
6571
Jeremy Hayes99a96322015-06-26 12:48:09 -06006572
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006573 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006574 (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6575 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6576 {
6577 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6578 "vkCmdCopyBufferToImage parameter, VkImageLayout dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006579 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006580 }
6581
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006582
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006583 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006584}
6585
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006586VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage(
6587 VkCommandBuffer commandBuffer,
6588 VkBuffer srcBuffer,
6589 VkImage dstImage,
6590 VkImageLayout dstImageLayout,
6591 uint32_t regionCount,
6592 const VkBufferImageCopy* pRegions)
6593{
Dustin Graves1e92cd72016-02-09 14:00:18 -07006594 VkBool32 skipCall = VK_FALSE;
6595 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
6596 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006597
Dustin Graves1e92cd72016-02-09 14:00:18 -07006598 skipCall |= param_check_vkCmdCopyBufferToImage(
6599 my_data->report_data,
6600 srcBuffer,
6601 dstImage,
6602 dstImageLayout,
6603 regionCount,
6604 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006605
Dustin Graves1e92cd72016-02-09 14:00:18 -07006606 if (skipCall == VK_FALSE) {
6607 PreCmdCopyBufferToImage(commandBuffer, pRegions);
6608
6609 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
6610
6611 PostCmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount);
6612 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06006613}
6614
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006615bool PreCmdCopyImageToBuffer(
6616 VkCommandBuffer commandBuffer,
6617 const VkBufferImageCopy* pRegions)
6618{
6619 if(pRegions != nullptr)
6620 {
6621 if ((pRegions->imageSubresource.aspectMask &
6622 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
6623 {
6624 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6625 "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized enumerator");
6626 return false;
6627 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006628 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006629
6630 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006631}
6632
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006633bool PostCmdCopyImageToBuffer(
6634 VkCommandBuffer commandBuffer,
6635 VkImage srcImage,
6636 VkImageLayout srcImageLayout,
6637 VkBuffer dstBuffer,
6638 uint32_t regionCount)
6639{
6640
Jeremy Hayes99a96322015-06-26 12:48:09 -06006641
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006642 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006643 (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6644 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6645 {
6646 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6647 "vkCmdCopyImageToBuffer parameter, VkImageLayout srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006648 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006649 }
6650
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006651
6652
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006653 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006654}
6655
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006656VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer(
6657 VkCommandBuffer commandBuffer,
6658 VkImage srcImage,
6659 VkImageLayout srcImageLayout,
6660 VkBuffer dstBuffer,
6661 uint32_t regionCount,
6662 const VkBufferImageCopy* pRegions)
6663{
Dustin Graves1e92cd72016-02-09 14:00:18 -07006664 VkBool32 skipCall = VK_FALSE;
6665 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
6666 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006667
Dustin Graves1e92cd72016-02-09 14:00:18 -07006668 skipCall |= param_check_vkCmdCopyImageToBuffer(
6669 my_data->report_data,
6670 srcImage,
6671 srcImageLayout,
6672 dstBuffer,
6673 regionCount,
6674 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006675
Dustin Graves1e92cd72016-02-09 14:00:18 -07006676 if (skipCall == VK_FALSE) {
6677 PreCmdCopyImageToBuffer(commandBuffer, pRegions);
6678
6679 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
6680
6681 PostCmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount);
6682 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06006683}
6684
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006685bool PreCmdUpdateBuffer(
6686 VkCommandBuffer commandBuffer,
6687 const uint32_t* pData)
6688{
6689 if(pData != nullptr)
6690 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06006691 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006692
6693 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006694}
6695
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006696bool PostCmdUpdateBuffer(
6697 VkCommandBuffer commandBuffer,
6698 VkBuffer dstBuffer,
6699 VkDeviceSize dstOffset,
6700 VkDeviceSize dataSize)
6701{
6702
6703
6704
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006705
6706 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006707}
6708
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006709VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer(
6710 VkCommandBuffer commandBuffer,
6711 VkBuffer dstBuffer,
6712 VkDeviceSize dstOffset,
6713 VkDeviceSize dataSize,
6714 const uint32_t* pData)
6715{
Dustin Graves1e92cd72016-02-09 14:00:18 -07006716 VkBool32 skipCall = VK_FALSE;
6717 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
6718 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006719
Dustin Graves1e92cd72016-02-09 14:00:18 -07006720 skipCall |= param_check_vkCmdUpdateBuffer(
6721 my_data->report_data,
6722 dstBuffer,
6723 dstOffset,
6724 dataSize,
6725 pData);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006726
Dustin Graves1e92cd72016-02-09 14:00:18 -07006727 if (skipCall == VK_FALSE) {
6728 PreCmdUpdateBuffer(commandBuffer, pData);
6729
6730 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
6731
6732 PostCmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize);
6733 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06006734}
6735
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006736bool PostCmdFillBuffer(
6737 VkCommandBuffer commandBuffer,
6738 VkBuffer dstBuffer,
6739 VkDeviceSize dstOffset,
6740 VkDeviceSize size,
6741 uint32_t data)
6742{
6743
6744
6745
6746
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006747
6748 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006749}
6750
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006751VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdFillBuffer(
6752 VkCommandBuffer commandBuffer,
6753 VkBuffer dstBuffer,
6754 VkDeviceSize dstOffset,
6755 VkDeviceSize size,
6756 uint32_t data)
6757{
6758 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006759
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006760 PostCmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006761}
6762
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006763bool PreCmdClearColorImage(
6764 VkCommandBuffer commandBuffer,
6765 const VkClearColorValue* pColor,
6766 const VkImageSubresourceRange* pRanges)
6767{
6768 if(pColor != nullptr)
6769 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06006770 }
6771
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006772 if(pRanges != nullptr)
6773 {
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -06006774 /* TODO: How should we validate pRanges->aspectMask */
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006775 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006776
6777 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006778}
6779
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006780bool PostCmdClearColorImage(
6781 VkCommandBuffer commandBuffer,
6782 VkImage image,
6783 VkImageLayout imageLayout,
6784 uint32_t rangeCount)
6785{
6786
Jeremy Hayes99a96322015-06-26 12:48:09 -06006787
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006788 if (((imageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006789 (imageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6790 (imageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6791 {
6792 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6793 "vkCmdClearColorImage parameter, VkImageLayout imageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006794 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006795 }
6796
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006797
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006798 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006799}
6800
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006801VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(
6802 VkCommandBuffer commandBuffer,
6803 VkImage image,
6804 VkImageLayout imageLayout,
6805 const VkClearColorValue* pColor,
6806 uint32_t rangeCount,
6807 const VkImageSubresourceRange* pRanges)
6808{
Dustin Graves1e92cd72016-02-09 14:00:18 -07006809 VkBool32 skipCall = VK_FALSE;
6810 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
6811 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006812
Dustin Graves1e92cd72016-02-09 14:00:18 -07006813 skipCall |= param_check_vkCmdClearColorImage(
6814 my_data->report_data,
6815 image,
6816 imageLayout,
6817 pColor,
6818 rangeCount,
6819 pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006820
Dustin Graves1e92cd72016-02-09 14:00:18 -07006821 if (skipCall == VK_FALSE) {
6822 PreCmdClearColorImage(commandBuffer, pColor, pRanges);
6823
6824 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
6825
6826 PostCmdClearColorImage(commandBuffer, image, imageLayout, rangeCount);
6827 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06006828}
6829
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006830bool PreCmdClearDepthStencilImage(
6831 VkCommandBuffer commandBuffer,
6832 const VkImageSubresourceRange* pRanges)
6833{
6834 if(pRanges != nullptr)
6835 {
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -06006836 /*
6837 * TODO: How do we validation pRanges->aspectMask?
6838 * Allows values are: VK_IMAGE_ASPECT_DEPTH_BIT and
6839 * VK_IMAGE_ASPECT_STENCIL_BIT.
6840 */
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006841 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006842
6843 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006844}
6845
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006846bool PostCmdClearDepthStencilImage(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006847 VkCommandBuffer commandBuffer,
6848 VkImage image,
6849 VkImageLayout imageLayout,
6850 const VkClearDepthStencilValue* pDepthStencil,
6851 uint32_t rangeCount)
6852{
6853
Jeremy Hayes99a96322015-06-26 12:48:09 -06006854
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006855 if (((imageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006856 (imageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6857 (imageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6858 {
6859 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6860 "vkCmdClearDepthStencilImage parameter, VkImageLayout imageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006861 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006862 }
6863
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006864
6865
6866
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006867 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006868}
6869
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006870VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearDepthStencilImage(
6871 VkCommandBuffer commandBuffer,
6872 VkImage image,
6873 VkImageLayout imageLayout,
6874 const VkClearDepthStencilValue* pDepthStencil,
6875 uint32_t rangeCount,
6876 const VkImageSubresourceRange* pRanges)
6877{
Dustin Graves1e92cd72016-02-09 14:00:18 -07006878 VkBool32 skipCall = VK_FALSE;
6879 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
6880 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006881
Dustin Graves1e92cd72016-02-09 14:00:18 -07006882 skipCall |= param_check_vkCmdClearDepthStencilImage(
6883 my_data->report_data,
6884 image,
6885 imageLayout,
6886 pDepthStencil,
6887 rangeCount,
6888 pRanges);
Jeremy Hayes99a96322015-06-26 12:48:09 -06006889
Dustin Graves1e92cd72016-02-09 14:00:18 -07006890 if (skipCall == VK_FALSE) {
6891 PreCmdClearDepthStencilImage(commandBuffer, pRanges);
6892
6893 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
6894
6895 PostCmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount);
6896 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06006897}
6898
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006899bool PreCmdClearAttachments(
6900 VkCommandBuffer commandBuffer,
6901 const VkClearColorValue* pColor,
6902 const VkClearRect* pRects)
6903{
6904 if(pColor != nullptr)
6905 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006906 }
6907
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006908 if(pRects != nullptr)
6909 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006910 }
6911
6912 return true;
6913}
6914
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006915VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearAttachments(
6916 VkCommandBuffer commandBuffer,
6917 uint32_t attachmentCount,
6918 const VkClearAttachment* pAttachments,
6919 uint32_t rectCount,
6920 const VkClearRect* pRects)
6921{
Dustin Graves1e92cd72016-02-09 14:00:18 -07006922 VkBool32 skipCall = VK_FALSE;
6923 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
6924 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006925
Dustin Graves1e92cd72016-02-09 14:00:18 -07006926 skipCall |= param_check_vkCmdClearAttachments(
6927 my_data->report_data,
6928 attachmentCount,
6929 pAttachments,
6930 rectCount,
6931 pRects);
6932
6933 if (skipCall == VK_FALSE) {
6934 for (uint32_t i = 0; i < attachmentCount; i++) {
6935 PreCmdClearAttachments(commandBuffer, &pAttachments[i].clearValue.color, pRects);
6936 }
6937
6938 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
6939 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006940}
6941
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006942bool PreCmdResolveImage(
6943 VkCommandBuffer commandBuffer,
6944 const VkImageResolve* pRegions)
6945{
6946 if(pRegions != nullptr)
6947 {
6948 if ((pRegions->srcSubresource.aspectMask &
6949 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
6950 {
6951 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6952 "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
6953 return false;
6954 }
6955 if ((pRegions->dstSubresource.aspectMask &
6956 (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0)
6957 {
6958 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6959 "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
6960 return false;
6961 }
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06006962 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006963
6964 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006965}
6966
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006967bool PostCmdResolveImage(
6968 VkCommandBuffer commandBuffer,
6969 VkImage srcImage,
6970 VkImageLayout srcImageLayout,
6971 VkImage dstImage,
6972 VkImageLayout dstImageLayout,
6973 uint32_t regionCount)
6974{
6975
Jeremy Hayes99a96322015-06-26 12:48:09 -06006976
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006977 if (((srcImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006978 (srcImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6979 (srcImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6980 {
6981 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6982 "vkCmdResolveImage parameter, VkImageLayout srcImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006983 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006984 }
6985
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006986
Mark Lobodzinskibbe08ca2016-01-11 09:46:09 -07006987 if (((dstImageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE) ||
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006988 (dstImageLayout > VK_IMAGE_LAYOUT_END_RANGE)) &&
6989 (dstImageLayout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR))
6990 {
6991 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
6992 "vkCmdResolveImage parameter, VkImageLayout dstImageLayout, is an unrecognized enumerator");
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006993 return false;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006994 }
6995
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07006996
Jeremy Hayes359eeb92015-07-09 17:11:25 -06006997 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06006998}
6999
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007000VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdResolveImage(
7001 VkCommandBuffer commandBuffer,
7002 VkImage srcImage,
7003 VkImageLayout srcImageLayout,
7004 VkImage dstImage,
7005 VkImageLayout dstImageLayout,
7006 uint32_t regionCount,
7007 const VkImageResolve* pRegions)
7008{
Dustin Graves1e92cd72016-02-09 14:00:18 -07007009 VkBool32 skipCall = VK_FALSE;
7010 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
7011 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007012
Dustin Graves1e92cd72016-02-09 14:00:18 -07007013 skipCall |= param_check_vkCmdResolveImage(
7014 my_data->report_data,
7015 srcImage,
7016 srcImageLayout,
7017 dstImage,
7018 dstImageLayout,
7019 regionCount,
7020 pRegions);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007021
Dustin Graves1e92cd72016-02-09 14:00:18 -07007022 if (skipCall == VK_FALSE) {
7023 PreCmdResolveImage(commandBuffer, pRegions);
7024
7025 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
7026
7027 PostCmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount);
7028 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06007029}
7030
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007031bool PostCmdSetEvent(
7032 VkCommandBuffer commandBuffer,
7033 VkEvent event,
7034 VkPipelineStageFlags stageMask)
7035{
7036
7037
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007038
7039 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007040}
7041
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007042VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetEvent(
7043 VkCommandBuffer commandBuffer,
7044 VkEvent event,
7045 VkPipelineStageFlags stageMask)
7046{
7047 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007048
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007049 PostCmdSetEvent(commandBuffer, event, stageMask);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007050}
7051
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007052bool PostCmdResetEvent(
7053 VkCommandBuffer commandBuffer,
7054 VkEvent event,
7055 VkPipelineStageFlags stageMask)
7056{
7057
7058
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007059
7060 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007061}
7062
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007063VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdResetEvent(
7064 VkCommandBuffer commandBuffer,
7065 VkEvent event,
7066 VkPipelineStageFlags stageMask)
7067{
7068 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007069
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007070 PostCmdResetEvent(commandBuffer, event, stageMask);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007071}
7072
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007073bool PreCmdWaitEvents(
7074 VkCommandBuffer commandBuffer,
7075 const VkEvent* pEvents,
7076 uint32_t memoryBarrierCount,
7077 const VkMemoryBarrier *pMemoryBarriers,
7078 uint32_t bufferMemoryBarrierCount,
7079 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
7080 uint32_t imageMemoryBarrierCount,
7081 const VkImageMemoryBarrier *pImageMemoryBarriers)
7082{
7083 if(pEvents != nullptr)
7084 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06007085 }
7086
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007087 if(pMemoryBarriers != nullptr)
7088 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06007089 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007090
7091 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007092}
7093
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007094bool PostCmdWaitEvents(
7095 VkCommandBuffer commandBuffer,
7096 uint32_t eventCount,
7097 VkPipelineStageFlags srcStageMask,
7098 VkPipelineStageFlags dstStageMask,
7099 uint32_t memoryBarrierCount)
7100{
7101
7102
7103
7104
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007105
7106 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007107}
7108
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007109VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWaitEvents(
7110 VkCommandBuffer commandBuffer,
7111 uint32_t eventCount,
7112 const VkEvent *pEvents,
7113 VkPipelineStageFlags srcStageMask,
7114 VkPipelineStageFlags dstStageMask,
7115 uint32_t memoryBarrierCount,
7116 const VkMemoryBarrier *pMemoryBarriers,
7117 uint32_t bufferMemoryBarrierCount,
7118 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
7119 uint32_t imageMemoryBarrierCount,
7120 const VkImageMemoryBarrier *pImageMemoryBarriers)
7121{
Dustin Graves1e92cd72016-02-09 14:00:18 -07007122 VkBool32 skipCall = VK_FALSE;
7123 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
7124 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007125
Dustin Graves1e92cd72016-02-09 14:00:18 -07007126 skipCall |= param_check_vkCmdWaitEvents(
7127 my_data->report_data,
7128 eventCount,
7129 pEvents,
7130 srcStageMask,
7131 dstStageMask,
7132 memoryBarrierCount,
7133 pMemoryBarriers,
7134 bufferMemoryBarrierCount,
7135 pBufferMemoryBarriers,
7136 imageMemoryBarrierCount,
7137 pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007138
Dustin Graves1e92cd72016-02-09 14:00:18 -07007139 if (skipCall == VK_FALSE) {
7140 PreCmdWaitEvents(commandBuffer, pEvents, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
7141
7142 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
7143
7144 PostCmdWaitEvents(commandBuffer, eventCount, srcStageMask, dstStageMask, memoryBarrierCount);
7145 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06007146}
7147
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007148bool PreCmdPipelineBarrier(
7149 VkCommandBuffer commandBuffer,
7150 uint32_t memoryBarrierCount,
7151 const VkMemoryBarrier *pMemoryBarriers,
7152 uint32_t bufferMemoryBarrierCount,
7153 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
7154 uint32_t imageMemoryBarrierCount,
7155 const VkImageMemoryBarrier *pImageMemoryBarriers)
7156{
7157 if(pMemoryBarriers != nullptr)
7158 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06007159 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007160
7161 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007162}
7163
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007164bool PostCmdPipelineBarrier(
7165 VkCommandBuffer commandBuffer,
7166 VkPipelineStageFlags srcStageMask,
7167 VkPipelineStageFlags dstStageMask,
7168 VkDependencyFlags dependencyFlags,
7169 uint32_t memoryBarrierCount)
7170{
7171
7172
7173
7174
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007175
7176 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007177}
7178
Chia-I Wu9ab61502015-11-06 06:42:02 +08007179VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPipelineBarrier(
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007180 VkCommandBuffer commandBuffer,
7181 VkPipelineStageFlags srcStageMask,
7182 VkPipelineStageFlags dstStageMask,
7183 VkDependencyFlags dependencyFlags,
7184 uint32_t memoryBarrierCount,
7185 const VkMemoryBarrier *pMemoryBarriers,
7186 uint32_t bufferMemoryBarrierCount,
Jon Ashburnf19916e2016-01-11 13:12:43 -07007187 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007188 uint32_t imageMemoryBarrierCount,
7189 const VkImageMemoryBarrier *pImageMemoryBarriers)
7190{
Dustin Graves1e92cd72016-02-09 14:00:18 -07007191 VkBool32 skipCall = VK_FALSE;
7192 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
7193 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007194
Dustin Graves1e92cd72016-02-09 14:00:18 -07007195 skipCall |= param_check_vkCmdPipelineBarrier(
7196 my_data->report_data,
7197 srcStageMask,
7198 dstStageMask,
7199 dependencyFlags,
7200 memoryBarrierCount,
7201 pMemoryBarriers,
7202 bufferMemoryBarrierCount,
7203 pBufferMemoryBarriers,
7204 imageMemoryBarrierCount,
7205 pImageMemoryBarriers);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007206
Dustin Graves1e92cd72016-02-09 14:00:18 -07007207 if (skipCall == VK_FALSE) {
7208 PreCmdPipelineBarrier(commandBuffer, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
7209
7210 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
7211
7212 PostCmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount);
7213 }
Jeremy Hayes99a96322015-06-26 12:48:09 -06007214}
7215
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007216bool PostCmdBeginQuery(
7217 VkCommandBuffer commandBuffer,
7218 VkQueryPool queryPool,
7219 uint32_t slot,
7220 VkQueryControlFlags flags)
7221{
7222
7223
7224
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007225
7226 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007227}
7228
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007229VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBeginQuery(
7230 VkCommandBuffer commandBuffer,
7231 VkQueryPool queryPool,
7232 uint32_t slot,
7233 VkQueryControlFlags flags)
7234{
7235 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007236
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007237 PostCmdBeginQuery(commandBuffer, queryPool, slot, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007238}
7239
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007240bool PostCmdEndQuery(
7241 VkCommandBuffer commandBuffer,
7242 VkQueryPool queryPool,
7243 uint32_t slot)
7244{
7245
7246
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007247
7248 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007249}
7250
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007251VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndQuery(
7252 VkCommandBuffer commandBuffer,
7253 VkQueryPool queryPool,
7254 uint32_t slot)
7255{
7256 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007257
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007258 PostCmdEndQuery(commandBuffer, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007259}
7260
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007261bool PostCmdResetQueryPool(
7262 VkCommandBuffer commandBuffer,
7263 VkQueryPool queryPool,
7264 uint32_t firstQuery,
7265 uint32_t queryCount)
7266{
7267
7268
7269
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007270
7271 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007272}
7273
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007274VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdResetQueryPool(
7275 VkCommandBuffer commandBuffer,
7276 VkQueryPool queryPool,
7277 uint32_t firstQuery,
7278 uint32_t queryCount)
7279{
7280 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007281
Jon Ashburn19d3bf12015-12-30 14:06:55 -07007282 PostCmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007283}
7284
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007285bool PostCmdWriteTimestamp(
7286 VkCommandBuffer commandBuffer,
7287 VkPipelineStageFlagBits pipelineStage,
7288 VkQueryPool queryPool,
7289 uint32_t slot)
7290{
Jeremy Hayes99a96322015-06-26 12:48:09 -06007291
Chia-I Wu51ce5ea2015-10-26 19:40:27 +08007292 ValidateEnumerator(pipelineStage);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007293
7294 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007295}
7296
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007297VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp(
7298 VkCommandBuffer commandBuffer,
7299 VkPipelineStageFlagBits pipelineStage,
7300 VkQueryPool queryPool,
7301 uint32_t slot)
7302{
7303 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007304
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007305 PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, slot);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007306}
7307
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007308bool PostCmdCopyQueryPoolResults(
7309 VkCommandBuffer commandBuffer,
7310 VkQueryPool queryPool,
7311 uint32_t firstQuery,
7312 uint32_t queryCount,
7313 VkBuffer dstBuffer,
7314 VkDeviceSize dstOffset,
7315 VkDeviceSize stride,
7316 VkQueryResultFlags flags)
7317{
7318
7319
7320
7321
7322
7323
7324
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007325
7326 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06007327}
7328
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007329VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyQueryPoolResults(
7330 VkCommandBuffer commandBuffer,
7331 VkQueryPool queryPool,
7332 uint32_t firstQuery,
7333 uint32_t queryCount,
7334 VkBuffer dstBuffer,
7335 VkDeviceSize dstOffset,
7336 VkDeviceSize stride,
7337 VkQueryResultFlags flags)
7338{
7339 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007340
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007341 PostCmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
Jeremy Hayesad367152015-04-17 10:36:53 -06007342}
7343
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007344bool PreCmdPushConstants(
7345 VkCommandBuffer commandBuffer,
7346 const void* pValues)
7347{
7348 if(pValues != nullptr)
7349 {
Jeremy Hayes99a96322015-06-26 12:48:09 -06007350 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007351
7352 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007353}
7354
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007355bool PostCmdPushConstants(
7356 VkCommandBuffer commandBuffer,
7357 VkPipelineLayout layout,
7358 VkShaderStageFlags stageFlags,
7359 uint32_t offset,
7360 uint32_t size)
7361{
7362
7363
7364
7365
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007366
7367 return true;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007368}
7369
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007370VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants(
7371 VkCommandBuffer commandBuffer,
7372 VkPipelineLayout layout,
7373 VkShaderStageFlags stageFlags,
7374 uint32_t offset,
7375 uint32_t size,
7376 const void* pValues)
7377{
Dustin Graves1e92cd72016-02-09 14:00:18 -07007378 VkBool32 skipCall = VK_FALSE;
7379 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
7380 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007381
Dustin Graves1e92cd72016-02-09 14:00:18 -07007382 skipCall |= param_check_vkCmdPushConstants(
7383 my_data->report_data,
7384 layout,
7385 stageFlags,
7386 offset,
7387 size,
7388 pValues);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007389
Dustin Graves1e92cd72016-02-09 14:00:18 -07007390 if (skipCall == VK_FALSE) {
7391 PreCmdPushConstants(commandBuffer, pValues);
7392
7393 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
7394
7395 PostCmdPushConstants(commandBuffer, layout, stageFlags, offset, size);
7396 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06007397}
7398
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007399bool PreCmdBeginRenderPass(
7400 VkCommandBuffer commandBuffer,
7401 const VkRenderPassBeginInfo* pRenderPassBegin)
7402{
7403 if(pRenderPassBegin != nullptr)
7404 {
7405 if(pRenderPassBegin->sType != VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO)
7406 {
7407 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
7408 "vkCmdBeginRenderPass parameter, VkStructureType pRenderPassBegin->sType, is an invalid enumerator");
7409 return false;
7410 }
7411 if(pRenderPassBegin->pClearValues != nullptr)
7412 {
7413 }
Jon Ashburne68a9ff2015-05-25 14:11:37 -06007414 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007415
7416 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06007417}
7418
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007419bool PostCmdBeginRenderPass(
7420 VkCommandBuffer commandBuffer,
7421 VkSubpassContents contents)
7422{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007423
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007424 if(contents < VK_SUBPASS_CONTENTS_BEGIN_RANGE ||
7425 contents > VK_SUBPASS_CONTENTS_END_RANGE)
7426 {
7427 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
7428 "vkCmdBeginRenderPass parameter, VkSubpassContents contents, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06007429 return false;
7430 }
7431
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007432 return true;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06007433}
7434
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007435VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBeginRenderPass(
7436 VkCommandBuffer commandBuffer,
7437 const VkRenderPassBeginInfo* pRenderPassBegin,
7438 VkSubpassContents contents)
7439{
Dustin Graves1e92cd72016-02-09 14:00:18 -07007440 VkBool32 skipCall = VK_FALSE;
7441 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
7442 assert(my_data != NULL);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06007443
Dustin Graves1e92cd72016-02-09 14:00:18 -07007444 skipCall |= param_check_vkCmdBeginRenderPass(
7445 my_data->report_data,
7446 pRenderPassBegin,
7447 contents);
Jeremy Hayes99a96322015-06-26 12:48:09 -06007448
Dustin Graves1e92cd72016-02-09 14:00:18 -07007449 if (skipCall == VK_FALSE) {
7450 PreCmdBeginRenderPass(commandBuffer, pRenderPassBegin);
7451
7452 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
7453
7454 PostCmdBeginRenderPass(commandBuffer, contents);
7455 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06007456}
7457
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007458bool PostCmdNextSubpass(
7459 VkCommandBuffer commandBuffer,
7460 VkSubpassContents contents)
7461{
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007462
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007463 if(contents < VK_SUBPASS_CONTENTS_BEGIN_RANGE ||
7464 contents > VK_SUBPASS_CONTENTS_END_RANGE)
7465 {
7466 log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, "PARAMCHECK",
7467 "vkCmdNextSubpass parameter, VkSubpassContents contents, is an unrecognized enumerator");
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06007468 return false;
Chia-I Wu08accc62015-07-07 11:50:03 +08007469 }
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007470
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06007471 return true;
Chia-I Wu08accc62015-07-07 11:50:03 +08007472}
7473
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007474VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass(
7475 VkCommandBuffer commandBuffer,
7476 VkSubpassContents contents)
7477{
7478 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
Chia-I Wu08accc62015-07-07 11:50:03 +08007479
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007480 PostCmdNextSubpass(commandBuffer, contents);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06007481}
7482
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007483bool PostCmdEndRenderPass(
7484 VkCommandBuffer commandBuffer)
7485{
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06007486
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007487 return true;
7488}
7489
7490VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass(
7491 VkCommandBuffer commandBuffer)
7492{
7493 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
Jeremy Hayesf4b6f562015-07-29 11:23:46 -06007494
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007495 PostCmdEndRenderPass(commandBuffer);
Chia-I Wu08accc62015-07-07 11:50:03 +08007496}
7497
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007498bool PreCmdExecuteCommands(
7499 VkCommandBuffer commandBuffer,
7500 const VkCommandBuffer* pCommandBuffers)
7501{
7502 if(pCommandBuffers != nullptr)
7503 {
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007504 }
7505
7506 return true;
7507}
7508
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007509bool PostCmdExecuteCommands(
7510 VkCommandBuffer commandBuffer,
7511 uint32_t commandBuffersCount)
7512{
7513
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007514
7515 return true;
7516}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06007517
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007518VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdExecuteCommands(
7519 VkCommandBuffer commandBuffer,
Dustin Graves1e92cd72016-02-09 14:00:18 -07007520 uint32_t commandBufferCount,
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007521 const VkCommandBuffer* pCommandBuffers)
7522{
Dustin Graves1e92cd72016-02-09 14:00:18 -07007523 VkBool32 skipCall = VK_FALSE;
7524 layer_data* my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
7525 assert(my_data != NULL);
Jeremy Hayes359eeb92015-07-09 17:11:25 -06007526
Dustin Graves1e92cd72016-02-09 14:00:18 -07007527 skipCall |= param_check_vkCmdExecuteCommands(
7528 my_data->report_data,
7529 commandBufferCount,
7530 pCommandBuffers);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +08007531
Dustin Graves1e92cd72016-02-09 14:00:18 -07007532 if (skipCall == VK_FALSE) {
7533 PreCmdExecuteCommands(commandBuffer, pCommandBuffers);
7534
7535 get_dispatch_table(pc_device_table_map, commandBuffer)->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
7536
7537 PostCmdExecuteCommands(commandBuffer, commandBufferCount);
7538 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06007539}
7540
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007541VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char* funcName)
7542{
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07007543 layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
7544
7545 if (validate_string(data, "vkGetDeviceProcAddr()", "funcName", funcName) == VK_TRUE) {
7546 return NULL;
7547 }
7548
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07007549 if (!strcmp(funcName, "vkGetDeviceProcAddr"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007550 return (PFN_vkVoidFunction) vkGetDeviceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007551 if (!strcmp(funcName, "vkDestroyDevice"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007552 return (PFN_vkVoidFunction) vkDestroyDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007553 if (!strcmp(funcName, "vkGetDeviceQueue"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007554 return (PFN_vkVoidFunction) vkGetDeviceQueue;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007555 if (!strcmp(funcName, "vkQueueSubmit"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007556 return (PFN_vkVoidFunction) vkQueueSubmit;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007557 if (!strcmp(funcName, "vkQueueWaitIdle"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007558 return (PFN_vkVoidFunction) vkQueueWaitIdle;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007559 if (!strcmp(funcName, "vkDeviceWaitIdle"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007560 return (PFN_vkVoidFunction) vkDeviceWaitIdle;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007561 if (!strcmp(funcName, "vkAllocateMemory"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007562 return (PFN_vkVoidFunction) vkAllocateMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007563 if (!strcmp(funcName, "vkMapMemory"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007564 return (PFN_vkVoidFunction) vkMapMemory;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007565 if (!strcmp(funcName, "vkFlushMappedMemoryRanges"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007566 return (PFN_vkVoidFunction) vkFlushMappedMemoryRanges;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007567 if (!strcmp(funcName, "vkInvalidateMappedMemoryRanges"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007568 return (PFN_vkVoidFunction) vkInvalidateMappedMemoryRanges;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007569 if (!strcmp(funcName, "vkCreateFence"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007570 return (PFN_vkVoidFunction) vkCreateFence;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007571 if (!strcmp(funcName, "vkResetFences"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007572 return (PFN_vkVoidFunction) vkResetFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007573 if (!strcmp(funcName, "vkGetFenceStatus"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007574 return (PFN_vkVoidFunction) vkGetFenceStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007575 if (!strcmp(funcName, "vkWaitForFences"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007576 return (PFN_vkVoidFunction) vkWaitForFences;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007577 if (!strcmp(funcName, "vkCreateSemaphore"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007578 return (PFN_vkVoidFunction) vkCreateSemaphore;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007579 if (!strcmp(funcName, "vkCreateEvent"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007580 return (PFN_vkVoidFunction) vkCreateEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007581 if (!strcmp(funcName, "vkGetEventStatus"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007582 return (PFN_vkVoidFunction) vkGetEventStatus;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007583 if (!strcmp(funcName, "vkSetEvent"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007584 return (PFN_vkVoidFunction) vkSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007585 if (!strcmp(funcName, "vkResetEvent"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007586 return (PFN_vkVoidFunction) vkResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007587 if (!strcmp(funcName, "vkCreateQueryPool"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007588 return (PFN_vkVoidFunction) vkCreateQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007589 if (!strcmp(funcName, "vkGetQueryPoolResults"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007590 return (PFN_vkVoidFunction) vkGetQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007591 if (!strcmp(funcName, "vkCreateBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007592 return (PFN_vkVoidFunction) vkCreateBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007593 if (!strcmp(funcName, "vkCreateBufferView"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007594 return (PFN_vkVoidFunction) vkCreateBufferView;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007595 if (!strcmp(funcName, "vkCreateImage"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007596 return (PFN_vkVoidFunction) vkCreateImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007597 if (!strcmp(funcName, "vkGetImageSubresourceLayout"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007598 return (PFN_vkVoidFunction) vkGetImageSubresourceLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007599 if (!strcmp(funcName, "vkCreateImageView"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007600 return (PFN_vkVoidFunction) vkCreateImageView;
Michael Lentine03d8e572015-09-15 14:59:14 -05007601 if (!strcmp(funcName, "vkCreateShaderModule"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007602 return (PFN_vkVoidFunction) vkCreateShaderModule;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007603 if (!strcmp(funcName, "vkCreateGraphicsPipelines"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007604 return (PFN_vkVoidFunction) vkCreateGraphicsPipelines;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007605 if (!strcmp(funcName, "vkCreateComputePipelines"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007606 return (PFN_vkVoidFunction) vkCreateComputePipelines;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007607 if (!strcmp(funcName, "vkCreatePipelineLayout"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007608 return (PFN_vkVoidFunction) vkCreatePipelineLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007609 if (!strcmp(funcName, "vkCreateSampler"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007610 return (PFN_vkVoidFunction) vkCreateSampler;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007611 if (!strcmp(funcName, "vkCreateDescriptorSetLayout"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007612 return (PFN_vkVoidFunction) vkCreateDescriptorSetLayout;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007613 if (!strcmp(funcName, "vkCreateDescriptorPool"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007614 return (PFN_vkVoidFunction) vkCreateDescriptorPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007615 if (!strcmp(funcName, "vkResetDescriptorPool"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007616 return (PFN_vkVoidFunction) vkResetDescriptorPool;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007617 if (!strcmp(funcName, "vkAllocateDescriptorSets"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007618 return (PFN_vkVoidFunction) vkAllocateDescriptorSets;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06007619 if (!strcmp(funcName, "vkCmdSetViewport"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007620 return (PFN_vkVoidFunction) vkCmdSetViewport;
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06007621 if (!strcmp(funcName, "vkCmdSetScissor"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007622 return (PFN_vkVoidFunction) vkCmdSetScissor;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06007623 if (!strcmp(funcName, "vkCmdSetLineWidth"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007624 return (PFN_vkVoidFunction) vkCmdSetLineWidth;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06007625 if (!strcmp(funcName, "vkCmdSetDepthBias"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007626 return (PFN_vkVoidFunction) vkCmdSetDepthBias;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06007627 if (!strcmp(funcName, "vkCmdSetBlendConstants"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007628 return (PFN_vkVoidFunction) vkCmdSetBlendConstants;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06007629 if (!strcmp(funcName, "vkCmdSetDepthBounds"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007630 return (PFN_vkVoidFunction) vkCmdSetDepthBounds;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06007631 if (!strcmp(funcName, "vkCmdSetStencilCompareMask"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007632 return (PFN_vkVoidFunction) vkCmdSetStencilCompareMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06007633 if (!strcmp(funcName, "vkCmdSetStencilWriteMask"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007634 return (PFN_vkVoidFunction) vkCmdSetStencilWriteMask;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06007635 if (!strcmp(funcName, "vkCmdSetStencilReference"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007636 return (PFN_vkVoidFunction) vkCmdSetStencilReference;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007637 if (!strcmp(funcName, "vkAllocateCommandBuffers"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007638 return (PFN_vkVoidFunction) vkAllocateCommandBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007639 if (!strcmp(funcName, "vkBeginCommandBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007640 return (PFN_vkVoidFunction) vkBeginCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007641 if (!strcmp(funcName, "vkEndCommandBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007642 return (PFN_vkVoidFunction) vkEndCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007643 if (!strcmp(funcName, "vkResetCommandBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007644 return (PFN_vkVoidFunction) vkResetCommandBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007645 if (!strcmp(funcName, "vkCmdBindPipeline"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007646 return (PFN_vkVoidFunction) vkCmdBindPipeline;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007647 if (!strcmp(funcName, "vkCmdBindDescriptorSets"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007648 return (PFN_vkVoidFunction) vkCmdBindDescriptorSets;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007649 if (!strcmp(funcName, "vkCmdBindVertexBuffers"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007650 return (PFN_vkVoidFunction) vkCmdBindVertexBuffers;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007651 if (!strcmp(funcName, "vkCmdBindIndexBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007652 return (PFN_vkVoidFunction) vkCmdBindIndexBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007653 if (!strcmp(funcName, "vkCmdDraw"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007654 return (PFN_vkVoidFunction) vkCmdDraw;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007655 if (!strcmp(funcName, "vkCmdDrawIndexed"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007656 return (PFN_vkVoidFunction) vkCmdDrawIndexed;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007657 if (!strcmp(funcName, "vkCmdDrawIndirect"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007658 return (PFN_vkVoidFunction) vkCmdDrawIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007659 if (!strcmp(funcName, "vkCmdDrawIndexedIndirect"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007660 return (PFN_vkVoidFunction) vkCmdDrawIndexedIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007661 if (!strcmp(funcName, "vkCmdDispatch"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007662 return (PFN_vkVoidFunction) vkCmdDispatch;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007663 if (!strcmp(funcName, "vkCmdDispatchIndirect"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007664 return (PFN_vkVoidFunction) vkCmdDispatchIndirect;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007665 if (!strcmp(funcName, "vkCmdCopyBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007666 return (PFN_vkVoidFunction) vkCmdCopyBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007667 if (!strcmp(funcName, "vkCmdCopyImage"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007668 return (PFN_vkVoidFunction) vkCmdCopyImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007669 if (!strcmp(funcName, "vkCmdBlitImage"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007670 return (PFN_vkVoidFunction) vkCmdBlitImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007671 if (!strcmp(funcName, "vkCmdCopyBufferToImage"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007672 return (PFN_vkVoidFunction) vkCmdCopyBufferToImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007673 if (!strcmp(funcName, "vkCmdCopyImageToBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007674 return (PFN_vkVoidFunction) vkCmdCopyImageToBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007675 if (!strcmp(funcName, "vkCmdUpdateBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007676 return (PFN_vkVoidFunction) vkCmdUpdateBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007677 if (!strcmp(funcName, "vkCmdFillBuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007678 return (PFN_vkVoidFunction) vkCmdFillBuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007679 if (!strcmp(funcName, "vkCmdClearColorImage"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007680 return (PFN_vkVoidFunction) vkCmdClearColorImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007681 if (!strcmp(funcName, "vkCmdResolveImage"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007682 return (PFN_vkVoidFunction) vkCmdResolveImage;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007683 if (!strcmp(funcName, "vkCmdSetEvent"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007684 return (PFN_vkVoidFunction) vkCmdSetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007685 if (!strcmp(funcName, "vkCmdResetEvent"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007686 return (PFN_vkVoidFunction) vkCmdResetEvent;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007687 if (!strcmp(funcName, "vkCmdWaitEvents"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007688 return (PFN_vkVoidFunction) vkCmdWaitEvents;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007689 if (!strcmp(funcName, "vkCmdPipelineBarrier"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007690 return (PFN_vkVoidFunction) vkCmdPipelineBarrier;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007691 if (!strcmp(funcName, "vkCmdBeginQuery"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007692 return (PFN_vkVoidFunction) vkCmdBeginQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007693 if (!strcmp(funcName, "vkCmdEndQuery"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007694 return (PFN_vkVoidFunction) vkCmdEndQuery;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007695 if (!strcmp(funcName, "vkCmdResetQueryPool"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007696 return (PFN_vkVoidFunction) vkCmdResetQueryPool;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007697 if (!strcmp(funcName, "vkCmdWriteTimestamp"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007698 return (PFN_vkVoidFunction) vkCmdWriteTimestamp;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007699 if (!strcmp(funcName, "vkCmdCopyQueryPoolResults"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007700 return (PFN_vkVoidFunction) vkCmdCopyQueryPoolResults;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007701 if (!strcmp(funcName, "vkCreateFramebuffer"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007702 return (PFN_vkVoidFunction) vkCreateFramebuffer;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007703 if (!strcmp(funcName, "vkCreateRenderPass"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007704 return (PFN_vkVoidFunction) vkCreateRenderPass;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007705 if (!strcmp(funcName, "vkCmdBeginRenderPass"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007706 return (PFN_vkVoidFunction) vkCmdBeginRenderPass;
Chia-I Wu08accc62015-07-07 11:50:03 +08007707 if (!strcmp(funcName, "vkCmdNextSubpass"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007708 return (PFN_vkVoidFunction) vkCmdNextSubpass;
Jon Ashburneab34492015-06-01 09:37:38 -06007709
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07007710 if (device == NULL) {
7711 return NULL;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06007712 }
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07007713
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007714 if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07007715 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007716 return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06007717}
7718
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007719VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char* funcName)
7720{
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07007721 if (!strcmp(funcName, "vkGetInstanceProcAddr"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007722 return (PFN_vkVoidFunction) vkGetInstanceProcAddr;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007723 if (!strcmp(funcName, "vkCreateInstance"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007724 return (PFN_vkVoidFunction) vkCreateInstance;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007725 if (!strcmp(funcName, "vkDestroyInstance"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007726 return (PFN_vkVoidFunction) vkDestroyInstance;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07007727 if (!strcmp(funcName, "vkCreateDevice"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007728 return (PFN_vkVoidFunction) vkCreateDevice;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007729 if (!strcmp(funcName, "vkEnumeratePhysicalDevices"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007730 return (PFN_vkVoidFunction) vkEnumeratePhysicalDevices;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007731 if (!strcmp(funcName, "vkGetPhysicalDeviceProperties"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007732 return (PFN_vkVoidFunction) vkGetPhysicalDeviceProperties;
Jeremy Hayes99a96322015-06-26 12:48:09 -06007733 if (!strcmp(funcName, "vkGetPhysicalDeviceFeatures"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007734 return (PFN_vkVoidFunction) vkGetPhysicalDeviceFeatures;
Courtney Goeltzenleuchter2caec862015-07-12 12:52:09 -06007735 if (!strcmp(funcName, "vkGetPhysicalDeviceFormatProperties"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007736 return (PFN_vkVoidFunction) vkGetPhysicalDeviceFormatProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06007737 if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007738 return (PFN_vkVoidFunction) vkEnumerateInstanceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06007739 if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007740 return (PFN_vkVoidFunction) vkEnumerateInstanceExtensionProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06007741 if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007742 return (PFN_vkVoidFunction) vkEnumerateDeviceLayerProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06007743 if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties"))
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007744 return (PFN_vkVoidFunction) vkEnumerateDeviceExtensionProperties;
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06007745
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07007746 if (instance == NULL) {
7747 return NULL;
7748 }
7749
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007750 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9a1c7b72016-01-12 11:52:05 -07007751
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007752 PFN_vkVoidFunction fptr = debug_report_get_instance_proc_addr(data->report_data, funcName);
7753 if(fptr)
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06007754 return fptr;
7755
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007756 if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07007757 return NULL;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -07007758 return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06007759}