1288e4f7d378f9185c714ead36a17dff64be24e49Mark Lobodzinski/* Copyright (c) 2015-2016 The Khronos Group Inc.
2288e4f7d378f9185c714ead36a17dff64be24e49Mark Lobodzinski * Copyright (c) 2015-2016 Valve Corporation
3288e4f7d378f9185c714ead36a17dff64be24e49Mark Lobodzinski * Copyright (c) 2015-2016 LunarG, Inc.
4288e4f7d378f9185c714ead36a17dff64be24e49Mark Lobodzinski * Copyright (C) 2015-2016 Google Inc.
5c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes *
643b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * Licensed under the Apache License, Version 2.0 (the "License");
743b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * you may not use this file except in compliance with the License.
843b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * You may obtain a copy of the License at
9c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes *
1043b53e83705f02245da6ae61e31273866a35b833Jon Ashburn *     http://www.apache.org/licenses/LICENSE-2.0
11c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes *
1243b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * Unless required by applicable law or agreed to in writing, software
1343b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * distributed under the License is distributed on an "AS IS" BASIS,
1443b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1543b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * See the License for the specific language governing permissions and
1643b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * limitations under the License.
1796cd795bb585711057cd90d37a2251419384c937Courtney Goeltzenleuchter *
1896cd795bb585711057cd90d37a2251419384c937Courtney Goeltzenleuchter * Author: Jeremy Hayes <jeremy@lunarg.com>
1996cd795bb585711057cd90d37a2251419384c937Courtney Goeltzenleuchter * Author: Tony Barbour <tony@LunarG.com>
20b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski * Author: Mark Lobodzinski <mark@LunarG.com>
21c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves * Author: Dustin Graves <dustin@lunarg.com>
22c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes */
23c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
249d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves#define NOMINMAX
259d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves
269d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves#include <math.h>
27c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes#include <stdio.h>
28c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes#include <stdlib.h>
29c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes#include <string.h>
30c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
31c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes#include <iostream>
32c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes#include <string>
33c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes#include <sstream>
343723c5196d245599b2af381a218a417d7340b622Mark Lobodzinski#include <unordered_map>
3584db6f59e3592edf7ba313c7d67f9db2af82d841Michael Lentine#include <unordered_set>
36ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes#include <vector>
37c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
387a51d9001436476d50118230d5b2a4ebcc929b79Tobin Ehlis#include "vk_loader_platform.h"
39329ca9eb16cdbee7a7644fb08ade7b3d3bb32e23David Pinedo#include "vulkan/vk_layer.h"
4056d204acf07fe1639103ab9326886f3c06dbbb76Tobin Ehlis#include "vk_layer_config.h"
419cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter#include "vk_enum_validate_helper.h"
429cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter#include "vk_struct_validate_helper.h"
43c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4456d204acf07fe1639103ab9326886f3c06dbbb76Tobin Ehlis#include "vk_layer_table.h"
4556d204acf07fe1639103ab9326886f3c06dbbb76Tobin Ehlis#include "vk_layer_data.h"
4656d204acf07fe1639103ab9326886f3c06dbbb76Tobin Ehlis#include "vk_layer_logging.h"
4724d5abbfcd268bbff2ee978111bcca9a7e6c99ecCourtney Goeltzenleuchter#include "vk_layer_extension_utils.h"
48b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski#include "vk_layer_utils.h"
49c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
503755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves#include "parameter_name.h"
511c3335744fd8c4b4299d64153d5d3b411f8f3fa5Mark Lobodzinski#include "parameter_validation.h"
52c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
53e68a153278bbefa18f1d9ced5e191cbf7cec8150Chia-I Wunamespace parameter_validation {
54c5ef2f000603a3e52647b44b3910e2cb6a0143fcDustin Graves
5573bb657499347bd40990c742af60e63bb03426f3Cody Northropstruct layer_data {
56e5ed0a0317fff097249065194049a589c0a3a3b2Chia-I Wu    VkInstance instance;
57e5ed0a0317fff097249065194049a589c0a3a3b2Chia-I Wu
58ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    debug_report_data *report_data;
59acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter    std::vector<VkDebugReportCallbackEXT> logging_callback;
6073bb657499347bd40990c742af60e63bb03426f3Cody Northrop
61f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott    // The following are for keeping track of the temporary callbacks that can
62f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott    // be used in vkCreateInstance and vkDestroyInstance:
63f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott    uint32_t num_tmp_callbacks;
64f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott    VkDebugReportCallbackCreateInfoEXT *tmp_dbg_create_infos;
65f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott    VkDebugReportCallbackEXT *tmp_callbacks;
66f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott
67491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    // TODO: Split instance/device structs
68491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    // Device Data
69491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    // Map for queue family index to queue count
701595771772e0563fd9071b15e61e2825ab4754afMichael Lentine    std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
713d547177aa38a05853d13b1d9b1ce80ca9a94d9fMark Lobodzinski    VkPhysicalDeviceLimits device_limits;
729a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski    VkPhysicalDeviceFeatures physical_device_features;
739a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski    VkPhysicalDevice physical_device;
741595771772e0563fd9071b15e61e2825ab4754afMichael Lentine
758c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    bool wsi_enabled;
7619ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young    bool wsi_display_swapchain_enabled;
778c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
783d547177aa38a05853d13b1d9b1ce80ca9a94d9fMark Lobodzinski    layer_data()
799a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski        : report_data(nullptr), num_tmp_callbacks(0), tmp_dbg_create_infos(nullptr), tmp_callbacks(nullptr), device_limits{},
8019ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young          physical_device_features{}, physical_device{}, wsi_enabled(false), wsi_display_swapchain_enabled(false) {};
8173bb657499347bd40990c742af60e63bb03426f3Cody Northrop};
82ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
83956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinskistatic std::unordered_map<void *, struct instance_extension_enables> instance_extension_map;
84491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::unordered_map<void *, layer_data *> layer_data_map;
85ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayesstatic device_table_map pc_device_table_map;
86ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayesstatic instance_table_map pc_instance_table_map;
87ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
88ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes// "my instance data"
89491a3cd11793892b996a8b5771479cc539198f99Jon Ashburndebug_report_data *mid(VkInstance object) {
90ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    dispatch_key key = get_dispatch_key(object);
918354e02a8b03ff1f427f632029305e88ab158f30Tobin Ehlis    layer_data *data = get_my_data_ptr(key, layer_data_map);
92ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes#if DISPATCH_MAP_DEBUG
93414e9a4117b500eac650d8b8f01a6e1b22d05aaeMark Mueller    fprintf(stderr, "MID: map:  0x%p, object:  0x%p, key:  0x%p, data:  0x%p\n", &layer_data_map, object, key, data);
94ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes#endif
95eb456c6843454b301551381be33e192541b2d289Courtney Goeltzenleuchter    assert(data != NULL);
96ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
97ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return data->report_data;
98ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
99ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
100ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes// "my device data"
101491a3cd11793892b996a8b5771479cc539198f99Jon Ashburndebug_report_data *mdd(void *object) {
102ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    dispatch_key key = get_dispatch_key(object);
103ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    layer_data *data = get_my_data_ptr(key, layer_data_map);
104ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes#if DISPATCH_MAP_DEBUG
105414e9a4117b500eac650d8b8f01a6e1b22d05aaeMark Mueller    fprintf(stderr, "MDD: map:  0x%p, object:  0x%p, key:  0x%p, data:  0x%p\n", &layer_data_map, object, key, data);
106ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes#endif
107eb456c6843454b301551381be33e192541b2d289Courtney Goeltzenleuchter    assert(data != NULL);
108ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return data->report_data;
109ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
110ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1111c3335744fd8c4b4299d64153d5d3b411f8f3fa5Mark Lobodzinskistatic void init_parameter_validation(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
112d11c4ee2bd2a5672093d76630d895e824ee1a571Mark Lobodzinski
1131c3335744fd8c4b4299d64153d5d3b411f8f3fa5Mark Lobodzinski    layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation");
114ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
115ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
116956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
117956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                            const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
118956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                            const VkAllocationCallbacks *pAllocator,
119956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                            VkDebugReportCallbackEXT *pMsgCallback) {
120b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
121491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
122ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
123491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (result == VK_SUCCESS) {
124b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski        layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
125c34ab18ac7c064590a1020a8db4b6abf5a8d3a18Mark Lobodzinski        result = layer_create_msg_callback(data->report_data, false, pCreateInfo, pAllocator, pMsgCallback);
126ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
127ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
128ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
129ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
130ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
131956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
1327b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I Wu                                                         const VkAllocationCallbacks *pAllocator) {
133b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
134acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter    pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
135ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
136b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
137f6a6e223b7ca92b5e3c8b05331b500ab8f01116aCourtney Goeltzenleuchter    layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator);
138ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
139ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
140956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
141956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
142956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
143b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
144b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    pTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
1455a424cea2014b643e6bd6e2ae480c730bc6496afCourtney Goeltzenleuchter}
1465a424cea2014b643e6bd6e2ae480c730bc6496afCourtney Goeltzenleuchter
147491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
148ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1499ace83be45008ae7c9a15b79d7e867b1914dca33Chia-I Wustatic const VkLayerProperties global_layer = {
150f1ea418f193d10a8455cdf47e0eeeeb1f4d8b5bfJon Ashburn    "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer",
1519ace83be45008ae7c9a15b79d7e867b1914dca33Chia-I Wu};
152491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn
153491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) {
154752957901902cd3de9b99ef272d7b7fbaeef2705Courtney Goeltzenleuchter    VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)(
155491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
156491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT |
157491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
158491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
159491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT |
160bd897d82d89ac576544e8b2aad1136edbee0e6f2Jon Ashburn        VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
161491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & (~allFlags)) {
162ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return false;
163ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
164ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
165ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return true;
166ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
167ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
168491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::string EnumeratorString(VkFormatFeatureFlagBits const &enumerator) {
169491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (!ValidateEnumerator(enumerator)) {
170ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return "unrecognized enumerator";
171ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
172ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
173ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::vector<std::string> strings;
174491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) {
175e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
176ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
177491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
178e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT");
179ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
180491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) {
181e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
182ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
183491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) {
184e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
185e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
186491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {
187e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
188e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
189491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) {
190e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
191e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
192491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) {
193e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT");
194e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
195491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) {
196e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
197e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
198491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
199e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
200e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
201491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
202e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
203ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
204491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_FORMAT_FEATURE_BLIT_SRC_BIT) {
2051f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu        strings.push_back("VK_FORMAT_FEATURE_BLIT_SRC_BIT");
2069e8b03f513e5ca515b99f4bf90b27634cee31453Cody Northrop    }
207491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_FORMAT_FEATURE_BLIT_DST_BIT) {
2081f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu        strings.push_back("VK_FORMAT_FEATURE_BLIT_DST_BIT");
2099e8b03f513e5ca515b99f4bf90b27634cee31453Cody Northrop    }
210491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) {
211bd897d82d89ac576544e8b2aad1136edbee0e6f2Jon Ashburn        strings.push_back("VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
212bd897d82d89ac576544e8b2aad1136edbee0e6f2Jon Ashburn    }
213ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
214ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::string enumeratorString;
215491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    for (auto const &string : strings) {
216ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        enumeratorString += string;
217ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
218491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (string != strings.back()) {
219ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes            enumeratorString += '|';
220ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        }
221ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
222ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
223ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return enumeratorString;
224ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
225ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
226491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic bool ValidateEnumerator(VkImageUsageFlagBits const &enumerator) {
227491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkImageUsageFlagBits allFlags = (VkImageUsageFlagBits)(
228491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
229491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
230491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
231491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & (~allFlags)) {
232ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return false;
233ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
234ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
235ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return true;
236ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
237ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
238491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::string EnumeratorString(VkImageUsageFlagBits const &enumerator) {
239491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (!ValidateEnumerator(enumerator)) {
240ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return "unrecognized enumerator";
241ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
242ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
243ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::vector<std::string> strings;
244491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
245e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
246ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
247491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
248c3b8eea2f5e66db11651068575f4712cf195f542Courtney Goeltzenleuchter        strings.push_back("VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
249ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
250491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
251e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
252ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
253491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_IMAGE_USAGE_STORAGE_BIT) {
254e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_IMAGE_USAGE_STORAGE_BIT");
255ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
256491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_IMAGE_USAGE_SAMPLED_BIT) {
257e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_IMAGE_USAGE_SAMPLED_BIT");
258e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
259491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
2601f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu        strings.push_back("VK_IMAGE_USAGE_TRANSFER_DST_BIT");
261e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
262491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
263e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
264e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
265491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
2661f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu        strings.push_back("VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
267e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
268ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
269ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::string enumeratorString;
270491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    for (auto const &string : strings) {
271ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        enumeratorString += string;
272ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
273491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (string != strings.back()) {
274ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes            enumeratorString += '|';
275ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        }
276ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
277ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
278ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return enumeratorString;
279ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
280ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
281491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic bool ValidateEnumerator(VkQueueFlagBits const &enumerator) {
282491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkQueueFlagBits allFlags =
283491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        (VkQueueFlagBits)(VK_QUEUE_TRANSFER_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_SPARSE_BINDING_BIT | VK_QUEUE_GRAPHICS_BIT);
284491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & (~allFlags)) {
285ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return false;
286ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
287ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
288ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return true;
289ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
290ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
291491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::string EnumeratorString(VkQueueFlagBits const &enumerator) {
292491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (!ValidateEnumerator(enumerator)) {
293ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return "unrecognized enumerator";
294ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
295ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
296ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::vector<std::string> strings;
297491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_QUEUE_TRANSFER_BIT) {
298c51b121913d6f21ccefb3f7595178d3c87e11de4Chia-I Wu        strings.push_back("VK_QUEUE_TRANSFER_BIT");
299ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
300491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_QUEUE_COMPUTE_BIT) {
301e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_QUEUE_COMPUTE_BIT");
302ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
303491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_QUEUE_SPARSE_BINDING_BIT) {
3047e470703805a7c93655ea18f553e225e84356429Chia-I Wu        strings.push_back("VK_QUEUE_SPARSE_BINDING_BIT");
305ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
306491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_QUEUE_GRAPHICS_BIT) {
307e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_QUEUE_GRAPHICS_BIT");
308ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
309ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
310ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::string enumeratorString;
311491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    for (auto const &string : strings) {
312ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        enumeratorString += string;
313ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
314491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (string != strings.back()) {
315ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes            enumeratorString += '|';
316ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        }
317ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
318ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
319ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return enumeratorString;
320ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
321ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
322491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic bool ValidateEnumerator(VkMemoryPropertyFlagBits const &enumerator) {
323491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkMemoryPropertyFlagBits allFlags = (VkMemoryPropertyFlagBits)(
324491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
325491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
326491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & (~allFlags)) {
327ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return false;
328ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
329ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
330ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return true;
331ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
332ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
333491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::string EnumeratorString(VkMemoryPropertyFlagBits const &enumerator) {
334491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (!ValidateEnumerator(enumerator)) {
335ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return "unrecognized enumerator";
336ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
337ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
338ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::vector<std::string> strings;
339491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
340e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
341ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
342491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {
34327d8ed9a91356894ae00fefedc7ef7895e796efeChia-I Wu        strings.push_back("VK_MEMORY_PROPERTY_HOST_COHERENT_BIT");
344ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
345491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
346e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
347ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
348491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {
34927d8ed9a91356894ae00fefedc7ef7895e796efeChia-I Wu        strings.push_back("VK_MEMORY_PROPERTY_HOST_CACHED_BIT");
350ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
351491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
35227d8ed9a91356894ae00fefedc7ef7895e796efeChia-I Wu        strings.push_back("VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
353ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
354ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
355ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::string enumeratorString;
356491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    for (auto const &string : strings) {
357ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        enumeratorString += string;
358ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
359491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (string != strings.back()) {
360ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes            enumeratorString += '|';
361ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        }
362ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
363ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
364ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return enumeratorString;
365ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
366ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
367491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic bool ValidateEnumerator(VkMemoryHeapFlagBits const &enumerator) {
368b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    VkMemoryHeapFlagBits allFlags = (VkMemoryHeapFlagBits)(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT);
369491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & (~allFlags)) {
370ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return false;
371ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
372ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
373ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return true;
374ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
375ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
376491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::string EnumeratorString(VkMemoryHeapFlagBits const &enumerator) {
377491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (!ValidateEnumerator(enumerator)) {
378ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return "unrecognized enumerator";
379ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
380ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
381ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::vector<std::string> strings;
382491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
38327d8ed9a91356894ae00fefedc7ef7895e796efeChia-I Wu        strings.push_back("VK_MEMORY_HEAP_DEVICE_LOCAL_BIT");
384ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
385e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
386e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    std::string enumeratorString;
387491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    for (auto const &string : strings) {
388e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        enumeratorString += string;
389e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
390491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (string != strings.back()) {
391e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes            enumeratorString += '|';
392e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        }
393ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
394e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
395e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    return enumeratorString;
396e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes}
397e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
398491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic bool ValidateEnumerator(VkSparseImageFormatFlagBits const &enumerator) {
399491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkSparseImageFormatFlagBits allFlags =
400491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        (VkSparseImageFormatFlagBits)(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT |
401491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                                      VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT);
402491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & (~allFlags)) {
403ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return false;
404ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
405ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
406ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return true;
407ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
408ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
409491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::string EnumeratorString(VkSparseImageFormatFlagBits const &enumerator) {
410491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (!ValidateEnumerator(enumerator)) {
411ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return "unrecognized enumerator";
412ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
413ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
414ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::vector<std::string> strings;
415491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT) {
4167e470703805a7c93655ea18f553e225e84356429Chia-I Wu        strings.push_back("VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT");
417c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    }
418491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT) {
4197e470703805a7c93655ea18f553e225e84356429Chia-I Wu        strings.push_back("VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT");
420c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    }
421491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) {
4227e470703805a7c93655ea18f553e225e84356429Chia-I Wu        strings.push_back("VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT");
423ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
424ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
425ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::string enumeratorString;
426491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    for (auto const &string : strings) {
427ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        enumeratorString += string;
428ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
429491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (string != strings.back()) {
430ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes            enumeratorString += '|';
431ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        }
432ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
433ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
434ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return enumeratorString;
435ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
436ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
437491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic bool ValidateEnumerator(VkFenceCreateFlagBits const &enumerator) {
438b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    VkFenceCreateFlagBits allFlags = (VkFenceCreateFlagBits)(VK_FENCE_CREATE_SIGNALED_BIT);
439491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & (~allFlags)) {
440e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        return false;
441ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
442e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
443e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    return true;
444e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes}
445e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
446491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::string EnumeratorString(VkFenceCreateFlagBits const &enumerator) {
447491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (!ValidateEnumerator(enumerator)) {
448e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        return "unrecognized enumerator";
449ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
450e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
451e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    std::vector<std::string> strings;
452491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_FENCE_CREATE_SIGNALED_BIT) {
453e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_FENCE_CREATE_SIGNALED_BIT");
454ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
455ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
456ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::string enumeratorString;
457491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    for (auto const &string : strings) {
458ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        enumeratorString += string;
459ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
460491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (string != strings.back()) {
461ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes            enumeratorString += '|';
462ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        }
463ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
464ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
465ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return enumeratorString;
466ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
467ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
468491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic bool ValidateEnumerator(VkQueryPipelineStatisticFlagBits const &enumerator) {
469491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkQueryPipelineStatisticFlagBits allFlags = (VkQueryPipelineStatisticFlagBits)(
470491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT |
471491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT |
472491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
473491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT |
474b93427cf68ff3e8bde88e0f89379cc56a32fcd2cCourtney Goeltzenleuchter        VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT |
475b93427cf68ff3e8bde88e0f89379cc56a32fcd2cCourtney Goeltzenleuchter        VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT |
476b93427cf68ff3e8bde88e0f89379cc56a32fcd2cCourtney Goeltzenleuchter        VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT);
477491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & (~allFlags)) {
478ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return false;
479ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
480ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
481ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return true;
482ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
483ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
484491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::string EnumeratorString(VkQueryPipelineStatisticFlagBits const &enumerator) {
485491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (!ValidateEnumerator(enumerator)) {
486ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return "unrecognized enumerator";
487ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
488ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
489ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::vector<std::string> strings;
490491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT) {
491b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski        strings.push_back("VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT");
492b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    }
493491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT) {
494b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski        strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT");
495b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    }
496491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT) {
497b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski        strings.push_back("VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT");
498b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    }
499491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT) {
500b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski        strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT");
501b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    }
502491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT) {
503b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski        strings.push_back("VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT");
504b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    }
505491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
506b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski        strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT");
507b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    }
508491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT) {
509b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski        strings.push_back("VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT");
510b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    }
511491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT) {
512b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski        strings.push_back("VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT");
513b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    }
514491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT) {
515b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski        strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT");
516b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    }
517491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT) {
518b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski        strings.push_back("VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT");
519b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    }
520491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT) {
521b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski        strings.push_back("VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT");
522ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
523ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
524ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::string enumeratorString;
525491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    for (auto const &string : strings) {
526ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        enumeratorString += string;
527ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
528491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (string != strings.back()) {
529ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes            enumeratorString += '|';
530ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        }
531ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
532ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
533ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return enumeratorString;
534ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
535ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
536491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic bool ValidateEnumerator(VkQueryResultFlagBits const &enumerator) {
537491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkQueryResultFlagBits allFlags = (VkQueryResultFlagBits)(VK_QUERY_RESULT_PARTIAL_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT |
538491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                                                             VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
539491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & (~allFlags)) {
540ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return false;
541ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
542ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
543ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return true;
544ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
545ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
546491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::string EnumeratorString(VkQueryResultFlagBits const &enumerator) {
547491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (!ValidateEnumerator(enumerator)) {
548ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return "unrecognized enumerator";
549ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
550ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
551ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::vector<std::string> strings;
552491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_QUERY_RESULT_PARTIAL_BIT) {
553e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_QUERY_RESULT_PARTIAL_BIT");
554c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    }
555491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
556e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_QUERY_RESULT_WITH_AVAILABILITY_BIT");
557c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    }
558491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_QUERY_RESULT_WAIT_BIT) {
559e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_QUERY_RESULT_WAIT_BIT");
560c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    }
561491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_QUERY_RESULT_64_BIT) {
562e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_QUERY_RESULT_64_BIT");
563ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
564ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
565ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::string enumeratorString;
566491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    for (auto const &string : strings) {
567ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        enumeratorString += string;
568ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
569491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (string != strings.back()) {
570ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes            enumeratorString += '|';
571ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        }
572ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
573ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
574ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return enumeratorString;
575ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
576ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
577491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic bool ValidateEnumerator(VkBufferUsageFlagBits const &enumerator) {
578491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkBufferUsageFlagBits allFlags = (VkBufferUsageFlagBits)(
579491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
580491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
581491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
582491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & (~allFlags)) {
583ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return false;
584ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
585ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
586ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return true;
587ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
588ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
589491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::string EnumeratorString(VkBufferUsageFlagBits const &enumerator) {
590491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (!ValidateEnumerator(enumerator)) {
591ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return "unrecognized enumerator";
592ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
593ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
594ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::vector<std::string> strings;
595491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
596e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
597ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
598491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) {
599e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_BUFFER_USAGE_INDEX_BUFFER_BIT");
600e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
601491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) {
602e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
603e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
604491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
605e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT");
606e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
607491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
608e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_BUFFER_USAGE_STORAGE_BUFFER_BIT");
609e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
610491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_BUFFER_USAGE_TRANSFER_DST_BIT) {
6111f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu        strings.push_back("VK_BUFFER_USAGE_TRANSFER_DST_BIT");
612e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
613491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
614e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT");
615e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
616491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_BUFFER_USAGE_TRANSFER_SRC_BIT) {
6171f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu        strings.push_back("VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
618e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
619491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
620e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT");
621e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
622ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
623ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::string enumeratorString;
624491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    for (auto const &string : strings) {
625ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        enumeratorString += string;
626ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
627491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (string != strings.back()) {
628ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes            enumeratorString += '|';
629ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        }
630ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
631ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
632ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return enumeratorString;
633ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
634ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
635491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic bool ValidateEnumerator(VkBufferCreateFlagBits const &enumerator) {
636491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkBufferCreateFlagBits allFlags = (VkBufferCreateFlagBits)(
637491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_BUFFER_CREATE_SPARSE_ALIASED_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT);
638491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & (~allFlags)) {
639ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return false;
640ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
641ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
642ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return true;
643ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
644ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
645491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::string EnumeratorString(VkBufferCreateFlagBits const &enumerator) {
646491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (!ValidateEnumerator(enumerator)) {
647ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return "unrecognized enumerator";
648ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
649ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
650ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::vector<std::string> strings;
651491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) {
652e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_BUFFER_CREATE_SPARSE_ALIASED_BIT");
653ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
654491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) {
655e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT");
656e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
657491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
658c6d66ec0af7b6b7f912919977b3ce401b8d6f95dCourtney Goeltzenleuchter        strings.push_back("VK_BUFFER_CREATE_SPARSE_BINDING_BIT");
659ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
660ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
661ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::string enumeratorString;
662491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    for (auto const &string : strings) {
663ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        enumeratorString += string;
664ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
665491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (string != strings.back()) {
666ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes            enumeratorString += '|';
667ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        }
668ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
669ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
670ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return enumeratorString;
671ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
672ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
673491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic bool ValidateEnumerator(VkImageCreateFlagBits const &enumerator) {
674491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkImageCreateFlagBits allFlags = (VkImageCreateFlagBits)(
675491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
676491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT);
677491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & (~allFlags)) {
678ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return false;
679ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
680ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
681ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return true;
682ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
683ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
684491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::string EnumeratorString(VkImageCreateFlagBits const &enumerator) {
685491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (!ValidateEnumerator(enumerator)) {
686ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return "unrecognized enumerator";
687ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
688ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
689ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::vector<std::string> strings;
690491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
691e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT");
692ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
693491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) {
694e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
695ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
696491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
697e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT");
698e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
699491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
700e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT");
701e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
702491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
703c6d66ec0af7b6b7f912919977b3ce401b8d6f95dCourtney Goeltzenleuchter        strings.push_back("VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
704ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
705ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
706ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::string enumeratorString;
707491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    for (auto const &string : strings) {
708ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        enumeratorString += string;
709ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
710491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (string != strings.back()) {
711ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes            enumeratorString += '|';
712ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        }
713ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
714ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
715ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return enumeratorString;
716ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
717ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
718491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic bool ValidateEnumerator(VkColorComponentFlagBits const &enumerator) {
719491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkColorComponentFlagBits allFlags = (VkColorComponentFlagBits)(VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_B_BIT |
720491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                                                                   VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_R_BIT);
721491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & (~allFlags)) {
722c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes        return false;
723c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    }
724c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
725c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    return true;
726c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes}
727c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
728491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::string EnumeratorString(VkColorComponentFlagBits const &enumerator) {
729491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (!ValidateEnumerator(enumerator)) {
730c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes        return "unrecognized enumerator";
731c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    }
732c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
733c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    std::vector<std::string> strings;
734491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_COLOR_COMPONENT_A_BIT) {
735c51b121913d6f21ccefb3f7595178d3c87e11de4Chia-I Wu        strings.push_back("VK_COLOR_COMPONENT_A_BIT");
736c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    }
737491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_COLOR_COMPONENT_B_BIT) {
738c51b121913d6f21ccefb3f7595178d3c87e11de4Chia-I Wu        strings.push_back("VK_COLOR_COMPONENT_B_BIT");
739c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    }
740491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_COLOR_COMPONENT_G_BIT) {
741c51b121913d6f21ccefb3f7595178d3c87e11de4Chia-I Wu        strings.push_back("VK_COLOR_COMPONENT_G_BIT");
742e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
743491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_COLOR_COMPONENT_R_BIT) {
744c51b121913d6f21ccefb3f7595178d3c87e11de4Chia-I Wu        strings.push_back("VK_COLOR_COMPONENT_R_BIT");
745c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    }
746c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
747c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    std::string enumeratorString;
748491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    for (auto const &string : strings) {
749c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes        enumeratorString += string;
750c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
751491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (string != strings.back()) {
752c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes            enumeratorString += '|';
753c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes        }
754c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    }
755c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
756c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    return enumeratorString;
757c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes}
758c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
759491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic bool ValidateEnumerator(VkPipelineCreateFlagBits const &enumerator) {
760491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkPipelineCreateFlagBits allFlags = (VkPipelineCreateFlagBits)(
761491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_PIPELINE_CREATE_DERIVATIVE_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
762491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & (~allFlags)) {
763c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes        return false;
764c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    }
765c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
766c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    return true;
767c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes}
768c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
769491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::string EnumeratorString(VkPipelineCreateFlagBits const &enumerator) {
770491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (!ValidateEnumerator(enumerator)) {
771c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes        return "unrecognized enumerator";
772c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    }
773c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
774c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    std::vector<std::string> strings;
775491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
776e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_PIPELINE_CREATE_DERIVATIVE_BIT");
777e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
778491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) {
779e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT");
780e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
781491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) {
782e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT");
783c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    }
784c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
785c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    std::string enumeratorString;
786491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    for (auto const &string : strings) {
787c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes        enumeratorString += string;
788c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
789491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (string != strings.back()) {
790c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes            enumeratorString += '|';
791c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes        }
792c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    }
793c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
794c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    return enumeratorString;
795c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes}
796c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
797491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic bool ValidateEnumerator(VkShaderStageFlagBits const &enumerator) {
798491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkShaderStageFlagBits allFlags = (VkShaderStageFlagBits)(
799491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_SHADER_STAGE_ALL | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_COMPUTE_BIT |
800491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_VERTEX_BIT);
801491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & (~allFlags)) {
802ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return false;
803ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
804ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
805ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return true;
806ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
807ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
808491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::string EnumeratorString(VkShaderStageFlagBits const &enumerator) {
809491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (!ValidateEnumerator(enumerator)) {
810ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return "unrecognized enumerator";
811ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
812ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
813ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::vector<std::string> strings;
814491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_SHADER_STAGE_ALL) {
815e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_SHADER_STAGE_ALL");
816ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
817491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_SHADER_STAGE_FRAGMENT_BIT) {
818e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_SHADER_STAGE_FRAGMENT_BIT");
819ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
820491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_SHADER_STAGE_GEOMETRY_BIT) {
821e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_SHADER_STAGE_GEOMETRY_BIT");
822ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
823491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_SHADER_STAGE_COMPUTE_BIT) {
824e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_SHADER_STAGE_COMPUTE_BIT");
825ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
826491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
827c6fd2263876bb25d6ab7f2bfb76e6eab7b0d8053Courtney Goeltzenleuchter        strings.push_back("VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
828ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
829491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
830c6fd2263876bb25d6ab7f2bfb76e6eab7b0d8053Courtney Goeltzenleuchter        strings.push_back("VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT");
831ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
832491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_SHADER_STAGE_VERTEX_BIT) {
833e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_SHADER_STAGE_VERTEX_BIT");
834ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
835ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
836ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::string enumeratorString;
837491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    for (auto const &string : strings) {
838c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes        enumeratorString += string;
839c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
840491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (string != strings.back()) {
841c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes            enumeratorString += '|';
842c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes        }
843c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    }
844c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
845c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    return enumeratorString;
846c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes}
847c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
848491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic bool ValidateEnumerator(VkPipelineStageFlagBits const &enumerator) {
849cba6cea253a2c957d32251a1d0a455684a053539Chia-I Wu    VkPipelineStageFlagBits allFlags = (VkPipelineStageFlagBits)(
850491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_HOST_BIT |
851491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
852491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
853491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
854491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
855491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
856d3892692719770ca6cefb3d41071ce295e1be560Jon Ashburn        VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
857491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & (~allFlags)) {
858ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return false;
859ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
860ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
861ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return true;
862ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
863ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
864491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::string EnumeratorString(VkPipelineStageFlagBits const &enumerator) {
865491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (!ValidateEnumerator(enumerator)) {
866ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return "unrecognized enumerator";
867ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
868ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
869ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::vector<std::string> strings;
870491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) {
871cba6cea253a2c957d32251a1d0a455684a053539Chia-I Wu        strings.push_back("VK_PIPELINE_STAGE_ALL_COMMANDS_BIT");
872cba6cea253a2c957d32251a1d0a455684a053539Chia-I Wu    }
873491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT) {
874cba6cea253a2c957d32251a1d0a455684a053539Chia-I Wu        strings.push_back("VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT");
875ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
876491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_PIPELINE_STAGE_HOST_BIT) {
877e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_PIPELINE_STAGE_HOST_BIT");
878ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
879491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_PIPELINE_STAGE_TRANSFER_BIT) {
880e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_PIPELINE_STAGE_TRANSFER_BIT");
881ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
882491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) {
883e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT");
884ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
885491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT) {
886d3892692719770ca6cefb3d41071ce295e1be560Jon Ashburn        strings.push_back("VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT");
887ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
888491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) {
889e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT");
890ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
891491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT) {
892e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT");
893ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
894491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) {
895c6fd2263876bb25d6ab7f2bfb76e6eab7b0d8053Courtney Goeltzenleuchter        strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT");
896e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
897491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) {
898e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT");
899e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
900491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT) {
901e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT");
902e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
903491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_PIPELINE_STAGE_VERTEX_SHADER_BIT) {
904e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_PIPELINE_STAGE_VERTEX_SHADER_BIT");
905e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
906491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) {
907b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski        strings.push_back("VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT");
908e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
909491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_PIPELINE_STAGE_VERTEX_INPUT_BIT) {
910e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_PIPELINE_STAGE_VERTEX_INPUT_BIT");
911e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
912491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) {
913e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT");
914e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
915491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT) {
916e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT");
917e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
918491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) {
919e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT");
920ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
921ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
922ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::string enumeratorString;
923491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    for (auto const &string : strings) {
924ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        enumeratorString += string;
925ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
926491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (string != strings.back()) {
927ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes            enumeratorString += '|';
928ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        }
929ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
930ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
931ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return enumeratorString;
932ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
933ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
934491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic bool ValidateEnumerator(VkAccessFlagBits const &enumerator) {
935989de845e6627fecee8dceef882955149b7538baChia-I Wu    VkAccessFlagBits allFlags = (VkAccessFlagBits)(
936491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
937491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
938491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
939491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT |
940491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VK_ACCESS_HOST_READ_BIT | VK_ACCESS_HOST_WRITE_BIT | VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT);
941491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn
942491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & (~allFlags)) {
943ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return false;
944ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
945ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
946ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return true;
947ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
948ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
949491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::string EnumeratorString(VkAccessFlagBits const &enumerator) {
950491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (!ValidateEnumerator(enumerator)) {
951ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        return "unrecognized enumerator";
952ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
953ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
954ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::vector<std::string> strings;
955491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_ACCESS_INDIRECT_COMMAND_READ_BIT) {
956989de845e6627fecee8dceef882955149b7538baChia-I Wu        strings.push_back("VK_ACCESS_INDIRECT_COMMAND_READ_BIT");
957c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    }
958491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_ACCESS_INDEX_READ_BIT) {
959989de845e6627fecee8dceef882955149b7538baChia-I Wu        strings.push_back("VK_ACCESS_INDEX_READ_BIT");
960ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
961491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT) {
962989de845e6627fecee8dceef882955149b7538baChia-I Wu        strings.push_back("VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT");
963ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
964491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_ACCESS_UNIFORM_READ_BIT) {
965989de845e6627fecee8dceef882955149b7538baChia-I Wu        strings.push_back("VK_ACCESS_UNIFORM_READ_BIT");
966ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
967491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_ACCESS_INPUT_ATTACHMENT_READ_BIT) {
968989de845e6627fecee8dceef882955149b7538baChia-I Wu        strings.push_back("VK_ACCESS_INPUT_ATTACHMENT_READ_BIT");
969ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
970491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_ACCESS_SHADER_READ_BIT) {
971989de845e6627fecee8dceef882955149b7538baChia-I Wu        strings.push_back("VK_ACCESS_SHADER_READ_BIT");
972ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
973491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_ACCESS_SHADER_WRITE_BIT) {
974989de845e6627fecee8dceef882955149b7538baChia-I Wu        strings.push_back("VK_ACCESS_SHADER_WRITE_BIT");
975ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
976491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) {
977989de845e6627fecee8dceef882955149b7538baChia-I Wu        strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_READ_BIT");
978ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
979491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) {
980989de845e6627fecee8dceef882955149b7538baChia-I Wu        strings.push_back("VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT");
981ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
982491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) {
983989de845e6627fecee8dceef882955149b7538baChia-I Wu        strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT");
984ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
985491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT) {
986989de845e6627fecee8dceef882955149b7538baChia-I Wu        strings.push_back("VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT");
987ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
988491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_ACCESS_TRANSFER_READ_BIT) {
989989de845e6627fecee8dceef882955149b7538baChia-I Wu        strings.push_back("VK_ACCESS_TRANSFER_READ_BIT");
990ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
991491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_ACCESS_TRANSFER_WRITE_BIT) {
992989de845e6627fecee8dceef882955149b7538baChia-I Wu        strings.push_back("VK_ACCESS_TRANSFER_WRITE_BIT");
993ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
994491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_ACCESS_HOST_READ_BIT) {
995989de845e6627fecee8dceef882955149b7538baChia-I Wu        strings.push_back("VK_ACCESS_HOST_READ_BIT");
996ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
997491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_ACCESS_HOST_WRITE_BIT) {
998989de845e6627fecee8dceef882955149b7538baChia-I Wu        strings.push_back("VK_ACCESS_HOST_WRITE_BIT");
999ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
1000491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_ACCESS_MEMORY_READ_BIT) {
1001989de845e6627fecee8dceef882955149b7538baChia-I Wu        strings.push_back("VK_ACCESS_MEMORY_READ_BIT");
1002ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
1003491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_ACCESS_MEMORY_WRITE_BIT) {
1004989de845e6627fecee8dceef882955149b7538baChia-I Wu        strings.push_back("VK_ACCESS_MEMORY_WRITE_BIT");
1005ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
1006ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1007ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    std::string enumeratorString;
1008491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    for (auto const &string : strings) {
1009ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        enumeratorString += string;
1010ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1011491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (string != strings.back()) {
1012ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes            enumeratorString += '|';
1013ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes        }
1014ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
1015ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1016ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return enumeratorString;
1017ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
1018ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1019491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic bool ValidateEnumerator(VkCommandPoolCreateFlagBits const &enumerator) {
1020491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkCommandPoolCreateFlagBits allFlags =
1021491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        (VkCommandPoolCreateFlagBits)(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT);
1022491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & (~allFlags)) {
1023c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes        return false;
1024c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    }
1025c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
1026c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    return true;
1027c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes}
1028c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
1029491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::string EnumeratorString(VkCommandPoolCreateFlagBits const &enumerator) {
1030491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (!ValidateEnumerator(enumerator)) {
1031c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes        return "unrecognized enumerator";
1032c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    }
1033c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
1034c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    std::vector<std::string> strings;
1035491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT) {
10361f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu        strings.push_back("VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT");
1037e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
1038491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) {
10391f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu        strings.push_back("VK_COMMAND_POOL_CREATE_TRANSIENT_BIT");
1040c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    }
1041c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
1042c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    std::string enumeratorString;
1043491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    for (auto const &string : strings) {
1044c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes        enumeratorString += string;
1045c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
1046491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (string != strings.back()) {
1047c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes            enumeratorString += '|';
1048c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes        }
1049c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    }
1050c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
1051c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    return enumeratorString;
1052c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes}
1053c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
1054491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic bool ValidateEnumerator(VkCommandPoolResetFlagBits const &enumerator) {
1055b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    VkCommandPoolResetFlagBits allFlags = (VkCommandPoolResetFlagBits)(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
1056491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & (~allFlags)) {
1057e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        return false;
1058ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
1059ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1060e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    return true;
1061ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
1062ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1063491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::string EnumeratorString(VkCommandPoolResetFlagBits const &enumerator) {
1064491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (!ValidateEnumerator(enumerator)) {
1065e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        return "unrecognized enumerator";
1066ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
1067ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1068e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    std::vector<std::string> strings;
1069491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT) {
10701f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu        strings.push_back("VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT");
1071ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
1072ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1073e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    std::string enumeratorString;
1074491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    for (auto const &string : strings) {
1075e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        enumeratorString += string;
1076ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1077491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (string != strings.back()) {
1078e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes            enumeratorString += '|';
1079e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        }
1080e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
1081ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1082e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    return enumeratorString;
1083ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
1084ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1085491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic bool ValidateEnumerator(VkCommandBufferUsageFlags const &enumerator) {
1086491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkCommandBufferUsageFlags allFlags =
1087491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        (VkCommandBufferUsageFlags)(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT |
1088491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                                    VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
1089491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & (~allFlags)) {
1090c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes        return false;
1091ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
1092c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
1093c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    return true;
1094ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
1095ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1096491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::string EnumeratorString(VkCommandBufferUsageFlags const &enumerator) {
1097491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (!ValidateEnumerator(enumerator)) {
1098e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        return "unrecognized enumerator";
1099e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
1100ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1101e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    std::vector<std::string> strings;
1102491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) {
11031f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu        strings.push_back("VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT");
1104e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
1105491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
11061f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu        strings.push_back("VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT");
1107e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
1108491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
11091f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu        strings.push_back("VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
1110e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
1111e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1112e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    std::string enumeratorString;
1113491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    for (auto const &string : strings) {
1114e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        enumeratorString += string;
1115e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1116491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (string != strings.back()) {
1117e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes            enumeratorString += '|';
1118e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        }
1119e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
1120e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1121e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    return enumeratorString;
1122e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes}
1123e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1124491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic bool ValidateEnumerator(VkCommandBufferResetFlagBits const &enumerator) {
1125b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    VkCommandBufferResetFlagBits allFlags = (VkCommandBufferResetFlagBits)(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
1126491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & (~allFlags)) {
1127e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        return false;
1128e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
1129e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1130e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    return true;
1131e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes}
1132e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1133491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::string EnumeratorString(VkCommandBufferResetFlagBits const &enumerator) {
1134491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (!ValidateEnumerator(enumerator)) {
1135e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        return "unrecognized enumerator";
1136e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
1137e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1138e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    std::vector<std::string> strings;
1139491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT) {
11401f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu        strings.push_back("VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT");
1141e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
1142e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1143e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    std::string enumeratorString;
1144491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    for (auto const &string : strings) {
1145e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        enumeratorString += string;
1146e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1147491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (string != strings.back()) {
1148e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes            enumeratorString += '|';
1149e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        }
1150e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
1151e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1152e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    return enumeratorString;
1153e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes}
1154e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1155491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic bool ValidateEnumerator(VkImageAspectFlagBits const &enumerator) {
1156491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkImageAspectFlagBits allFlags = (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_METADATA_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
1157491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                                                             VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
1158491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & (~allFlags)) {
1159e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        return false;
1160e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
1161e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1162e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    return true;
1163e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes}
1164e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1165491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::string EnumeratorString(VkImageAspectFlagBits const &enumerator) {
1166491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (!ValidateEnumerator(enumerator)) {
1167e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        return "unrecognized enumerator";
1168e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
1169e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1170e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    std::vector<std::string> strings;
1171491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_IMAGE_ASPECT_METADATA_BIT) {
1172e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_IMAGE_ASPECT_METADATA_BIT");
1173e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
1174491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_IMAGE_ASPECT_STENCIL_BIT) {
1175e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_IMAGE_ASPECT_STENCIL_BIT");
1176e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
1177491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_IMAGE_ASPECT_DEPTH_BIT) {
1178e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_IMAGE_ASPECT_DEPTH_BIT");
1179e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
1180491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_IMAGE_ASPECT_COLOR_BIT) {
1181e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        strings.push_back("VK_IMAGE_ASPECT_COLOR_BIT");
1182e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
1183e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1184e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    std::string enumeratorString;
1185491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    for (auto const &string : strings) {
1186e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        enumeratorString += string;
1187e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1188491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (string != strings.back()) {
1189e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes            enumeratorString += '|';
1190e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        }
1191e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
1192e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1193e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    return enumeratorString;
1194e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes}
1195e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1196491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic bool ValidateEnumerator(VkQueryControlFlagBits const &enumerator) {
1197b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    VkQueryControlFlagBits allFlags = (VkQueryControlFlagBits)(VK_QUERY_CONTROL_PRECISE_BIT);
1198491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & (~allFlags)) {
1199e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        return false;
1200e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
1201e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1202e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    return true;
1203e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes}
1204e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1205491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::string EnumeratorString(VkQueryControlFlagBits const &enumerator) {
1206491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (!ValidateEnumerator(enumerator)) {
1207e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        return "unrecognized enumerator";
1208e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
1209e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1210e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    std::vector<std::string> strings;
1211491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (enumerator & VK_QUERY_CONTROL_PRECISE_BIT) {
1212c51b121913d6f21ccefb3f7595178d3c87e11de4Chia-I Wu        strings.push_back("VK_QUERY_CONTROL_PRECISE_BIT");
1213e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
1214e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1215e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    std::string enumeratorString;
1216491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    for (auto const &string : strings) {
1217e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        enumeratorString += string;
1218e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1219491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (string != strings.back()) {
1220e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes            enumeratorString += '|';
1221e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes        }
1222e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
1223e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1224e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    return enumeratorString;
1225e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes}
1226e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1227b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinskistatic const int MaxParamCheckerStringLength = 256;
1228b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski
12293755690f21851fc9a325acf2f6a68c680e40fe0dDustin Gravesstatic bool validate_string(debug_report_data *report_data, const char *apiName, const ParameterName &stringName,
1230bb84994a71bd9b17b407ac33eb82020014b8126aDustin Graves                            const char *validateString) {
12310a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves    assert(apiName != nullptr);
12320a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves    assert(validateString != nullptr);
12330a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves
1234956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
1235b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski
1236b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski    VkStringErrorFlags result = vk_string_validate(MaxParamCheckerStringLength, validateString);
1237b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski
1238b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski    if (result == VK_STRING_ERROR_NONE) {
1239956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        return skip_call;
1240b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski    } else if (result & VK_STRING_ERROR_LENGTH) {
12413755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves
12423755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves        skip_call = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
12433755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                            INVALID_USAGE, LayerName, "%s: string %s exceeds max length %d", apiName, stringName.get_name().c_str(),
12443755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                            MaxParamCheckerStringLength);
1245b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski    } else if (result & VK_STRING_ERROR_BAD_DATA) {
12463755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves        skip_call = log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
12473755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                            INVALID_USAGE, LayerName, "%s: string %s contains invalid characters or is badly formed", apiName,
12483755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                            stringName.get_name().c_str());
1249b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski    }
1250956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    return skip_call;
1251b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski}
1252b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski
1253fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Gravesstatic bool validate_queue_family_index(layer_data *device_data, const char *function_name, const char *parameter_name,
1254fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves                                        uint32_t index) {
1255fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves    assert(device_data != nullptr);
1256fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves    debug_report_data *report_data = device_data->report_data;
1257fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves    bool skip_call = false;
1258fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves
1259fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves    if (index == VK_QUEUE_FAMILY_IGNORED) {
1260825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski        skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
1261825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                             "%s: %s cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name);
1262fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves    } else {
1263fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves        const auto &queue_data = device_data->queueFamilyIndexMap.find(index);
1264fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves        if (queue_data == device_data->queueFamilyIndexMap.end()) {
1265fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves            skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1266825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                                 LayerName, "%s: %s (%d) must be one of the indices specified when the device was created, via "
1267825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                                            "the VkDeviceQueueCreateInfo structure.",
1268fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves                                 function_name, parameter_name, index);
1269fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves            return false;
1270fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves        }
1271fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves    }
1272fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves
1273fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves    return skip_call;
1274fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves}
1275fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves
1276fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Gravesstatic bool validate_queue_family_indices(layer_data *device_data, const char *function_name, const char *parameter_name,
1277fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves                                          const uint32_t count, const uint32_t *indices) {
1278fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves    assert(device_data != nullptr);
1279fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves    debug_report_data *report_data = device_data->report_data;
1280fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves    bool skip_call = false;
1281fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves
1282fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves    if (indices != nullptr) {
1283fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves        for (uint32_t i = 0; i < count; i++) {
1284fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves            if (indices[i] == VK_QUEUE_FAMILY_IGNORED) {
1285825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1286825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                                     LayerName, "%s: %s[%d] cannot be VK_QUEUE_FAMILY_IGNORED.", function_name, parameter_name, i);
1287fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves            } else {
1288fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves                const auto &queue_data = device_data->queueFamilyIndexMap.find(indices[i]);
1289fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves                if (queue_data == device_data->queueFamilyIndexMap.end()) {
1290fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves                    skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
1291825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                                         LayerName, "%s: %s[%d] (%d) must be one of the indices specified when the device was "
1292825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                                                    "created, via the VkDeviceQueueCreateInfo structure.",
1293fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves                                         function_name, parameter_name, i, indices[i]);
1294fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves                    return false;
1295fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves                }
1296fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves            }
1297fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves        }
1298fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves    }
1299fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves
1300fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves    return skip_call;
1301fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves}
1302fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves
13034b8a786c1c7a5ffb01a03078cacadfc2359a1c4aMark Lobodzinskistatic void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance);
13044b8a786c1c7a5ffb01a03078cacadfc2359a1c4aMark Lobodzinski
1305956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
1306956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                              VkInstance *pInstance) {
130780c0deae33503793ae085e775d75d77134ce7a54Dustin Graves    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1308e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1309491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
13100a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves    assert(chain_info != nullptr);
13110a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves    assert(chain_info->u.pLayerInfo != nullptr);
13120a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves
1313491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1314491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
131580c0deae33503793ae085e775d75d77134ce7a54Dustin Graves    if (fpCreateInstance == NULL) {
131680c0deae33503793ae085e775d75d77134ce7a54Dustin Graves        return VK_ERROR_INITIALIZATION_FAILED;
131780c0deae33503793ae085e775d75d77134ce7a54Dustin Graves    }
13182bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter
131980c0deae33503793ae085e775d75d77134ce7a54Dustin Graves    // Advance the link info for the next element on the chain
132080c0deae33503793ae085e775d75d77134ce7a54Dustin Graves    chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
13212bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter
132280c0deae33503793ae085e775d75d77134ce7a54Dustin Graves    result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
13232bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter
1324e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    if (result == VK_SUCCESS) {
1325e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1326e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        assert(my_instance_data != nullptr);
13270a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves
1328e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map);
13292bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter
1330e5ed0a0317fff097249065194049a589c0a3a3b2Chia-I Wu        my_instance_data->instance = *pInstance;
1331e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount,
1332e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves                                                                     pCreateInfo->ppEnabledExtensionNames);
1333b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski
1334f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott        // Look for one or more debug report create info structures
1335f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott        // and setup a callback(s) for each one found.
1336f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott        if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
1337f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott                                      &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
1338f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott            if (my_instance_data->num_tmp_callbacks > 0) {
1339f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott                // Setup the temporary callback(s) here to catch early issues:
1340f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott                if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1341f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott                                               my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
1342f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott                    // Failure of setting up one or more of the callback.
1343f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott                    // Therefore, clean up and don't use those callbacks:
1344f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott                    layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
1345f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott                    my_instance_data->num_tmp_callbacks = 0;
1346f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott                }
1347f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott            }
1348f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott        }
1349f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott
1350e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        init_parameter_validation(my_instance_data, pAllocator);
13514b8a786c1c7a5ffb01a03078cacadfc2359a1c4aMark Lobodzinski        CheckInstanceRegisterExtensions(pCreateInfo, *pInstance);
13522bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter
1353e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        // Ordinarily we'd check these before calling down the chain, but none of the layer
1354e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        // support is in place until now, if we survive we can report the issue now.
1355e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        parameter_validation_vkCreateInstance(my_instance_data->report_data, pCreateInfo, pAllocator, pInstance);
135680c0deae33503793ae085e775d75d77134ce7a54Dustin Graves
1357e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        if (pCreateInfo->pApplicationInfo) {
1358e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves            if (pCreateInfo->pApplicationInfo->pApplicationName) {
1359e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves                validate_string(my_instance_data->report_data, "vkCreateInstance",
1360e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves                                "pCreateInfo->VkApplicationInfo->pApplicationName",
1361e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves                                pCreateInfo->pApplicationInfo->pApplicationName);
1362e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves            }
13637b8770828012dce4593a05d8f3f90f703a734e14Courtney Goeltzenleuchter
1364e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves            if (pCreateInfo->pApplicationInfo->pEngineName) {
1365e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves                validate_string(my_instance_data->report_data, "vkCreateInstance", "pCreateInfo->VkApplicationInfo->pEngineName",
1366e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves                                pCreateInfo->pApplicationInfo->pEngineName);
1367e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves            }
1368cc8ae37e066787d702adff224677ca6a3872dd9aCourtney Goeltzenleuchter        }
1369f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott
1370f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott        // Disable the tmp callbacks:
1371f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott        if (my_instance_data->num_tmp_callbacks > 0) {
1372f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott            layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
1373f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott                                        my_instance_data->tmp_callbacks);
1374f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott        }
13757b8770828012dce4593a05d8f3f90f703a734e14Courtney Goeltzenleuchter    }
13767b8770828012dce4593a05d8f3f90f703a734e14Courtney Goeltzenleuchter
13772bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter    return result;
1378e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes}
1379e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
13807b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
1381e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    // Grab the key before the instance is destroyed.
1382e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    dispatch_key key = get_dispatch_key(instance);
1383956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
1384b57dd740fcf98ba3c3f4f2ce1dc4a168b4204765Courtney Goeltzenleuchter    layer_data *my_data = get_my_data_ptr(key, layer_data_map);
13853e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    assert(my_data != NULL);
13863e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
1387f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott    // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
1388f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott    bool callback_setup = false;
1389f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott    if (my_data->num_tmp_callbacks > 0) {
1390f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott        if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
1391f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott                                        my_data->tmp_callbacks)) {
1392f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott            callback_setup = true;
1393f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott        }
1394f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott    }
1395f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott
1396956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
13973e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
1398f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott    // Disable and cleanup the temporary callback(s):
1399f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott    if (callback_setup) {
1400f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott        layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
1401f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott    }
1402f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott    if (my_data->num_tmp_callbacks > 0) {
1403f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott        layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
1404f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott        my_data->num_tmp_callbacks = 0;
1405f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott    }
1406f0c42bb0a2bb448cacc157a158e9fc08171f8c6bIan Elliott
1407956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
1408491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
14093e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves        pTable->DestroyInstance(instance, pAllocator);
14103e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
14113e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves        // Clean up logging callback, if any
14123e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves        while (my_data->logging_callback.size() > 0) {
1413491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
1414491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
14153e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves            my_data->logging_callback.pop_back();
14163e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves        }
1417e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
14183e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves        layer_debug_report_destroy_instance(mid(instance));
14193e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves        layer_data_map.erase(pTable);
1420e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
14213e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves        pc_instance_table_map.erase(key);
1422875879e1a033b5d4b6c5f2ec644cf6dfdd5d59d7Tony Barbour        layer_data_map.erase(key);
14233e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    }
1424ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
1425ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
14269a5429d278c2afe9fb382d52fb4f325975d82b18Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
14279a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski                                                        VkPhysicalDevice *pPhysicalDevices) {
1428491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1429956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
1430491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
1431c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
1432c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1433956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkEnumeratePhysicalDevices(my_data->report_data, pPhysicalDeviceCount, pPhysicalDevices);
1434c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1435956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
1436491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        result = get_dispatch_table(pc_instance_table_map, instance)
1437491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                     ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
1438e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1439e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkEnumeratePhysicalDevices", result);
14409a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski        if ((result == VK_SUCCESS) && (NULL != pPhysicalDevices)) {
14419a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski            for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
14429a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski                layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(pPhysicalDevices[i]), layer_data_map);
14439a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski                // Save the supported features for each physical device
14449a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski                VkLayerInstanceDispatchTable *disp_table = get_dispatch_table(pc_instance_table_map, pPhysicalDevices[i]);
14459a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski                disp_table->GetPhysicalDeviceFeatures(pPhysicalDevices[i], &(phy_dev_data->physical_device_features));
14469a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski            }
14479a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski        }
1448c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
1449e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    return result;
1450e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes}
1451e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1452956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
1453956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
1454491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
1455c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
1456c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1457956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkGetPhysicalDeviceFeatures(my_data->report_data, pFeatures);
1458c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1459956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
1460c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
1461c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
1462e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes}
1463e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1464956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1465956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                             VkFormatProperties *pFormatProperties) {
1466956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
1467491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
1468c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
1469c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1470956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkGetPhysicalDeviceFormatProperties(my_data->report_data, format, pFormatProperties);
1471c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1472956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
1473491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_instance_table_map, physicalDevice)
1474491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
1475c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
1476ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
1477ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1478956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
1479956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                      VkImageType type, VkImageTiling tiling,
1480956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                      VkImageUsageFlags usage, VkImageCreateFlags flags,
1481956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                      VkImageFormatProperties *pImageFormatProperties) {
1482491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1483956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
1484491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
1485c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
1486c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1487956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkGetPhysicalDeviceImageFormatProperties(my_data->report_data, format, type, tiling, usage,
1488956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                               flags, pImageFormatProperties);
1489c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1490956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
1491491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        result = get_dispatch_table(pc_instance_table_map, physicalDevice)
1492491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                     ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags,
1493491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                                                              pImageFormatProperties);
1494ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1495e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkGetPhysicalDeviceImageFormatProperties", result);
1496c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
14975202c54bd0212e17a51d6183e9a7ecd9517f233cChia-I Wu
14985202c54bd0212e17a51d6183e9a7ecd9517f233cChia-I Wu    return result;
1499ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
1500ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1501956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
1502956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
1503491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
1504c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
1505c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1506956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkGetPhysicalDeviceProperties(my_data->report_data, pProperties);
1507ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1508956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
1509c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
1510c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
1511ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
1512ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1513956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
1514956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                  uint32_t *pQueueFamilyPropertyCount,
1515956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                  VkQueueFamilyProperties *pQueueFamilyProperties) {
1516956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
1517491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
1518c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
1519c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1520956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkGetPhysicalDeviceQueueFamilyProperties(my_data->report_data, pQueueFamilyPropertyCount,
1521956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                               pQueueFamilyProperties);
1522c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1523956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
1524491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_instance_table_map, physicalDevice)
1525491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
1526ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
1527ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
1528ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1529956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
1530956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                             VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
1531956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
1532491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
1533c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
1534c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1535956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkGetPhysicalDeviceMemoryProperties(my_data->report_data, pMemoryProperties);
1536e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1537956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
1538491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_instance_table_map, physicalDevice)
1539491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            ->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
1540c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
1541e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes}
1542e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1543491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnvoid validateDeviceCreateInfo(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
1544491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                              const std::vector<VkQueueFamilyProperties> properties) {
154584db6f59e3592edf7ba313c7d67f9db2af82d841Michael Lentine    std::unordered_set<uint32_t> set;
15460a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves
15470a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves    if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
15480a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves        for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
15490a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves            if (set.count(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex)) {
1550ce31fbafc11ffa7749cf95c7ff16a96507a28225Dustin Graves                log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1551825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                        INVALID_USAGE, LayerName,
15520a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves                        "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex, is not unique within this "
15530a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves                        "structure.",
15540a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves                        i);
15550a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves            } else {
15560a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves                set.insert(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex);
1557297587825976827b18a69a1cb42f9fa9a11e32c6Michael Lentine            }
15580a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves
15590a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves            if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
15600a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves                for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
15610a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves                    if ((pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] < 0.f) ||
15620a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves                        (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j] > 1.f)) {
1563ce31fbafc11ffa7749cf95c7ff16a96507a28225Dustin Graves                        log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
1564825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                                __LINE__, INVALID_USAGE, LayerName,
15650a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves                                "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->pQueuePriorities[%d], must be "
15660a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves                                "between 0 and 1. Actual value is %f",
15670a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves                                i, j, pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j]);
15680a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves                    }
15690a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves                }
15700a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves            }
15710a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves
15720a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves            if (pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex >= properties.size()) {
15730a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves                log_msg(
1574ce31fbafc11ffa7749cf95c7ff16a96507a28225Dustin Graves                    mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1575825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                    INVALID_USAGE, LayerName,
1576491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                    "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueFamilyIndex cannot be more than the number "
1577491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                    "of queue families.",
1578491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                    i);
15790a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves            } else if (pCreateInfo->pQueueCreateInfos[i].queueCount >
15800a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves                       properties[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex].queueCount) {
15810a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves                log_msg(
1582ce31fbafc11ffa7749cf95c7ff16a96507a28225Dustin Graves                    mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
1583825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                    INVALID_USAGE, LayerName,
1584491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                    "VkDeviceCreateInfo parameter, uint32_t pQueueCreateInfos[%d]->queueCount cannot be more than the number of "
1585491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                    "queues for the given family index.",
1586491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                    i);
15870a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves            }
1588a1cde23fac60d07c0d77a776eb2399dae73bde60Michael Lentine        }
158984db6f59e3592edf7ba313c7d67f9db2af82d841Michael Lentine    }
159084db6f59e3592edf7ba313c7d67f9db2af82d841Michael Lentine}
159184db6f59e3592edf7ba313c7d67f9db2af82d841Michael Lentine
15928c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinskistatic void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) {
1593956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    VkLayerInstanceDispatchTable *dispatch_table = get_dispatch_table(pc_instance_table_map, instance);
15948c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
1595956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    instance_extension_map[dispatch_table] = {};
15968c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
15978c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
15988c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
1599956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski            instance_extension_map[dispatch_table].wsi_enabled = true;
16008c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        }
16018c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#ifdef VK_USE_PLATFORM_XLIB_KHR
16028c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
1603956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski            instance_extension_map[dispatch_table].xlib_enabled = true;
16048c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        }
16058c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#endif
16068c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#ifdef VK_USE_PLATFORM_XCB_KHR
16078c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
1608956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski            instance_extension_map[dispatch_table].xcb_enabled = true;
16098c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        }
16108c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#endif
16118c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#ifdef VK_USE_PLATFORM_WAYLAND_KHR
16128c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
1613956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski            instance_extension_map[dispatch_table].wayland_enabled = true;
16148c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        }
16158c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#endif
16168c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#ifdef VK_USE_PLATFORM_MIR_KHR
16178c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
1618956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski            instance_extension_map[dispatch_table].mir_enabled = true;
16198c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        }
16208c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#endif
16218c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#ifdef VK_USE_PLATFORM_ANDROID_KHR
16228c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
1623956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski            instance_extension_map[dispatch_table].android_enabled = true;
16248c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        }
16258c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#endif
16268c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#ifdef VK_USE_PLATFORM_WIN32_KHR
16278c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
1628956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski            instance_extension_map[dispatch_table].win32_enabled = true;
16298c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        }
16308c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#endif
16318c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    }
16328c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski}
16338c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
16348c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinskistatic void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
16358c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
16368c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    device_data->wsi_enabled = false;
163719ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young    device_data->wsi_display_swapchain_enabled = false;
16388c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
16398c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
16408c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
16418c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski            device_data->wsi_enabled = true;
16428c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        }
164319ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young        if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) {
164419ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young            device_data->wsi_display_swapchain_enabled = true;
164519ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young        }
16468c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    }
16478c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski}
16488c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
1649491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnvoid storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInfo) {
1650b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
16510a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves
16520a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves    if ((pCreateInfo != nullptr) && (pCreateInfo->pQueueCreateInfos != nullptr)) {
16530a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves        for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
16540a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves            my_device_data->queueFamilyIndexMap.insert(
16550a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves                std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
16560a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves        }
16571595771772e0563fd9071b15e61e2825ab4754afMichael Lentine    }
16581595771772e0563fd9071b15e61e2825ab4754afMichael Lentine}
16591595771772e0563fd9071b15e61e2825ab4754afMichael Lentine
1660956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
16617b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I Wu                                            const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
1662f004499e0c232374e63c6ebf3af467d8b3c32a8fCourtney Goeltzenleuchter    /*
1663f004499e0c232374e63c6ebf3af467d8b3c32a8fCourtney Goeltzenleuchter     * NOTE: We do not validate physicalDevice or any dispatchable
1664f004499e0c232374e63c6ebf3af467d8b3c32a8fCourtney Goeltzenleuchter     * object as the first parameter. We couldn't get here if it was wrong!
1665f004499e0c232374e63c6ebf3af467d8b3c32a8fCourtney Goeltzenleuchter     */
16662bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter
1667b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1668956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
1669b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski    layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
16700a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves    assert(my_instance_data != nullptr);
1671e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
1672956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCreateDevice(my_instance_data->report_data, pCreateInfo, pAllocator, pDevice);
167380c0deae33503793ae085e775d75d77134ce7a54Dustin Graves
16740a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves    if (pCreateInfo != NULL) {
16750a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves        if ((pCreateInfo->enabledLayerCount > 0) && (pCreateInfo->ppEnabledLayerNames != NULL)) {
1676c3fc3d8e91f24136f4e2cc036e92033b826a96e7Dustin Graves            for (size_t i = 0; i < pCreateInfo->enabledLayerCount; i++) {
1677956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                skip_call |= validate_string(my_instance_data->report_data, "vkCreateDevice", "pCreateInfo->ppEnabledLayerNames",
1678956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                             pCreateInfo->ppEnabledLayerNames[i]);
16790a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves            }
1680c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        }
16812bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter
16820a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves        if ((pCreateInfo->enabledExtensionCount > 0) && (pCreateInfo->ppEnabledExtensionNames != NULL)) {
1683c3fc3d8e91f24136f4e2cc036e92033b826a96e7Dustin Graves            for (size_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
1684956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                skip_call |= validate_string(my_instance_data->report_data, "vkCreateDevice",
1685956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                             "pCreateInfo->ppEnabledExtensionNames", pCreateInfo->ppEnabledExtensionNames[i]);
16860a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves            }
1687c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        }
16882bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter    }
16892bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter
1690956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
1691b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski        VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
16920a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves        assert(chain_info != nullptr);
16930a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves        assert(chain_info->u.pLayerInfo != nullptr);
16940a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves
1695b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski        PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
1696b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski        PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
1697e5ed0a0317fff097249065194049a589c0a3a3b2Chia-I Wu        PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
1698b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski        if (fpCreateDevice == NULL) {
1699b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski            return VK_ERROR_INITIALIZATION_FAILED;
1700b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski        }
1701b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski
1702b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski        // Advance the link info for the next element on the chain
1703b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski        chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
1704b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski
1705b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski        result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
17062bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter
1707e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_instance_data->report_data, "vkCreateDevice", result);
17080a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves
1709e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        if (result == VK_SUCCESS) {
1710e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves            layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1711e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves            assert(my_device_data != nullptr);
1712a1cde23fac60d07c0d77a776eb2399dae73bde60Michael Lentine
1713e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves            my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
1714e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves            initDeviceTable(*pDevice, fpGetDeviceProcAddr, pc_device_table_map);
1715e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves
17168c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski            CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
17178c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
1718e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves            uint32_t count;
17193d547177aa38a05853d13b1d9b1ce80ca9a94d9fMark Lobodzinski            VkLayerInstanceDispatchTable *instance_dispatch_table = get_dispatch_table(pc_instance_table_map, physicalDevice);
17203d547177aa38a05853d13b1d9b1ce80ca9a94d9fMark Lobodzinski            instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr);
1721e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves            std::vector<VkQueueFamilyProperties> properties(count);
17223d547177aa38a05853d13b1d9b1ce80ca9a94d9fMark Lobodzinski            instance_dispatch_table->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, &properties[0]);
1723b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski
1724e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves            validateDeviceCreateInfo(physicalDevice, pCreateInfo, properties);
1725e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves            storeCreateDeviceData(*pDevice, pCreateInfo);
17263d547177aa38a05853d13b1d9b1ce80ca9a94d9fMark Lobodzinski
17273d547177aa38a05853d13b1d9b1ce80ca9a94d9fMark Lobodzinski            // Query and save physical device limits for this device
17283d547177aa38a05853d13b1d9b1ce80ca9a94d9fMark Lobodzinski            VkPhysicalDeviceProperties device_properties = {};
17293d547177aa38a05853d13b1d9b1ce80ca9a94d9fMark Lobodzinski            instance_dispatch_table->GetPhysicalDeviceProperties(physicalDevice, &device_properties);
17303d547177aa38a05853d13b1d9b1ce80ca9a94d9fMark Lobodzinski            memcpy(&my_device_data->device_limits, &device_properties.limits, sizeof(VkPhysicalDeviceLimits));
17319a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski            my_device_data->physical_device = physicalDevice;
173226e15dcde463371a8c1cd5ff1c68d583cb72ed56Mark Lobodzinski
173326e15dcde463371a8c1cd5ff1c68d583cb72ed56Mark Lobodzinski            // Save app-enabled features in this device's layer_data structure
173426e15dcde463371a8c1cd5ff1c68d583cb72ed56Mark Lobodzinski            if (pCreateInfo->pEnabledFeatures) {
173526e15dcde463371a8c1cd5ff1c68d583cb72ed56Mark Lobodzinski                my_device_data->physical_device_features = *pCreateInfo->pEnabledFeatures;
173626e15dcde463371a8c1cd5ff1c68d583cb72ed56Mark Lobodzinski            } else {
173726e15dcde463371a8c1cd5ff1c68d583cb72ed56Mark Lobodzinski                memset(&my_device_data->physical_device_features, 0, sizeof(VkPhysicalDeviceFeatures));
173826e15dcde463371a8c1cd5ff1c68d583cb72ed56Mark Lobodzinski            }
1739e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        }
1740b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski    }
174184db6f59e3592edf7ba313c7d67f9db2af82d841Michael Lentine
1742e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    return result;
1743e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes}
1744e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
17457b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
1746e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    dispatch_key key = get_dispatch_key(device);
1747956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
17483e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    layer_data *my_data = get_my_data_ptr(key, layer_data_map);
17493e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    assert(my_data != NULL);
17503e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
1751956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkDestroyDevice(my_data->report_data, pAllocator);
17523e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
1753956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
17543e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves        layer_debug_report_destroy_device(device);
17553e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
1756e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes#if DISPATCH_MAP_DEBUG
1757414e9a4117b500eac650d8b8f01a6e1b22d05aaeMark Mueller        fprintf(stderr, "Device:  0x%p, key:  0x%p\n", device, key);
1758e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes#endif
1759ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1760491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, device)->DestroyDevice(device, pAllocator);
17613e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves        pc_device_table_map.erase(key);
176254b6f13e4c26928fcca7b09fa81959a5a062ee96Tony Barbour        layer_data_map.erase(key);
17633e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    }
1764ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
1765ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1766491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnbool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
1767b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
17680a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves    assert(my_device_data != nullptr);
17690a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves
1770fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves    validate_queue_family_index(my_device_data, "vkGetDeviceQueue", "queueFamilyIndex", queueFamilyIndex);
17710a8fda57046dcafc120dcd2a1b6181c5e239efd2Dustin Graves
177247892024546c67e8db98b51b2ddb962c21088894Mark Lobodzinski    const auto &queue_data = my_device_data->queueFamilyIndexMap.find(queueFamilyIndex);
17731595771772e0563fd9071b15e61e2825ab4754afMichael Lentine    if (queue_data->second <= queueIndex) {
1774ce31fbafc11ffa7749cf95c7ff16a96507a28225Dustin Graves        log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_USAGE,
1775956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                LayerName,
1776491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                "VkGetDeviceQueue parameter, uint32_t queueIndex %d, must be less than the number of queues given when the device "
1777491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                "was created.",
1778491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                queueIndex);
17791595771772e0563fd9071b15e61e2825ab4754afMichael Lentine        return false;
17801595771772e0563fd9071b15e61e2825ab4754afMichael Lentine    }
17811595771772e0563fd9071b15e61e2825ab4754afMichael Lentine    return true;
17821595771772e0563fd9071b15e61e2825ab4754afMichael Lentine}
17831595771772e0563fd9071b15e61e2825ab4754afMichael Lentine
1784956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
1785956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
1786491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1787c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
1788c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1789956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkGetDeviceQueue(my_data->report_data, queueFamilyIndex, queueIndex, pQueue);
1790c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1791956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
1792c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        PreGetDeviceQueue(device, queueFamilyIndex, queueIndex);
17931595771772e0563fd9071b15e61e2825ab4754afMichael Lentine
1794c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        get_dispatch_table(pc_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
1795ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
1796ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
1797ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1798956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
1799491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1800956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
1801491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1802c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
1803c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1804956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkQueueSubmit(my_data->report_data, submitCount, pSubmits, fence);
1805c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1806956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
1807c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        result = get_dispatch_table(pc_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
1808ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1809e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkQueueSubmit", result);
1810c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
1811ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1812ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
1813ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
1814ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
18157b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
1816e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
1817e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    assert(my_data != NULL);
1818e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves
1819b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    VkResult result = get_dispatch_table(pc_device_table_map, queue)->QueueWaitIdle(queue);
1820ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1821e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    validate_result(my_data->report_data, "vkQueueWaitIdle", result);
1822ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1823ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
1824ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
1825ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
18267b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
1827e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1828e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    assert(my_data != NULL);
1829e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves
1830b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    VkResult result = get_dispatch_table(pc_device_table_map, device)->DeviceWaitIdle(device);
1831ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1832e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    validate_result(my_data->report_data, "vkDeviceWaitIdle", result);
1833ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1834ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
1835ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
1836ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
18377b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
1838956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                              const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
1839491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1840956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
1841491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1842c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
1843c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
1844956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkAllocateMemory(my_data->report_data, pAllocateInfo, pAllocator, pMemory);
1845c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1846956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
1847c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        result = get_dispatch_table(pc_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1848c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1849e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkAllocateMemory", result);
1850c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
1851ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1852ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
1853ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
1854ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1855956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
1856956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
1857491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
18583e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    assert(my_data != NULL);
18593e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
1860956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkFreeMemory(my_data->report_data, memory, pAllocator);
18613e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
1862956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
1863491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, device)->FreeMemory(device, memory, pAllocator);
18643e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    }
18653e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves}
18663e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
1867956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
1868956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                         VkMemoryMapFlags flags, void **ppData) {
1869491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1870956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
1871491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1872c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
1873ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1874956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkMapMemory(my_data->report_data, memory, offset, size, flags, ppData);
1875c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1876956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
1877c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        result = get_dispatch_table(pc_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
1878c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1879e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkMapMemory", result);
1880c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
1881ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1882ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
1883ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
1884ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
18857b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
1886956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
1887cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1888cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    assert(my_data != NULL);
1889cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
1890956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkUnmapMemory(my_data->report_data, memory);
1891cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
1892956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
1893cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        get_dispatch_table(pc_device_table_map, device)->UnmapMemory(device, memory);
1894cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    }
1895cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves}
1896cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
1897956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1898956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                       const VkMappedMemoryRange *pMemoryRanges) {
1899491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1900956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
1901491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1902c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
1903c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1904956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkFlushMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
1905c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
1906956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
1907c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        result = get_dispatch_table(pc_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1908ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1909e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkFlushMappedMemoryRanges", result);
1910c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
1911ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1912ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
1913ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
1914ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1915956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1916956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                            const VkMappedMemoryRange *pMemoryRanges) {
1917491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1918956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
1919491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1920c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
1921c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1922956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkInvalidateMappedMemoryRanges(my_data->report_data, memoryRangeCount, pMemoryRanges);
1923c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1924956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
1925491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        result =
1926491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            get_dispatch_table(pc_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1927ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1928e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkInvalidateMappedMemoryRanges", result);
1929c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
1930ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1931ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
1932ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
1933ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1934956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
1935956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                     VkDeviceSize *pCommittedMemoryInBytes) {
1936956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
1937491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1938c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
1939c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1940956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkGetDeviceMemoryCommitment(my_data->report_data, memory, pCommittedMemoryInBytes);
1941c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1942956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
1943c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        get_dispatch_table(pc_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
1944c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
1945d040c5c25acbea9cacfa90e346fe3a6095a15135Courtney Goeltzenleuchter}
1946d040c5c25acbea9cacfa90e346fe3a6095a15135Courtney Goeltzenleuchter
19477b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
19487b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I Wu                                                VkDeviceSize memoryOffset) {
1949cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1950956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
1951e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1952e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    assert(my_data != NULL);
1953e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves
1954956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkBindBufferMemory(my_data->report_data, buffer, memory, memoryOffset);
1955ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1956956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
1957cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        result = get_dispatch_table(pc_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
1958cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
1959cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        validate_result(my_data->report_data, "vkBindBufferMemory", result);
1960cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    }
1961ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1962ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
1963ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
1964ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1965956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
1966cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
1967956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
1968e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1969e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    assert(my_data != NULL);
1970e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves
1971956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkBindImageMemory(my_data->report_data, image, memory, memoryOffset);
1972ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1973956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
1974cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        result = get_dispatch_table(pc_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
1975cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
1976cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        validate_result(my_data->report_data, "vkBindImageMemory", result);
1977cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    }
1978ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1979ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
1980ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
1981ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1982956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1983956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                       VkMemoryRequirements *pMemoryRequirements) {
1984956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
1985491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1986c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
1987c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
1988956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkGetBufferMemoryRequirements(my_data->report_data, buffer, pMemoryRequirements);
1989ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1990956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
1991c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        get_dispatch_table(pc_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
1992c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
1993ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
1994ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
1995956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
1996956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
1997491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1998c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
1999ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2000956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkGetImageMemoryRequirements(my_data->report_data, image, pMemoryRequirements);
2001c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2002956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2003c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        get_dispatch_table(pc_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
2004c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
2005ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
2006ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2007491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnbool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pNumRequirements,
2008491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                                          VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2009491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (pSparseMemoryRequirements != nullptr) {
20104687f2601670ce1e77546d7f59f432f703503e83Dustin Graves        if ((pSparseMemoryRequirements->formatProperties.aspectMask &
2011491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn             (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2012491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn              VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
2013ce31fbafc11ffa7749cf95c7ff16a96507a28225Dustin Graves            log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2014825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                    UNRECOGNIZED_VALUE, LayerName,
2015491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                    "vkGetImageSparseMemoryRequirements parameter, VkImageAspect "
2016491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                    "pSparseMemoryRequirements->formatProperties.aspectMask, is an unrecognized enumerator");
20174687f2601670ce1e77546d7f59f432f703503e83Dustin Graves            return false;
20184687f2601670ce1e77546d7f59f432f703503e83Dustin Graves        }
2019ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
2020ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2021c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    return true;
2022ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
2023ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2024956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
2025956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                            VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2026956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2027491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2028c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
2029c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2030956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkGetImageSparseMemoryRequirements(my_data->report_data, image, pSparseMemoryRequirementCount,
2031956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                         pSparseMemoryRequirements);
2032ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2033956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2034491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, device)
2035491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2036c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2037c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        PostGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2038c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
2039ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
2040ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2041491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnbool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2042491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                                                      VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2043491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                                                      uint32_t *pNumProperties, VkSparseImageFormatProperties *pProperties) {
2044491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (pProperties != nullptr) {
2045491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if ((pProperties->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2046491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                                        VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
2047ce31fbafc11ffa7749cf95c7ff16a96507a28225Dustin Graves            log_msg(mdd(physicalDevice), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 1,
2048825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                    LayerName,
2049491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                    "vkGetPhysicalDeviceSparseImageFormatProperties parameter, VkImageAspect pProperties->aspectMask, is an "
2050491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                    "unrecognized enumerator");
20514687f2601670ce1e77546d7f59f432f703503e83Dustin Graves            return false;
20524687f2601670ce1e77546d7f59f432f703503e83Dustin Graves        }
2053ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    }
2054ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2055c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    return true;
2056c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes}
2057c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
2058956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
2059956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                        VkImageType type, VkSampleCountFlagBits samples,
2060956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                        VkImageUsageFlags usage, VkImageTiling tiling,
2061956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                        uint32_t *pPropertyCount,
2062956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                        VkSparseImageFormatProperties *pProperties) {
2063956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2064491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
2065c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
2066c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2067956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkGetPhysicalDeviceSparseImageFormatProperties(my_data->report_data, format, type, samples,
2068956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                                     usage, tiling, pPropertyCount, pProperties);
2069c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
2070956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2071491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_instance_table_map, physicalDevice)
2072491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2073491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                                                           pProperties);
2074c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2075491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        PostGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
2076491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                                                         pProperties);
2077c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
2078c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes}
2079c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
2080956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
2081956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                               VkFence fence) {
2082491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2083956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2084491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
2085c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
2086c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
2087956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkQueueBindSparse(my_data->report_data, bindInfoCount, pBindInfo, fence);
2088c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
2089956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2090c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        result = get_dispatch_table(pc_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
2091c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2092e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkQueueBindSparse", result);
2093c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
2094c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
2095c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    return result;
2096c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes}
2097c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
2098956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2099956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                           const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
2100491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2101956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2102491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2103c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
2104c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
2105956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCreateFence(my_data->report_data, pCreateInfo, pAllocator, pFence);
2106ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2107956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2108c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        result = get_dispatch_table(pc_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
2109c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2110e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkCreateFence", result);
2111c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
2112ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2113ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
2114ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
2115ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
21167b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
2117956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2118491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
21193e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    assert(my_data != NULL);
21203e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
2121956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkDestroyFence(my_data->report_data, fence, pAllocator);
21223e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
2123956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2124491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, device)->DestroyFence(device, fence, pAllocator);
21253e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    }
21263e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves}
21273e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
21287b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
2129491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2130956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2131491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2132c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
2133c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2134956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkResetFences(my_data->report_data, fenceCount, pFences);
2135c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
2136956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2137c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        result = get_dispatch_table(pc_device_table_map, device)->ResetFences(device, fenceCount, pFences);
2138ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2139e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkResetFences", result);
2140c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
2141ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2142ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
2143ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
2144ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
21457b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
2146cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2147956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2148e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2149e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    assert(my_data != NULL);
2150e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves
2151956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkGetFenceStatus(my_data->report_data, fence);
2152ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2153956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2154cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        result = get_dispatch_table(pc_device_table_map, device)->GetFenceStatus(device, fence);
2155cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
2156cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        validate_result(my_data->report_data, "vkGetFenceStatus", result);
2157cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    }
2158ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2159ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
2160ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
2161ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2162956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
2163956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                             uint64_t timeout) {
2164491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2165956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2166491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2167c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
2168c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2169956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkWaitForFences(my_data->report_data, fenceCount, pFences, waitAll, timeout);
2170c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2171956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2172c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        result = get_dispatch_table(pc_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
2173ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2174e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkWaitForFences", result);
2175c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
2176ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2177ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
2178ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
2179ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
21807b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
2181956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                               const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
2182491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2183956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2184491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2185c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
2186c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
2187956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCreateSemaphore(my_data->report_data, pCreateInfo, pAllocator, pSemaphore);
2188ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2189956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2190c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        result = get_dispatch_table(pc_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
2191c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2192e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkCreateSemaphore", result);
2193c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
2194ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2195ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
2196ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
2197ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2198956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
2199956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2200491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
22013e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    assert(my_data != NULL);
22023e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
2203956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkDestroySemaphore(my_data->report_data, semaphore, pAllocator);
22043e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
2205956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2206491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
22073e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    }
22083e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves}
22093e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
2210956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
2211956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                           const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
2212491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2213956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2214491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2215c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
2216c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2217956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCreateEvent(my_data->report_data, pCreateInfo, pAllocator, pEvent);
2218c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
2219956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2220c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        result = get_dispatch_table(pc_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
2221c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2222e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkCreateEvent", result);
2223c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
2224ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2225ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
2226ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
2227ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
22287b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
2229956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2230491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
22313e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    assert(my_data != NULL);
22323e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
2233956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkDestroyEvent(my_data->report_data, event, pAllocator);
22343e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
2235956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2236491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, device)->DestroyEvent(device, event, pAllocator);
22373e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    }
22383e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves}
22393e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
22407b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
2241cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2242956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2243e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2244e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    assert(my_data != NULL);
2245e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves
2246956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkGetEventStatus(my_data->report_data, event);
2247cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
2248956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2249cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        result = get_dispatch_table(pc_device_table_map, device)->GetEventStatus(device, event);
2250ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2251cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        validate_result(my_data->report_data, "vkGetEventStatus", result);
2252cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    }
2253ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2254ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
2255ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
2256ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
22577b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
2258cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2259956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2260e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2261e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    assert(my_data != NULL);
2262e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves
2263956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkSetEvent(my_data->report_data, event);
2264ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2265956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2266cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        result = get_dispatch_table(pc_device_table_map, device)->SetEvent(device, event);
2267cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
2268cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        validate_result(my_data->report_data, "vkSetEvent", result);
2269cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    }
2270ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2271ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
2272ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
2273ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
22747b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
2275cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2276956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2277e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2278e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    assert(my_data != NULL);
2279e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves
2280956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkResetEvent(my_data->report_data, event);
2281ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2282956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2283cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        result = get_dispatch_table(pc_device_table_map, device)->ResetEvent(device, event);
2284cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
2285cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        validate_result(my_data->report_data, "vkResetEvent", result);
2286cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    }
2287ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2288ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
2289ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
2290ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
22917b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
2292956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                               const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
2293491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2294ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    bool skip_call = false;
2295ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2296ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    assert(device_data != nullptr);
2297ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    debug_report_data *report_data = device_data->report_data;
2298c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
2299ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    skip_call |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool);
2300ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2301ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2302ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    if (pCreateInfo != nullptr) {
2303ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of
2304ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        // VkQueryPipelineStatisticFlagBits values
2305ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) &&
2306ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) {
2307ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            skip_call |=
2308ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2309ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is "
2310ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                                       "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be "
2311ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                                       "a valid combination of VkQueryPipelineStatisticFlagBits values");
2312ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        }
2313ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    }
2314ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
2315ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    if (!skip_call) {
2316c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
2317c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2318ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        validate_result(report_data, "vkCreateQueryPool", result);
2319c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
2320ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2321ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
2322ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
2323ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2324956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
2325956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2326491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
23273e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    assert(my_data != NULL);
23283e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
2329956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkDestroyQueryPool(my_data->report_data, queryPool, pAllocator);
23303e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
2331956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2332491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
2333491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    }
2334491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn}
2335491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn
2336956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
2337956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                   size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
2338491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2339956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2340491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2341c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
2342c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2343956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkGetQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dataSize,
2344956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                            pData, stride, flags);
2345ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2346956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2347491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        result = get_dispatch_table(pc_device_table_map, device)
2348491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                     ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
2349c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2350e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkGetQueryPoolResults", result);
2351c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
2352ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2353ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
2354ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
2355ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2356956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
2357956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                            const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
2358491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2359ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    bool skip_call = false;
2360ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2361ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    assert(device_data != nullptr);
2362ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    debug_report_data *report_data = device_data->report_data;
2363c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
23644f38db6ace251a2f5302c9de6c5d7c791a610505Karl Schultz    // TODO: Add check for VALIDATION_ERROR_00660
23654f38db6ace251a2f5302c9de6c5d7c791a610505Karl Schultz    // TODO: Add check for VALIDATION_ERROR_00661
23664f38db6ace251a2f5302c9de6c5d7c791a610505Karl Schultz    // TODO: Add check for VALIDATION_ERROR_00662
23674f38db6ace251a2f5302c9de6c5d7c791a610505Karl Schultz    // TODO: Add check for VALIDATION_ERROR_00670
23684f38db6ace251a2f5302c9de6c5d7c791a610505Karl Schultz    // TODO: Add check for VALIDATION_ERROR_00671
23694f38db6ace251a2f5302c9de6c5d7c791a610505Karl Schultz    // TODO: Add check for VALIDATION_ERROR_00672
23704f38db6ace251a2f5302c9de6c5d7c791a610505Karl Schultz    // TODO: Add check for VALIDATION_ERROR_00673
23714f38db6ace251a2f5302c9de6c5d7c791a610505Karl Schultz    // TODO: Add check for VALIDATION_ERROR_00674
23724f38db6ace251a2f5302c9de6c5d7c791a610505Karl Schultz    // TODO: Add check for VALIDATION_ERROR_00675
23734f38db6ace251a2f5302c9de6c5d7c791a610505Karl Schultz    // TODO: Note that the above errors need to be generated from the next function, which is codegened.
23744f38db6ace251a2f5302c9de6c5d7c791a610505Karl Schultz    // TODO: Add check for VALIDATION_ERROR_00663
2375ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    skip_call |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer);
2376c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2377ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    if (pCreateInfo != nullptr) {
2378ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2379ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2380ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2381ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            if (pCreateInfo->queueFamilyIndexCount <= 1) {
23824f38db6ace251a2f5302c9de6c5d7c791a610505Karl Schultz                skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
23834f38db6ace251a2f5302c9de6c5d7c791a610505Karl Schultz                                     __LINE__, VALIDATION_ERROR_00665, LayerName,
23844f38db6ace251a2f5302c9de6c5d7c791a610505Karl Schultz                                     "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
23854f38db6ace251a2f5302c9de6c5d7c791a610505Karl Schultz                                     "pCreateInfo->queueFamilyIndexCount must be greater than 1. %s",
23864f38db6ace251a2f5302c9de6c5d7c791a610505Karl Schultz                                     validation_error_map[VALIDATION_ERROR_00665]);
2387ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            }
2388c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
2389ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2390ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            // queueFamilyIndexCount uint32_t values
2391ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2392ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
23934f38db6ace251a2f5302c9de6c5d7c791a610505Karl Schultz                                     __LINE__, VALIDATION_ERROR_00664, LayerName,
2394ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                     "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2395ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                     "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
23964f38db6ace251a2f5302c9de6c5d7c791a610505Karl Schultz                                     "pCreateInfo->queueFamilyIndexCount uint32_t values. %s",
23974f38db6ace251a2f5302c9de6c5d7c791a610505Karl Schultz                                     validation_error_map[VALIDATION_ERROR_00664]);
2398ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            }
2399ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
2400ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            // Ensure that the queue family indices were specified at device creation
2401ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            skip_call |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
2402ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                                       pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2403ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        }
2404ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    }
2405ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
2406ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    if (!skip_call) {
2407c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
2408ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2409ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        validate_result(report_data, "vkCreateBuffer", result);
2410c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
2411ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2412ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
2413ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
2414ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2415956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
2416956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2417491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
24183e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    assert(my_data != NULL);
24193e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
2420956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkDestroyBuffer(my_data->report_data, buffer, pAllocator);
24213e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
2422956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2423491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
24243e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    }
24253e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves}
24263e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
24277b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
24287b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I Wu                                                const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
2429491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2430956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2431491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2432c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
2433c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
2434956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCreateBufferView(my_data->report_data, pCreateInfo, pAllocator, pView);
2435ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2436956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2437c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        result = get_dispatch_table(pc_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
2438c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2439e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkCreateBufferView", result);
2440c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
2441ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2442ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
2443ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
2444ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2445956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
2446956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2447491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
24483e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    assert(my_data != NULL);
24493e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
2450956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkDestroyBufferView(my_data->report_data, bufferView, pAllocator);
24513e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
2452956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2453491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
24543e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    }
24553e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves}
24563e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
24577b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
24587b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I Wu                                           const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
24599d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
24609d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves    bool skip_call = false;
24619d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves    layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2462ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    assert(device_data != nullptr);
24639d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves    debug_report_data *report_data = device_data->report_data;
24649d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves
24659d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves    skip_call |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage);
24669d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves
2467491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (pCreateInfo != nullptr) {
2468ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2469c3fc3d8e91f24136f4e2cc036e92033b826a96e7Dustin Graves        if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
2470ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1
2471ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            if (pCreateInfo->queueFamilyIndexCount <= 1) {
2472ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                skip_call |=
2473ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2474ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                            INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2475ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                                      "pCreateInfo->queueFamilyIndexCount must be greater than 1");
2476ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            }
24779d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves
2478ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of
2479ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            // queueFamilyIndexCount uint32_t values
2480ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            if (pCreateInfo->pQueueFamilyIndices == nullptr) {
2481ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2482ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                     __LINE__, REQUIRED_PARAMETER, LayerName,
2483ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                     "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, "
2484ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                     "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of "
2485ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                     "pCreateInfo->queueFamilyIndexCount uint32_t values");
2486ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            }
24879d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves
24889d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves            skip_call |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
24899d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves                                                       pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices);
2490491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        }
2491c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
24929d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves        // width, height, and depth members of extent must be greater than 0
2493956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.width", pCreateInfo->extent.width, 0u);
2494956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        skip_call |=
2495956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski            ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.height", pCreateInfo->extent.height, 0u);
2496956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->extent.depth", pCreateInfo->extent.depth, 0u);
2497ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
24989d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves        // mipLevels must be greater than 0
2499956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->mipLevels", pCreateInfo->mipLevels, 0u);
2500c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
25019d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves        // arrayLayers must be greater than 0
2502956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->arrayLayers", pCreateInfo->arrayLayers, 0u);
2503c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
25049d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves        // If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1
25059d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves        if ((pCreateInfo->imageType == VK_IMAGE_TYPE_1D) && (pCreateInfo->extent.height != 1) && (pCreateInfo->extent.depth != 1)) {
25069d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves            skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
25079d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves                                 LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_1D, both "
2508825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                                            "pCreateInfo->extent.height and pCreateInfo->extent.depth must be 1");
25099d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves        }
25109d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves
25119d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves        if (pCreateInfo->imageType == VK_IMAGE_TYPE_2D) {
25129d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves            // If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and
25139d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves            // extent.height must be equal
25149d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves            if ((pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
25159d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves                (pCreateInfo->extent.width != pCreateInfo->extent.height)) {
2516825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
2517825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                                     LayerName, "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D and "
2518825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                                                "pCreateInfo->flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, "
2519825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                                                "pCreateInfo->extent.width and pCreateInfo->extent.height must be equal");
25209d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves            }
25219d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves
25229d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves            if (pCreateInfo->extent.depth != 1) {
25239d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves                skip_call |=
2524825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                    log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
25259d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves                            "vkCreateImage: if pCreateInfo->imageType is VK_IMAGE_TYPE_2D, pCreateInfo->extent.depth must be 1");
25269d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves            }
25279d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves        }
25289d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves
25299d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves        // mipLevels must be less than or equal to floor(log2(max(extent.width,extent.height,extent.depth)))+1
25309d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves        uint32_t maxDim = std::max(std::max(pCreateInfo->extent.width, pCreateInfo->extent.height), pCreateInfo->extent.depth);
25319d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves        if (pCreateInfo->mipLevels > (floor(log2(maxDim)) + 1)) {
2532956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski            skip_call |=
2533956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2534956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                        "vkCreateImage: pCreateInfo->mipLevels must be less than or equal to "
2535956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                        "floor(log2(max(pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth)))+1");
25369d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves        }
25379d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves
25389d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves        // If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
25399d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves        // VK_IMAGE_CREATE_SPARSE_BINDING_BIT
25409d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves        if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
25419d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves            ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
2542956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski            skip_call |=
2543956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, LayerName,
2544956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                        "vkCreateImage: pCreateInfo->flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or "
2545956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                        "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT");
25469d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves        }
25479d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves    }
2548ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
25499d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves    if (!skip_call) {
2550c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        result = get_dispatch_table(pc_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
2551c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
25529d85d6665792995166b8ceae9bf1c08470c3c658Dustin Graves        validate_result(report_data, "vkCreateImage", result);
2553c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
2554ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2555ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
2556ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
2557ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
25587b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
2559956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2560491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
25613e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    assert(my_data != NULL);
25623e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
2563956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkDestroyImage(my_data->report_data, image, pAllocator);
25643e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
2565956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2566491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, device)->DestroyImage(device, image, pAllocator);
25673e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    }
25683e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves}
25693e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
2570491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnbool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSubresource) {
2571491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (pSubresource != nullptr) {
2572491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if ((pSubresource->aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT |
2573491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                                         VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
2574ce31fbafc11ffa7749cf95c7ff16a96507a28225Dustin Graves            log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2575825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                    UNRECOGNIZED_VALUE, LayerName,
2576491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                    "vkGetImageSubresourceLayout parameter, VkImageAspect pSubresource->aspectMask, is an unrecognized enumerator");
2577491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            return false;
2578491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        }
2579e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
2580c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
2581c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    return true;
2582ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
2583ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2584956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
2585956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                     VkSubresourceLayout *pLayout) {
2586956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2587491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2588c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
2589c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
2590956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkGetImageSubresourceLayout(my_data->report_data, image, pSubresource, pLayout);
2591ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2592956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2593c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        PreGetImageSubresourceLayout(device, pSubresource);
2594c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2595c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        get_dispatch_table(pc_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
2596c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
2597ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
2598ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
25997b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
26007b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I Wu                                               const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
2601491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
260215aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves    bool skip_call = false;
2603491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2604c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
260515aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves    debug_report_data *report_data = my_data->report_data;
2606c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
260715aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves    skip_call |= parameter_validation_vkCreateImageView(report_data, pCreateInfo, pAllocator, pView);
2608ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
260915aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves    if (pCreateInfo != nullptr) {
261015aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves        if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) || (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D)) {
2611e0027f9a72cdef4bbbc4be46af806d7f41349e5aDustin Graves            if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2612e0027f9a72cdef4bbbc4be46af806d7f41349e5aDustin Graves                (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
261315aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves                skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
261415aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves                                     LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD, "
261515aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves                                                "pCreateInfo->subresourceRange.layerCount must be 1",
261615aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves                                     ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D) ? 1 : 2));
261715aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves            }
261815aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves        } else if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ||
2619e0027f9a72cdef4bbbc4be46af806d7f41349e5aDustin Graves                   (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_2D_ARRAY)) {
2620e0027f9a72cdef4bbbc4be46af806d7f41349e5aDustin Graves            if ((pCreateInfo->subresourceRange.layerCount < 1) &&
2621e0027f9a72cdef4bbbc4be46af806d7f41349e5aDustin Graves                (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
262215aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves                skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
262315aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves                                     LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_%dD_ARRAY, "
262415aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves                                                "pCreateInfo->subresourceRange.layerCount must be >= 1",
262515aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves                                     ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? 1 : 2));
262615aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves            }
262715aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves        } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE) {
2628e0027f9a72cdef4bbbc4be46af806d7f41349e5aDustin Graves            if ((pCreateInfo->subresourceRange.layerCount != 6) &&
2629e0027f9a72cdef4bbbc4be46af806d7f41349e5aDustin Graves                (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
263015aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves                skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
263115aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves                                     LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE, "
263215aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves                                                "pCreateInfo->subresourceRange.layerCount must be 6");
263315aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves            }
263415aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves        } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
2635e0027f9a72cdef4bbbc4be46af806d7f41349e5aDustin Graves            if (((pCreateInfo->subresourceRange.layerCount == 0) || ((pCreateInfo->subresourceRange.layerCount % 6) != 0)) &&
2636e0027f9a72cdef4bbbc4be46af806d7f41349e5aDustin Graves                (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
263715aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves                skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
263815aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves                                     LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_CUBE_ARRAY, "
263915aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves                                                "pCreateInfo->subresourceRange.layerCount must be a multiple of 6");
264015aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves            }
264115aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves        } else if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_3D) {
264215aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves            if (pCreateInfo->subresourceRange.baseArrayLayer != 0) {
264315aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves                skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
264415aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves                                     LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
264515aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves                                                "pCreateInfo->subresourceRange.baseArrayLayer must be 0");
264615aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves            }
264715aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves
2648e0027f9a72cdef4bbbc4be46af806d7f41349e5aDustin Graves            if ((pCreateInfo->subresourceRange.layerCount != 1) &&
2649e0027f9a72cdef4bbbc4be46af806d7f41349e5aDustin Graves                (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS)) {
265015aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves                skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1,
265115aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves                                     LayerName, "vkCreateImageView: if pCreateInfo->viewType is VK_IMAGE_TYPE_3D, "
265215aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves                                                "pCreateInfo->subresourceRange.layerCount must be 1");
265315aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves            }
265415aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves        }
265515aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves    }
265615aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves
265715aa1272689e3bb2a7388d4ccef186d3fa4b9338Dustin Graves    if (!skip_call) {
2658c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        result = get_dispatch_table(pc_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
2659c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2660e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkCreateImageView", result);
2661c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
2662ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2663ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
2664ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
2665ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2666956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
2667956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2668491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
26693e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    assert(my_data != NULL);
26703e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
2671956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkDestroyImageView(my_data->report_data, imageView, pAllocator);
26723e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
2673956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2674491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
26753e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    }
26763e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves}
26773e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
26787b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
2679956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                  const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
2680491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2681956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2682491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2683c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
2684c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2685956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCreateShaderModule(my_data->report_data, pCreateInfo, pAllocator, pShaderModule);
2686c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2687956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2688491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        result =
2689491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            get_dispatch_table(pc_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
2690c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2691e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkCreateShaderModule", result);
2692c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
2693c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
26946715e52f24453b9b83fb464683cf2c42ee8e0649Michael Lentine    return result;
26956715e52f24453b9b83fb464683cf2c42ee8e0649Michael Lentine}
26966715e52f24453b9b83fb464683cf2c42ee8e0649Michael Lentine
2697956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
2698956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                               const VkAllocationCallbacks *pAllocator) {
2699956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2700491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
27013e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    assert(my_data != NULL);
27023e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
2703956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkDestroyShaderModule(my_data->report_data, shaderModule, pAllocator);
27043e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
2705956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2706491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
27073e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    }
27083e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves}
27093e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
27107b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
2711956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                   const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
2712491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2713956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2714491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2715c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
2716e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
2717956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCreatePipelineCache(my_data->report_data, pCreateInfo, pAllocator, pPipelineCache);
2718e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
2719956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2720491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        result =
2721491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            get_dispatch_table(pc_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
2722c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2723e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkCreatePipelineCache", result);
2724c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
2725e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
2726e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    return result;
2727e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes}
2728e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
2729956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
2730956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                const VkAllocationCallbacks *pAllocator) {
2731956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2732491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
27333e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    assert(my_data != NULL);
27343e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
2735956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkDestroyPipelineCache(my_data->report_data, pipelineCache, pAllocator);
27363e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
2737956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2738491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
27393e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    }
27403e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves}
27413e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
2742956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
2743956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                    void *pData) {
2744491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2745956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2746491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2747c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
2748c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2749956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkGetPipelineCacheData(my_data->report_data, pipelineCache, pDataSize, pData);
2750ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2751956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2752c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        result = get_dispatch_table(pc_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
2753c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2754e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkGetPipelineCacheData", result);
2755c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
2756ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2757ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
2758ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
2759ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
2760956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
2761956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                   const VkPipelineCache *pSrcCaches) {
2762491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2763956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
2764491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2765c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
2766c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2767956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkMergePipelineCaches(my_data->report_data, dstCache, srcCacheCount, pSrcCaches);
2768c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
2769956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
2770c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        result = get_dispatch_table(pc_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
2771c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2772e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkMergePipelineCaches", result);
2773c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
2774c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
2775c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    return result;
2776c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes}
2777c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
2778491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnbool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateInfo *pCreateInfos) {
2779b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski    layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2780b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski
2781b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski    // TODO: Handle count
2782491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (pCreateInfos != nullptr) {
2783491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (pCreateInfos->flags | VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
2784491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            if (pCreateInfos->basePipelineIndex != -1) {
2785491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2786ce31fbafc11ffa7749cf95c7ff16a96507a28225Dustin Graves                    log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2787825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                            INVALID_USAGE, LayerName,
2788491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                            "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be VK_NULL_HANDLE if "
2789491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                            "pCreateInfos->flags "
2790491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                            "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineIndex is not -1");
2791491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                    return false;
2792491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                }
2793d47367b403918b6362fe0fc9aa13627d6336cd01Jeremy Hayes            }
2794d47367b403918b6362fe0fc9aa13627d6336cd01Jeremy Hayes
2795491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            if (pCreateInfos->basePipelineHandle != VK_NULL_HANDLE) {
2796491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                if (pCreateInfos->basePipelineIndex != -1) {
2797491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                    log_msg(
2798ce31fbafc11ffa7749cf95c7ff16a96507a28225Dustin Graves                        mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2799825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                        INVALID_USAGE, LayerName,
2800491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                        "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if pCreateInfos->flags "
2801491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                        "contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and pCreateInfos->basePipelineHandle is not "
2802491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                        "VK_NULL_HANDLE");
2803491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                    return false;
2804491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                }
2805491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            }
2806491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        }
2807491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn
2808491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if (pCreateInfos->pRasterizationState != nullptr) {
2809491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            if (pCreateInfos->pRasterizationState->cullMode & ~VK_CULL_MODE_FRONT_AND_BACK) {
2810ce31fbafc11ffa7749cf95c7ff16a96507a28225Dustin Graves                log_msg(mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2811825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                        UNRECOGNIZED_VALUE, LayerName,
2812491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                        "vkCreateGraphicsPipelines parameter, VkCullMode pCreateInfos->pRasterizationState->cullMode, is an "
2813491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                        "unrecognized enumerator");
2814491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                return false;
2815491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            }
281693a6d51ebe5141fd3468aedf34436f2fc8b0984bMark Lobodzinski
281793a6d51ebe5141fd3468aedf34436f2fc8b0984bMark Lobodzinski            if ((pCreateInfos->pRasterizationState->polygonMode != VK_POLYGON_MODE_FILL) &&
281893a6d51ebe5141fd3468aedf34436f2fc8b0984bMark Lobodzinski                (data->physical_device_features.fillModeNonSolid == false)) {
281993a6d51ebe5141fd3468aedf34436f2fc8b0984bMark Lobodzinski                log_msg(
282093a6d51ebe5141fd3468aedf34436f2fc8b0984bMark Lobodzinski                    mdd(device), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
282193a6d51ebe5141fd3468aedf34436f2fc8b0984bMark Lobodzinski                    DEVICE_FEATURE, LayerName,
282293a6d51ebe5141fd3468aedf34436f2fc8b0984bMark Lobodzinski                    "vkCreateGraphicsPipelines parameter, VkPolygonMode pCreateInfos->pRasterizationState->polygonMode cannot be "
282393a6d51ebe5141fd3468aedf34436f2fc8b0984bMark Lobodzinski                    "VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE if VkPhysicalDeviceFeatures->fillModeNonSolid is false.");
282493a6d51ebe5141fd3468aedf34436f2fc8b0984bMark Lobodzinski                return false;
282593a6d51ebe5141fd3468aedf34436f2fc8b0984bMark Lobodzinski            }
2826491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        }
2827b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski
28283755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves        size_t i = 0;
2829c3fc3d8e91f24136f4e2cc036e92033b826a96e7Dustin Graves        for (size_t j = 0; j < pCreateInfos[i].stageCount; j++) {
28303755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves            validate_string(data->report_data, "vkCreateGraphicsPipelines",
28313755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                            ParameterName("pCreateInfos[%i].pStages[%i].pName", ParameterName::IndexVector{i, j}),
2832491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                            pCreateInfos[i].pStages[j].pName);
2833491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        }
2834e307f588ada2a959cab1964216a66934e5f8ab9eTony Barbour    }
2835e307f588ada2a959cab1964216a66934e5f8ab9eTony Barbour
2836e307f588ada2a959cab1964216a66934e5f8ab9eTony Barbour    return true;
2837e307f588ada2a959cab1964216a66934e5f8ab9eTony Barbour}
2838e307f588ada2a959cab1964216a66934e5f8ab9eTony Barbour
2839956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
2840956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                       const VkGraphicsPipelineCreateInfo *pCreateInfos,
2841956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                       const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
2842491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
2843ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    bool skip_call = false;
2844ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
2845ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    assert(device_data != nullptr);
2846ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    debug_report_data *report_data = device_data->report_data;
2847c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
2848ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    skip_call |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos,
2849ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                                                pAllocator, pPipelines);
2850e307f588ada2a959cab1964216a66934e5f8ab9eTony Barbour
2851ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    if (pCreateInfos != nullptr) {
2852ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        for (uint32_t i = 0; i < createInfoCount; ++i) {
2853ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
2854ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            if (pCreateInfos[i].pTessellationState == nullptr) {
2855ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                if (pCreateInfos[i].pStages != nullptr) {
2856ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage,
2857ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    // pTessellationState must not be NULL
2858ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    bool has_control = false;
2859ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    bool has_eval = false;
2860ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
2861ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) {
2862ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) {
2863ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                            has_control = true;
2864ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
2865ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                            has_eval = true;
2866ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        }
2867ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    }
2868ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
2869ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    if (has_control && has_eval) {
2870ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2871ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                             __LINE__, REQUIRED_PARAMETER, LayerName,
2872ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                             "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation "
2873ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                             "control shader stage and a tessellation evaluation shader stage, "
2874ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                             "pCreateInfos[%d].pTessellationState must not be NULL",
2875ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                             i, i);
2876ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    }
2877ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                }
2878dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves            } else {
28793755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                skip_call |= validate_struct_pnext(
28803755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
28813755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pTessellationState->pNext", ParameterName::IndexVector{i}), NULL,
28823755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    pCreateInfos[i].pTessellationState->pNext, 0, NULL, GeneratedHeaderVersion);
2883dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
28843755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                skip_call |= validate_reserved_flags(
28853755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
28863755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pTessellationState->flags", ParameterName::IndexVector{i}),
28873755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    pCreateInfos[i].pTessellationState->flags);
2888dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
2889dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) {
2890dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                    skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2891dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                                         __LINE__, INVALID_STRUCT_STYPE, LayerName,
2892dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                                         "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be "
2893dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                                         "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO",
2894dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                                         i);
2895dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                }
2896ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            }
2897ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
2898ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            if (pCreateInfos[i].pViewportState == nullptr) {
2899ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a
2900ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                // valid VkPipelineViewportStateCreateInfo structure
2901ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2902ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
2903ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    skip_call |= log_msg(
2904ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2905ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        REQUIRED_PARAMETER, LayerName,
2906ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, "
2907ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure",
2908ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        i, i);
2909ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                }
2910ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            } else {
2911dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                skip_call |=
29123755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
29133755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                          ParameterName("pCreateInfos[%i].pViewportState->pNext", ParameterName::IndexVector{i}),
29143755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                          NULL, pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion);
2915dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
2916dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                skip_call |=
29173755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    validate_reserved_flags(report_data, "vkCreateGraphicsPipelines",
29183755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                            ParameterName("pCreateInfos[%i].pViewportState->flags", ParameterName::IndexVector{i}),
2919dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                                            pCreateInfos[i].pViewportState->flags);
2920dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
2921ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
2922ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2923ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         __LINE__, INVALID_STRUCT_STYPE, LayerName,
2924ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
2925ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
2926ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         i);
2927ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                }
2928ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
2929ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                if (pCreateInfos[i].pDynamicState != nullptr) {
2930ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    bool has_dynamic_viewport = false;
2931ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    bool has_dynamic_scissor = false;
2932ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
2933ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) {
2934ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
2935ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                            has_dynamic_viewport = true;
2936ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
2937ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                            has_dynamic_scissor = true;
2938ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        }
2939ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    }
2940ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
2941ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    // viewportCount must be greater than 0
2942ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
2943ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    if (pCreateInfos[i].pViewportState->viewportCount == 0) {
2944ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2945ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                             __LINE__, REQUIRED_PARAMETER, LayerName,
29463b6703c5093699aecba42909e65ce00d3cbe1d5dTobin Ehlis                                             "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
29473b6703c5093699aecba42909e65ce00d3cbe1d5dTobin Ehlis                                             "not contain VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount "
2948ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                             "must be greater than 0",
2949ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                             i, i);
2950ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    }
2951ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
2952ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
2953ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
2954ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
2955ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        skip_call |=
2956ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                            log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2957ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                    __LINE__, REQUIRED_PARAMETER, LayerName,
29583b6703c5093699aecba42909e65ce00d3cbe1d5dTobin Ehlis                                    "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
2959ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                    "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL",
2960ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                    i, i);
2961ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    }
2962ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
2963ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    // scissorCount must be greater than 0
2964ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
2965ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    if (pCreateInfos[i].pViewportState->scissorCount == 0) {
2966ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2967ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                             __LINE__, REQUIRED_PARAMETER, LayerName,
29683b6703c5093699aecba42909e65ce00d3cbe1d5dTobin Ehlis                                             "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does "
29693b6703c5093699aecba42909e65ce00d3cbe1d5dTobin Ehlis                                             "not contain VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount "
2970ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                             "must be greater than 0",
2971ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                             i, i);
2972ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    }
2973ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
2974ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
2975ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
2976ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {
2977ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        skip_call |=
2978ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                            log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
2979ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                    __LINE__, REQUIRED_PARAMETER, LayerName,
29803b6703c5093699aecba42909e65ce00d3cbe1d5dTobin Ehlis                                    "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not contain "
2981ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                    "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL",
2982ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                    i, i);
2983ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    }
2984ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                }
2985ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            }
2986ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
2987ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            if (pCreateInfos[i].pMultisampleState == nullptr) {
2988ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to
2989ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                // a valid VkPipelineMultisampleStateCreateInfo structure
2990ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                if ((pCreateInfos[i].pRasterizationState != nullptr) &&
2991ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
2992ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    skip_call |=
2993ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
2994ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                REQUIRED_PARAMETER, LayerName, "vkCreateGraphicsPipelines: if "
2995ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                                               "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is "
2996ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                                               "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL",
2997ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                i, i);
2998ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                }
2999dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves            } else {
3000dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                skip_call |=
30013755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
30023755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                          ParameterName("pCreateInfos[%i].pMultisampleState->pNext", ParameterName::IndexVector{i}),
3003059e07e5fff8ea8b6108fe900e573d845fb98bf0Dustin Graves                                          NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL, GeneratedHeaderVersion);
3004dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
30053755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                skip_call |= validate_reserved_flags(
30063755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
30073755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pMultisampleState->flags", ParameterName::IndexVector{i}),
30083755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    pCreateInfos[i].pMultisampleState->flags);
3009dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
30103755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                skip_call |= validate_bool32(
30113755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
30123755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pMultisampleState->sampleShadingEnable", ParameterName::IndexVector{i}),
30133755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    pCreateInfos[i].pMultisampleState->sampleShadingEnable);
3014dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
3015dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                skip_call |= validate_array(
30163755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
30173755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pMultisampleState->rasterizationSamples", ParameterName::IndexVector{i}),
30183755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pMultisampleState->pSampleMask", ParameterName::IndexVector{i}),
30193755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    pCreateInfos[i].pMultisampleState->rasterizationSamples, pCreateInfos[i].pMultisampleState->pSampleMask, true,
30203755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    false);
30213755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves
30223755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                skip_call |= validate_bool32(
30233755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
30243755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pMultisampleState->alphaToCoverageEnable", ParameterName::IndexVector{i}),
30253755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    pCreateInfos[i].pMultisampleState->alphaToCoverageEnable);
30263755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves
30273755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                skip_call |= validate_bool32(
30283755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
30293755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pMultisampleState->alphaToOneEnable", ParameterName::IndexVector{i}),
30303755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    pCreateInfos[i].pMultisampleState->alphaToOneEnable);
3031dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
3032dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) {
3033dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                    skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3034dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                                         __LINE__, INVALID_STRUCT_STYPE, LayerName,
3035dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                                         "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be "
3036dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                                         "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
3037dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                                         i);
3038dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                }
3039ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            }
3040ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
3041ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3042dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves            if (pCreateInfos[i].pDepthStencilState != nullptr) {
30433755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                skip_call |= validate_struct_pnext(
30443755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
30453755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pDepthStencilState->pNext", ParameterName::IndexVector{i}), NULL,
30463755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    pCreateInfos[i].pDepthStencilState->pNext, 0, NULL, GeneratedHeaderVersion);
30473755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves
30483755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                skip_call |= validate_reserved_flags(
30493755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
30503755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pDepthStencilState->flags", ParameterName::IndexVector{i}),
30513755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    pCreateInfos[i].pDepthStencilState->flags);
30523755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves
30533755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                skip_call |= validate_bool32(
30543755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
30553755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pDepthStencilState->depthTestEnable", ParameterName::IndexVector{i}),
30563755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    pCreateInfos[i].pDepthStencilState->depthTestEnable);
30573755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves
30583755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                skip_call |= validate_bool32(
30593755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
30603755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pDepthStencilState->depthWriteEnable", ParameterName::IndexVector{i}),
30613755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    pCreateInfos[i].pDepthStencilState->depthWriteEnable);
3062dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
3063dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                skip_call |= validate_ranged_enum(
30643755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
30653755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pDepthStencilState->depthCompareOp", ParameterName::IndexVector{i}),
30663755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
30673755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    pCreateInfos[i].pDepthStencilState->depthCompareOp);
3068dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
30693755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                skip_call |= validate_bool32(
30703755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
30713755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pDepthStencilState->depthBoundsTestEnable", ParameterName::IndexVector{i}),
30723755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable);
3073dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
30743755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                skip_call |= validate_bool32(
30753755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
30763755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pDepthStencilState->stencilTestEnable", ParameterName::IndexVector{i}),
30773755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    pCreateInfos[i].pDepthStencilState->stencilTestEnable);
3078dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
3079dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                skip_call |= validate_ranged_enum(
30803755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
30813755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pDepthStencilState->front.failOp", ParameterName::IndexVector{i}),
30823755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
30833755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    pCreateInfos[i].pDepthStencilState->front.failOp);
3084dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
3085dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                skip_call |= validate_ranged_enum(
30863755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
30873755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pDepthStencilState->front.passOp", ParameterName::IndexVector{i}),
30883755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
30893755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    pCreateInfos[i].pDepthStencilState->front.passOp);
3090dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
30913755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                skip_call |= validate_ranged_enum(
30923755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
30933755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pDepthStencilState->front.depthFailOp", ParameterName::IndexVector{i}),
30943755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
30953755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    pCreateInfos[i].pDepthStencilState->front.depthFailOp);
3096dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
3097dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                skip_call |= validate_ranged_enum(
30983755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
30993755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pDepthStencilState->front.compareOp", ParameterName::IndexVector{i}),
31003755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
31013755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    pCreateInfos[i].pDepthStencilState->front.compareOp);
3102dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
3103dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                skip_call |= validate_ranged_enum(
31043755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
31053755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pDepthStencilState->back.failOp", ParameterName::IndexVector{i}), "VkStencilOp",
3106dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                    VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp);
3107dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
3108dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                skip_call |= validate_ranged_enum(
31093755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
31103755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pDepthStencilState->back.passOp", ParameterName::IndexVector{i}), "VkStencilOp",
3111dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                    VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp);
3112dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
3113dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                skip_call |= validate_ranged_enum(
31143755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
31153755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pDepthStencilState->back.depthFailOp", ParameterName::IndexVector{i}),
31163755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    "VkStencilOp", VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE,
31173755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    pCreateInfos[i].pDepthStencilState->back.depthFailOp);
3118dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
3119dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                skip_call |= validate_ranged_enum(
31203755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
31213755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pDepthStencilState->back.compareOp", ParameterName::IndexVector{i}),
31223755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    "VkCompareOp", VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE,
31233755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    pCreateInfos[i].pDepthStencilState->back.compareOp);
3124dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
3125dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) {
3126dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                    skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3127dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                                         __LINE__, INVALID_STRUCT_STYPE, LayerName,
3128dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                                         "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be "
3129dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                                         "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
3130dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                                         i);
3131dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                }
3132ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            }
3133ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
3134ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass
3135ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            if (pCreateInfos[i].pColorBlendState != nullptr) {
3136dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                skip_call |=
31373755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    validate_struct_pnext(report_data, "vkCreateGraphicsPipelines",
31383755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                          ParameterName("pCreateInfos[%i].pColorBlendState->pNext", ParameterName::IndexVector{i}),
31393755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                          NULL, pCreateInfos[i].pColorBlendState->pNext, 0, NULL, GeneratedHeaderVersion);
3140dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
31413755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                skip_call |= validate_reserved_flags(
31423755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
31433755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pColorBlendState->flags", ParameterName::IndexVector{i}),
31443755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    pCreateInfos[i].pColorBlendState->flags);
3145dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
31463755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                skip_call |= validate_bool32(
31473755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
31483755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pColorBlendState->logicOpEnable", ParameterName::IndexVector{i}),
31493755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    pCreateInfos[i].pColorBlendState->logicOpEnable);
3150dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
3151dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                skip_call |= validate_array(
31523755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    report_data, "vkCreateGraphicsPipelines",
31533755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pColorBlendState->attachmentCount", ParameterName::IndexVector{i}),
31543755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments", ParameterName::IndexVector{i}),
31553755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                    pCreateInfos[i].pColorBlendState->attachmentCount, pCreateInfos[i].pColorBlendState->pAttachments, false, true);
3156dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
3157dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) {
3158dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                    for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount;
3159dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                         ++attachmentIndex) {
31603755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                        skip_call |=
31613755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                            validate_bool32(report_data, "vkCreateGraphicsPipelines",
31623755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                            ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].blendEnable",
31633755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                                          ParameterName::IndexVector{i, attachmentIndex}),
31643755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                            pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable);
3165dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
3166dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                        skip_call |= validate_ranged_enum(
3167dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                            report_data, "vkCreateGraphicsPipelines",
31683755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                            ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcColorBlendFactor",
31693755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                          ParameterName::IndexVector{i, attachmentIndex}),
31703755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                            "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3171dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                            pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor);
3172dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
3173dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                        skip_call |= validate_ranged_enum(
3174dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                            report_data, "vkCreateGraphicsPipelines",
31753755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                            ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstColorBlendFactor",
31763755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                          ParameterName::IndexVector{i, attachmentIndex}),
31773755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                            "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3178dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                            pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor);
3179dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
31803755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                        skip_call |=
31813755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                            validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
31823755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                                 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorBlendOp",
31833755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                                               ParameterName::IndexVector{i, attachmentIndex}),
31843755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                                 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
31853755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                                 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp);
3186dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
3187dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                        skip_call |= validate_ranged_enum(
3188dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                            report_data, "vkCreateGraphicsPipelines",
31893755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                            ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].srcAlphaBlendFactor",
31903755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                          ParameterName::IndexVector{i, attachmentIndex}),
31913755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                            "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3192dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                            pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor);
3193dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
3194dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                        skip_call |= validate_ranged_enum(
3195dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                            report_data, "vkCreateGraphicsPipelines",
31963755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                            ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].dstAlphaBlendFactor",
31973755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                          ParameterName::IndexVector{i, attachmentIndex}),
31983755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                            "VkBlendFactor", VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE,
3199dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                            pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor);
3200dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
32013755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                        skip_call |=
32023755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                            validate_ranged_enum(report_data, "vkCreateGraphicsPipelines",
32033755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                                 ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].alphaBlendOp",
32043755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                                               ParameterName::IndexVector{i, attachmentIndex}),
32053755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                                 "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, VK_BLEND_OP_END_RANGE,
32063755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                                 pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp);
3207dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
3208dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                        skip_call |=
3209dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                            validate_flags(report_data, "vkCreateGraphicsPipelines",
32103755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                           ParameterName("pCreateInfos[%i].pColorBlendState->pAttachments[%i].colorWriteMask",
32113755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                                         ParameterName::IndexVector{i, attachmentIndex}),
3212dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                                           "VkColorComponentFlagBits", AllVkColorComponentFlagBits,
3213dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                                           pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false);
3214dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                    }
3215dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                }
3216dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
3217ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) {
3218ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3219ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         __LINE__, INVALID_STRUCT_STYPE, LayerName,
3220ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be "
3221ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
3222ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         i);
3223ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                }
3224ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
3225ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value
3226ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) {
3227ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    skip_call |= validate_ranged_enum(
32283755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                        report_data, "vkCreateGraphicsPipelines",
32293755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                        ParameterName("pCreateInfos[%i].pColorBlendState->logicOp", ParameterName::IndexVector{i}), "VkLogicOp",
3230ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp);
3231ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                }
3232ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            }
3233ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        }
3234ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    }
3235ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
3236ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    if (!skip_call) {
3237c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        PreCreateGraphicsPipelines(device, pCreateInfos);
3238e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
3239491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        result = get_dispatch_table(pc_device_table_map, device)
3240491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                     ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
3241c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3242ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        validate_result(report_data, "vkCreateGraphicsPipelines", result);
3243c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
3244e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
3245e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    return result;
3246e307f588ada2a959cab1964216a66934e5f8ab9eTony Barbour}
3247e307f588ada2a959cab1964216a66934e5f8ab9eTony Barbour
3248491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnbool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInfo *pCreateInfos) {
3249b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski    layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3250b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski
3251491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (pCreateInfos != nullptr) {
3252491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        // TODO: Handle count!
32533755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves        uint32_t i = 0;
32543755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves        validate_string(data->report_data, "vkCreateComputePipelines",
32553755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                        ParameterName("pCreateInfos[%i].stage.pName", ParameterName::IndexVector{i}), pCreateInfos[i].stage.pName);
3256e307f588ada2a959cab1964216a66934e5f8ab9eTony Barbour    }
3257e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
3258e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    return true;
3259e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes}
3260e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
3261956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3262956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                      const VkComputePipelineCreateInfo *pCreateInfos,
3263956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                      const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
3264491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3265956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
3266491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3267c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
3268c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3269956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCreateComputePipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos,
3270956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                               pAllocator, pPipelines);
3271e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
3272956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
3273c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        PreCreateComputePipelines(device, pCreateInfos);
3274e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
3275491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        result = get_dispatch_table(pc_device_table_map, device)
3276491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                     ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
3277c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3278e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkCreateComputePipelines", result);
3279c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
3280e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
3281e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    return result;
3282e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes}
3283e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
3284956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
3285956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
3286491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
32873e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    assert(my_data != NULL);
32883e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
3289956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkDestroyPipeline(my_data->report_data, pipeline, pAllocator);
32903e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
3291956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
3292491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
32933e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    }
32943e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves}
32953e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
3296956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
3297956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                    const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
3298491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3299956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
3300491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3301c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
3302e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
3303956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCreatePipelineLayout(my_data->report_data, pCreateInfo, pAllocator, pPipelineLayout);
3304e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
3305956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
3306491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        result =
3307491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            get_dispatch_table(pc_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
3308c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3309e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkCreatePipelineLayout", result);
3310c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
3311e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
3312e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    return result;
3313e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes}
3314e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
3315956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
3316956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                 const VkAllocationCallbacks *pAllocator) {
3317956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
3318491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
33193e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    assert(my_data != NULL);
33203e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
3321956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkDestroyPipelineLayout(my_data->report_data, pipelineLayout, pAllocator);
33223e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
3323956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
3324491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
33253e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    }
33263e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves}
33273e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
33287b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
33297b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I Wu                                             const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
3330491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3331ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    bool skip_call = false;
3332ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3333ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    assert(device_data != NULL);
3334ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    debug_report_data *report_data = device_data->report_data;
3335e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
3336ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    skip_call |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler);
3337e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
3338ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3339ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    if (pCreateInfo != nullptr) {
3340ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value
3341ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        if (pCreateInfo->compareEnable == VK_TRUE) {
3342ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp",
3343ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                              VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp);
3344ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        }
3345ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
3346ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
3347ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        // valid VkBorderColor value
3348ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3349ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) ||
3350ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) {
3351ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor",
3352ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                              VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor);
3353ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        }
3354ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    }
3355ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
3356ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    if (!skip_call) {
3357c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
3358c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3359ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        validate_result(report_data, "vkCreateSampler", result);
3360c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
3361e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
3362e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    return result;
3363e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes}
3364e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
3365956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
3366956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
3367491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
33683e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    assert(my_data != NULL);
33693e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
3370956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkDestroySampler(my_data->report_data, sampler, pAllocator);
33713e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
3372956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
3373491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
33743e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    }
33753e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves}
33763e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
3377956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
3378956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                         const VkAllocationCallbacks *pAllocator,
3379956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                         VkDescriptorSetLayout *pSetLayout) {
3380491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3381ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    bool skip_call = false;
3382ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3383ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    assert(device_data != nullptr);
3384ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    debug_report_data *report_data = device_data->report_data;
3385c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3386ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    skip_call |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout);
3387ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
3388ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3389ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) {
3390ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) {
3391ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            if (pCreateInfo->pBindings[i].descriptorCount != 0) {
3392ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount
3393ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount
3394ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                // valid VkSampler handles
3395ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3396ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                     (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) &&
3397ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) {
3398ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount;
3399ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                         ++descriptor_index) {
3400ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) {
3401ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                            skip_call |=
3402ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3403ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                        __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter "
3404ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                                                                 "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]"
3405ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                                                                 " specified as VK_NULL_HANDLE",
3406ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                        i, descriptor_index);
3407ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        }
3408ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    }
3409ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                }
3410e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
3411ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values
3412ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                if ((pCreateInfo->pBindings[i].stageFlags != 0) &&
3413ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) {
3414ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    skip_call |=
3415ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3416ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                UNRECOGNIZED_VALUE, LayerName,
3417ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, "
3418ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values",
3419ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                i, i);
3420ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                }
3421ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            }
3422ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        }
3423ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    }
3424ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
3425ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    if (!skip_call) {
3426491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        result =
3427491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
3428e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
3429ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        validate_result(report_data, "vkCreateDescriptorSetLayout", result);
3430c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
3431e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
3432e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    return result;
3433e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes}
3434e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
3435956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
3436956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                      const VkAllocationCallbacks *pAllocator) {
3437956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
3438491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
34393e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    assert(my_data != NULL);
34403e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
3441956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkDestroyDescriptorSetLayout(my_data->report_data, descriptorSetLayout, pAllocator);
34423e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
3443956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
3444491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
3445b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    }
3446491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn}
3447491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn
3448956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
3449956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                    const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
3450491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3451956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
3452491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3453c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
3454e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
3455956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCreateDescriptorPool(my_data->report_data, pCreateInfo, pAllocator, pDescriptorPool);
3456c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3457e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    /* TODOVV: How do we validate maxSets? Probably belongs in the limits layer? */
3458e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves
3459956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
3460491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        result =
3461491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            get_dispatch_table(pc_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
3462c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3463e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkCreateDescriptorPool", result);
3464c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
3465e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
3466e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    return result;
3467e307f588ada2a959cab1964216a66934e5f8ab9eTony Barbour}
3468e307f588ada2a959cab1964216a66934e5f8ab9eTony Barbour
3469956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3470956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                 const VkAllocationCallbacks *pAllocator) {
3471956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
3472491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
34733e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    assert(my_data != NULL);
34743e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
3475956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkDestroyDescriptorPool(my_data->report_data, descriptorPool, pAllocator);
34763e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
3477956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
3478491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
34793e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    }
34803e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves}
34813e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
3482956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3483956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                   VkDescriptorPoolResetFlags flags) {
3484cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3485956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
3486e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3487e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    assert(my_data != NULL);
3488e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves
3489956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkResetDescriptorPool(my_data->report_data, descriptorPool, flags);
3490cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
3491956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
3492cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        result = get_dispatch_table(pc_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
3493ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
3494cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        validate_result(my_data->report_data, "vkResetDescriptorPool", result);
3495cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    }
3496ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
3497ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
3498ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
3499ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
3500956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3501956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                      VkDescriptorSet *pDescriptorSets) {
3502491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3503956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
3504491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3505c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
3506c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
3507956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkAllocateDescriptorSets(my_data->report_data, pAllocateInfo, pDescriptorSets);
3508ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
3509956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
3510c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        result = get_dispatch_table(pc_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3511c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3512e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkAllocateDescriptorSets", result);
3513c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
3514ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
3515ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
3516ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
3517ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
3518956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
35197b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I Wu                                                  const VkDescriptorSet *pDescriptorSets) {
3520491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3521ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    bool skip_call = false;
3522ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3523ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    assert(device_data != nullptr);
3524ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    debug_report_data *report_data = device_data->report_data;
3525c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
3526ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    skip_call |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets);
3527c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3528ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3529ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3530ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    // validate_array()
3531ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    skip_call |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount,
3532ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                pDescriptorSets, true, true);
3533ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
3534ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    if (!skip_call) {
3535491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        result = get_dispatch_table(pc_device_table_map, device)
3536491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                     ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
3537c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3538ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        validate_result(report_data, "vkFreeDescriptorSets", result);
3539c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
3540c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
3541c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    return result;
3542c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes}
3543c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
3544956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
3545956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
3546956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                const VkCopyDescriptorSet *pDescriptorCopies) {
3547ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    bool skip_call = false;
3548ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3549ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    assert(device_data != NULL);
3550ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    debug_report_data *report_data = device_data->report_data;
3551c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3552ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    skip_call |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites,
3553ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                                             descriptorCopyCount, pDescriptorCopies);
3554c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3555ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3556ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    if (pDescriptorWrites != NULL) {
3557ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
3558ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            // descriptorCount must be greater than 0
3559ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            if (pDescriptorWrites[i].descriptorCount == 0) {
3560ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                skip_call |=
3561ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
3562ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                            REQUIRED_PARAMETER, LayerName,
3563ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                            "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i);
3564ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            }
3565ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
3566ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
3567ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
3568ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
3569ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
3570ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
3571ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
3572ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
3573ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
3574ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                if (pDescriptorWrites[i].pImageInfo == nullptr) {
3575ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3576ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         __LINE__, REQUIRED_PARAMETER, LayerName,
3577ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3578ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "
3579ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or "
3580ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL",
3581ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         i, i);
3582ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
3583ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
3584ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
3585ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
3586ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3587ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                         ++descriptor_index) {
3588ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
35893755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                                              ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageView",
35903755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                                                            ParameterName::IndexVector{i, descriptor_index}),
3591ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                                              pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
3592ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        skip_call |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets",
35933755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                                          ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageLayout",
35943755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                                                        ParameterName::IndexVector{i, descriptor_index}),
35953755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                                          "VkImageLayout", VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE,
3596ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                                          pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout);
3597ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    }
3598ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                }
3599ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
3600ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                       (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
3601ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                       (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
3602ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                       (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
3603ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
3604ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
3605ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
3606ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                if (pDescriptorWrites[i].pBufferInfo == nullptr) {
3607ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3608ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         __LINE__, REQUIRED_PARAMETER, LayerName,
3609ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3610ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "
3611ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "
3612ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         "pDescriptorWrites[%d].pBufferInfo must not be NULL",
3613ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         i, i);
3614dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                } else {
3615dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                    for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
3616dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                        skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
36173755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                                              ParameterName("pDescriptorWrites[%i].pBufferInfo[%i].buffer",
36183755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                                                            ParameterName::IndexVector{i, descriptorIndex}),
3619dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                                                              pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
3620dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                    }
3621ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                }
3622ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
3623ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                       (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
3624ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
3625ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
3626ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
3627ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3628ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         __LINE__, REQUIRED_PARAMETER, LayerName,
3629ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is "
3630ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
3631ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         "pDescriptorWrites[%d].pTexelBufferView must not be NULL",
3632ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                         i, i);
3633ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                } else {
3634ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
3635ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                         ++descriptor_index) {
3636ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                        skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets",
36373755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                                              ParameterName("pDescriptorWrites[%i].pTexelBufferView[%i]",
36383755690f21851fc9a325acf2f6a68c680e40fe0dDustin Graves                                                                            ParameterName::IndexVector{i, descriptor_index}),
3639ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                                              pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
3640ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                    }
3641ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                }
3642ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves            }
36430fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski
36440fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski            if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
36450fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)) {
36460fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                VkDeviceSize uniformAlignment = device_data->device_limits.minUniformBufferOffsetAlignment;
36470fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
36480fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                    if (pDescriptorWrites[i].pBufferInfo != NULL) {
36490fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                        if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment) != 0) {
36500fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                            skip_call |=
36510fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                                log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
3652825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                                        VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
36530fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                                        "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
36540fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                                        ") must be a multiple of device limit minUniformBufferOffsetAlignment 0x%" PRIxLEAST64,
36550fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                                        i, j, pDescriptorWrites[i].pBufferInfo[j].offset, uniformAlignment);
36560fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                        }
36570fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                    }
36580fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                }
36590fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski            } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
36600fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                       (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
36610fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                VkDeviceSize storageAlignment = device_data->device_limits.minStorageBufferOffsetAlignment;
36620fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                for (uint32_t j = 0; j < pDescriptorWrites[i].descriptorCount; j++) {
36630fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                    if (pDescriptorWrites[i].pBufferInfo != NULL) {
36640fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                        if (vk_safe_modulo(pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment) != 0) {
36650fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                            skip_call |=
36660fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                                log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
3667825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                                        VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVICE_LIMIT, LayerName,
36680fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                                        "vkUpdateDescriptorSets(): pDescriptorWrites[%d].pBufferInfo[%d].offset (0x%" PRIxLEAST64
36690fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                                        ") must be a multiple of device limit minStorageBufferOffsetAlignment 0x%" PRIxLEAST64,
36700fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                                        i, j, pDescriptorWrites[i].pBufferInfo[j].offset, storageAlignment);
36710fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                        }
36720fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                    }
36730fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski                }
36740fbb9a38d2fd4823ec845bb08e42658bcf1e41a8Mark Lobodzinski            }
3675ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        }
3676ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    }
3677ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
3678ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    if (!skip_call) {
3679491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, device)
3680491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
3681c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
3682c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes}
3683c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
36847b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
3685956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
3686491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3687956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
3688491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3689c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
3690c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3691956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCreateFramebuffer(my_data->report_data, pCreateInfo, pAllocator, pFramebuffer);
3692c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
3693956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
3694c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        result = get_dispatch_table(pc_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
3695c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3696e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkCreateFramebuffer", result);
3697c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
3698ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
3699ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
3700ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
3701ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
3702956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
3703956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
3704491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
37053e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    assert(my_data != NULL);
37063e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
3707956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkDestroyFramebuffer(my_data->report_data, framebuffer, pAllocator);
37083e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
3709956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
3710491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
37113e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    }
37123e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves}
37133e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
37149a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinskibool PreCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo) {
37159a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski    bool skip_call = false;
37169a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski    uint32_t max_color_attachments = dev_data->device_limits.maxColorAttachments;
37179a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski
37189a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski    for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
37199a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski        if (pCreateInfo->pSubpasses[i].colorAttachmentCount > max_color_attachments) {
37209a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski            skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
3721956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                 __LINE__, DEVICE_LIMIT, "DL", "Cannot create a render pass with %d color attachments. Max is %d.",
37229a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski                                 pCreateInfo->pSubpasses[i].colorAttachmentCount, max_color_attachments);
37239a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski        }
37249a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski    }
37259a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski    return skip_call;
37269a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski}
37279a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski
37287b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
3729956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
3730491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3731956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
3732491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3733c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
3734c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
3735956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCreateRenderPass(my_data->report_data, pCreateInfo, pAllocator, pRenderPass);
3736956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= PreCreateRenderPass(my_data, pCreateInfo);
3737ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
3738956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
3739c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        result = get_dispatch_table(pc_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
3740c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3741e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkCreateRenderPass", result);
3742c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
3743ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
3744ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
3745ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
3746ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
3747956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
3748956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
3749491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
37503e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    assert(my_data != NULL);
37513e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
3752956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkDestroyRenderPass(my_data->report_data, renderPass, pAllocator);
37533e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
3754956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
3755491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
37563e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    }
37573e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves}
37583e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
3759956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
3760956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
3761491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3762c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
3763c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3764956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkGetRenderAreaGranularity(my_data->report_data, renderPass, pGranularity);
3765e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
3766956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
3767c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        get_dispatch_table(pc_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
3768b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    }
3769ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
3770ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
37717b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
3772956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
3773491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3774956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
3775491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3776c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
3777c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
3778956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |=
3779fc6407d1fdf5ad60b1ca0a1bce6b52fbd81a4329Dustin Graves        validate_queue_family_index(my_data, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex", pCreateInfo->queueFamilyIndex);
378047892024546c67e8db98b51b2ddb962c21088894Mark Lobodzinski
3781956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCreateCommandPool(my_data->report_data, pCreateInfo, pAllocator, pCommandPool);
3782ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
3783956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
3784c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        result = get_dispatch_table(pc_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
3785c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3786e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkCreateCommandPool", result);
3787c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
3788ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
3789ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
3790ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
3791ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
3792956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
3793956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
3794491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
37953e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    assert(my_data != NULL);
37963e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
3797956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkDestroyCommandPool(my_data->report_data, commandPool, pAllocator);
37983e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
3799956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
3800491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
38013e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves    }
38023e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves}
38033e646e3de6f4fe0bfb0f0bf3a4633f3ead86dc66Dustin Graves
3804956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
3805cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3806956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
3807e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3808e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    assert(my_data != NULL);
3809e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves
3810956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkResetCommandPool(my_data->report_data, commandPool, flags);
3811e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
3812956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
3813cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        result = get_dispatch_table(pc_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
3814cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
3815cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        validate_result(my_data->report_data, "vkResetCommandPool", result);
3816cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    }
3817c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
3818c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    return result;
3819c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes}
3820c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
3821956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3822956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                      VkCommandBuffer *pCommandBuffers) {
3823491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3824956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
3825491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3826c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
3827c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
3828956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkAllocateCommandBuffers(my_data->report_data, pAllocateInfo, pCommandBuffers);
3829c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3830956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
3831c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        result = get_dispatch_table(pc_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3832c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3833e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves        validate_result(my_data->report_data, "vkAllocateCommandBuffers", result);
3834c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
3835ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
3836ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
3837ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
3838ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
3839956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
38407b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I Wu                                              const VkCommandBuffer *pCommandBuffers) {
3841ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    bool skip_call = false;
3842ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3843ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    assert(device_data != nullptr);
3844ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    debug_report_data *report_data = device_data->report_data;
3845cfdbfae2240e494dc2a9ee4953beaa508d66c6c0Dustin Graves
3846ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    skip_call |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers);
3847cfdbfae2240e494dc2a9ee4953beaa508d66c6c0Dustin Graves
3848ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3849ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond
3850ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    // validate_array()
3851ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    skip_call |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount,
3852ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                pCommandBuffers, true, true);
3853ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
3854ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    if (!skip_call) {
3855cfdbfae2240e494dc2a9ee4953beaa508d66c6c0Dustin Graves        get_dispatch_table(pc_device_table_map, device)
3856491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
3857cfdbfae2240e494dc2a9ee4953beaa508d66c6c0Dustin Graves    }
3858cfdbfae2240e494dc2a9ee4953beaa508d66c6c0Dustin Graves}
3859cfdbfae2240e494dc2a9ee4953beaa508d66c6c0Dustin Graves
38609a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinskibool PreBeginCommandBuffer(layer_data *dev_data, VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
38619a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski    bool skip_call = false;
38629a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski    layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(dev_data->physical_device), layer_data_map);
38639a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski    const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
38649a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski
38659a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski    if (pInfo != NULL) {
38669a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski        if ((phy_dev_data->physical_device_features.inheritedQueries == VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE)) {
38679a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski            skip_call |=
38689a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski                log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
3869825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                        reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
38709a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski                        "Cannot set inherited occlusionQueryEnable in vkBeginCommandBuffer() when device does not support "
38719a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski                        "inheritedQueries.");
38729a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski        }
38739a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski
38749a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski        if ((phy_dev_data->physical_device_features.inheritedQueries != VK_FALSE) && (pInfo->occlusionQueryEnable != VK_FALSE) &&
38759a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski            (!validate_VkQueryControlFlagBits(VkQueryControlFlagBits(pInfo->queryFlags)))) {
38769a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski            skip_call |=
38779a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski                log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
3878825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                        reinterpret_cast<uint64_t>(commandBuffer), __LINE__, DEVICE_FEATURE, LayerName,
38799a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski                        "Cannot enable in occlusion queries in vkBeginCommandBuffer() and set queryFlags to %d which is not a "
38809a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski                        "valid combination of VkQueryControlFlagBits.",
38819a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski                        pInfo->queryFlags);
38829a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski        }
38839a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski    }
38849a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski    return skip_call;
38859a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski}
38869a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski
38879a5429d278c2afe9fb382d52fb4f325975d82b18Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) {
3888491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3889ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    bool skip_call = false;
3890ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3891ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    assert(device_data != nullptr);
3892ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    debug_report_data *report_data = device_data->report_data;
3893c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3894ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    skip_call |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo);
3895c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3896ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml
3897ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer
3898ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    skip_call |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo",
3899ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                      "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo,
3900ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                      VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false);
3901ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
3902ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    if (pBeginInfo->pInheritanceInfo != NULL) {
3903dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves        skip_call |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL,
3904059e07e5fff8ea8b6108fe900e573d845fb98bf0Dustin Graves                                           pBeginInfo->pInheritanceInfo->pNext, 0, NULL, GeneratedHeaderVersion);
3905dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
3906dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves        skip_call |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable",
3907dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves                                     pBeginInfo->pInheritanceInfo->occlusionQueryEnable);
3908dc2176da60be5727b891a93f527f57c1c1804b7fDustin Graves
3909ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        // TODO: This only needs to be validated when the inherited queries feature is enabled
3910ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        // skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags",
3911ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false);
3912ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
3913ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        // TODO: This must be 0 if the pipeline statistics queries feature is not enabled
3914ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics",
3915ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                    "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits,
3916ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves                                    pBeginInfo->pInheritanceInfo->pipelineStatistics, false);
3917ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    }
3918ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves
39199a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski    skip_call |= PreBeginCommandBuffer(device_data, commandBuffer, pBeginInfo);
39209a5429d278c2afe9fb382d52fb4f325975d82b18Mark Lobodzinski
3921ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves    if (!skip_call) {
3922c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo);
3923ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
3924ccf92a97687d7a802b229bcfa4c92a9f33d98156Dustin Graves        validate_result(report_data, "vkBeginCommandBuffer", result);
3925c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
3926c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
3927ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
3928ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
3929c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
39307b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
3931e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3932e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    assert(my_data != NULL);
3933e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves
3934b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    VkResult result = get_dispatch_table(pc_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
3935ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
3936e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    validate_result(my_data->report_data, "vkEndCommandBuffer", result);
3937c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
3938ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes    return result;
3939ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
3940ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
3941956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
3942aca93abb797e61876d3206510e3d20d6d9b4384eDustin Graves    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3943e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3944e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves    assert(my_data != NULL);
3945e78276be1425aa8b1ca4d529db7a54a60dff9ec2Dustin Graves
3946aca93abb797e61876d3206510e3d20d6d9b4384eDustin Graves    bool skip_call = parameter_validation_vkResetCommandBuffer(my_data->report_data, flags);
3947aca93abb797e61876d3206510e3d20d6d9b4384eDustin Graves
3948aca93abb797e61876d3206510e3d20d6d9b4384eDustin Graves    if (!skip_call) {
3949aca93abb797e61876d3206510e3d20d6d9b4384eDustin Graves        result = get_dispatch_table(pc_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
3950ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
3951aca93abb797e61876d3206510e3d20d6d9b4384eDustin Graves        validate_result(my_data->report_data, "vkResetCommandBuffer", result);
3952aca93abb797e61876d3206510e3d20d6d9b4384eDustin Graves    }
395323b5f8d7681a19a940ea940381557852c4c27ecdCourtney Goeltzenleuchter
3954c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes    return result;
3955c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes}
3956c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
3957956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
3958956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                           VkPipeline pipeline) {
3959956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
3960c3fc3d8e91f24136f4e2cc036e92033b826a96e7Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3961c3fc3d8e91f24136f4e2cc036e92033b826a96e7Dustin Graves    assert(my_data != NULL);
3962ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
3963956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdBindPipeline(my_data->report_data, pipelineBindPoint, pipeline);
3964c3fc3d8e91f24136f4e2cc036e92033b826a96e7Dustin Graves
3965956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
3966c3fc3d8e91f24136f4e2cc036e92033b826a96e7Dustin Graves        get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
3967c3fc3d8e91f24136f4e2cc036e92033b826a96e7Dustin Graves    }
3968ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
3969ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
3970956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
3971956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                          const VkViewport *pViewports) {
3972956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
3973491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3974c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
3975c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3976956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdSetViewport(my_data->report_data, firstViewport, viewportCount, pViewports);
3977c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3978956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
3979491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, commandBuffer)
3980491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            ->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
3981c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
3982932cdb54a622f4ca69a25071eecbac235b4dc16fCourtney Goeltzenleuchter}
3983932cdb54a622f4ca69a25071eecbac235b4dc16fCourtney Goeltzenleuchter
3984956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
3985956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                         const VkRect2D *pScissors) {
3986956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
3987491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3988c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
3989c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3990956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdSetScissor(my_data->report_data, firstScissor, scissorCount, pScissors);
3991c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
3992956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
3993c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
3994c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
3995ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
3996ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
39977b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
3998b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
3999c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes}
4000ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
4001956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
4002956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                           float depthBiasSlopeFactor) {
4003491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    get_dispatch_table(pc_device_table_map, commandBuffer)
4004491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
4005f5bd2253ff4114ac446f8eb820e78d56f711020fCody Northrop}
4006f5bd2253ff4114ac446f8eb820e78d56f711020fCody Northrop
40077b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
4008956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4009491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4010c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
4011c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
4012956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdSetBlendConstants(my_data->report_data, blendConstants);
4013c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
4014956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4015c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
4016c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
4017c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes}
4018c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
4019956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
4020b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
4021c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes}
4022c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
4023956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4024956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                    uint32_t compareMask) {
4025956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
402687bc9291208dc09b52ff11d98e726f4c6972deb0Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
402787bc9291208dc09b52ff11d98e726f4c6972deb0Dustin Graves    assert(my_data != NULL);
402887bc9291208dc09b52ff11d98e726f4c6972deb0Dustin Graves
4029956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdSetStencilCompareMask(my_data->report_data, faceMask, compareMask);
403087bc9291208dc09b52ff11d98e726f4c6972deb0Dustin Graves
4031956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
403287bc9291208dc09b52ff11d98e726f4c6972deb0Dustin Graves        get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
403387bc9291208dc09b52ff11d98e726f4c6972deb0Dustin Graves    }
40342605cb05ec149b2e2668540501dc79c71b6a67e9Cody Northrop}
40352605cb05ec149b2e2668540501dc79c71b6a67e9Cody Northrop
4036956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
4037956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
403887bc9291208dc09b52ff11d98e726f4c6972deb0Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
403987bc9291208dc09b52ff11d98e726f4c6972deb0Dustin Graves    assert(my_data != NULL);
404087bc9291208dc09b52ff11d98e726f4c6972deb0Dustin Graves
4041956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdSetStencilWriteMask(my_data->report_data, faceMask, writeMask);
404287bc9291208dc09b52ff11d98e726f4c6972deb0Dustin Graves
4043956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
404487bc9291208dc09b52ff11d98e726f4c6972deb0Dustin Graves        get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
404587bc9291208dc09b52ff11d98e726f4c6972deb0Dustin Graves    }
4046c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes}
4047c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
4048956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
4049956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
405087bc9291208dc09b52ff11d98e726f4c6972deb0Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
405187bc9291208dc09b52ff11d98e726f4c6972deb0Dustin Graves    assert(my_data != NULL);
405287bc9291208dc09b52ff11d98e726f4c6972deb0Dustin Graves
4053956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdSetStencilReference(my_data->report_data, faceMask, reference);
405487bc9291208dc09b52ff11d98e726f4c6972deb0Dustin Graves
4055956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
405687bc9291208dc09b52ff11d98e726f4c6972deb0Dustin Graves        get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
405787bc9291208dc09b52ff11d98e726f4c6972deb0Dustin Graves    }
4058c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes}
4059c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
4060956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4061956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
4062956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
4063956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                 const uint32_t *pDynamicOffsets) {
4064956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4065491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4066c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
4067c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
4068956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |=
4069956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        parameter_validation_vkCmdBindDescriptorSets(my_data->report_data, pipelineBindPoint, layout, firstSet, descriptorSetCount,
4070956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                     pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
4071c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
4072956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4073491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, commandBuffer)
4074491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
4075491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                                    dynamicOffsetCount, pDynamicOffsets);
4076c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
4077ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
4078ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
4079956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4080956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                              VkIndexType indexType) {
4081956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4082c3fc3d8e91f24136f4e2cc036e92033b826a96e7Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4083c3fc3d8e91f24136f4e2cc036e92033b826a96e7Dustin Graves    assert(my_data != NULL);
4084c3fc3d8e91f24136f4e2cc036e92033b826a96e7Dustin Graves
4085956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdBindIndexBuffer(my_data->report_data, buffer, offset, indexType);
4086ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
4087956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4088c3fc3d8e91f24136f4e2cc036e92033b826a96e7Dustin Graves        get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
4089c3fc3d8e91f24136f4e2cc036e92033b826a96e7Dustin Graves    }
4090ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
4091ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
4092956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
4093956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
4094956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4095491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4096c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
4097c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
4098956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdBindVertexBuffers(my_data->report_data, firstBinding, bindingCount, pBuffers, pOffsets);
4099ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
4100956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4101491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, commandBuffer)
4102491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
4103c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
4104ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
4105ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
4106491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnbool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
4107491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                uint32_t firstInstance) {
41080f480e67d70c784ffe26e8d6c902048138d39980Michael Lentine    if (vertexCount == 0) {
4109b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski        // TODO: Verify against Valid Usage section. I don't see a non-zero vertexCount listed, may need to add that and make
4110acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter        // this an error or leave as is.
4111ce31fbafc11ffa7749cf95c7ff16a96507a28225Dustin Graves        log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4112825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t vertexCount, is 0");
41130f480e67d70c784ffe26e8d6c902048138d39980Michael Lentine        return false;
41140f480e67d70c784ffe26e8d6c902048138d39980Michael Lentine    }
41150f480e67d70c784ffe26e8d6c902048138d39980Michael Lentine
41160f480e67d70c784ffe26e8d6c902048138d39980Michael Lentine    if (instanceCount == 0) {
4117b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski        // TODO: Verify against Valid Usage section. I don't see a non-zero instanceCount listed, may need to add that and make
4118acb1359c8e1528e5d67bb0101c94c48a07785098Courtney Goeltzenleuchter        // this an error or leave as is.
4119ce31fbafc11ffa7749cf95c7ff16a96507a28225Dustin Graves        log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4120825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                REQUIRED_PARAMETER, LayerName, "vkCmdDraw parameter, uint32_t instanceCount, is 0");
41210f480e67d70c784ffe26e8d6c902048138d39980Michael Lentine        return false;
41220f480e67d70c784ffe26e8d6c902048138d39980Michael Lentine    }
41230f480e67d70c784ffe26e8d6c902048138d39980Michael Lentine
41240f480e67d70c784ffe26e8d6c902048138d39980Michael Lentine    return true;
41250f480e67d70c784ffe26e8d6c902048138d39980Michael Lentine}
41260f480e67d70c784ffe26e8d6c902048138d39980Michael Lentine
41277b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
41287b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I Wu                                   uint32_t firstVertex, uint32_t firstInstance) {
4129b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
41300f480e67d70c784ffe26e8d6c902048138d39980Michael Lentine
4131491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    get_dispatch_table(pc_device_table_map, commandBuffer)
4132491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
4133ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
4134ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
4135956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
4136956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                          uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
4137491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    get_dispatch_table(pc_device_table_map, commandBuffer)
4138491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
4139ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
4140ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
4141956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
4142956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                           uint32_t stride) {
4143956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4144cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4145cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    assert(my_data != NULL);
4146cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
4147956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdDrawIndirect(my_data->report_data, buffer, offset, count, stride);
4148cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
4149956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4150cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
4151cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    }
4152c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes}
4153c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4154956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4155956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                  uint32_t count, uint32_t stride) {
4156956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4157cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4158cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    assert(my_data != NULL);
4159cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
4160956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdDrawIndexedIndirect(my_data->report_data, buffer, offset, count, stride);
4161cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
4162956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4163cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        get_dispatch_table(pc_device_table_map, commandBuffer)
4164cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves            ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
4165cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    }
41664687f2601670ce1e77546d7f59f432f703503e83Dustin Graves}
41676f8cd63d0cb4211dd18dd4cee1634d4cf8e403e8Jon Ashburn
41687b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
41694687f2601670ce1e77546d7f59f432f703503e83Dustin Graves    get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
4170ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
4171f0615e2d3a6b0b1b633f777cdb2bd03b2c20eb57Jon Ashburn
4172956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
4173956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4174cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4175cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    assert(my_data != NULL);
4176cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
4177956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdDispatchIndirect(my_data->report_data, buffer, offset);
4178cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
4179956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4180cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
4181cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    }
4182c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes}
4183c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
41847b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
41857b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I Wu                                         uint32_t regionCount, const VkBufferCopy *pRegions) {
4186956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4187491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4188c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
4189c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
4190956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdCopyBuffer(my_data->report_data, srcBuffer, dstBuffer, regionCount, pRegions);
4191c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4192956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4193491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, commandBuffer)
4194491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
4195c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
4196c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes}
4197c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4198491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnbool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) {
4199491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (pRegions != nullptr) {
4200491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4201491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                                                    VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4202ce31fbafc11ffa7749cf95c7ff16a96507a28225Dustin Graves            log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4203825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                    UNRECOGNIZED_VALUE, LayerName,
4204491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                    "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4205491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            return false;
4206491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        }
4207491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4208491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                                                    VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4209ce31fbafc11ffa7749cf95c7ff16a96507a28225Dustin Graves            log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4210825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                    UNRECOGNIZED_VALUE, LayerName,
4211491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                    "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4212491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            return false;
4213491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        }
4214e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
4215c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
4216c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    return true;
4217c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes}
4218c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4219956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4220956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                        VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4221956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                        const VkImageCopy *pRegions) {
4222956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4223491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4224c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
4225c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
4226956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdCopyImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4227956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                     regionCount, pRegions);
4228c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
4229956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4230c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        PreCmdCopyImage(commandBuffer, pRegions);
4231c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
4232491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, commandBuffer)
4233491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
4234c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
4235b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski}
4236b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski
4237491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnbool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) {
4238491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (pRegions != nullptr) {
4239491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4240491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                                                    VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4241ce31fbafc11ffa7749cf95c7ff16a96507a28225Dustin Graves            log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4242825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                    UNRECOGNIZED_VALUE, LayerName,
4243491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                    "vkCmdCopyImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4244491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            return false;
4245491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        }
4246491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4247491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                                                    VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4248ce31fbafc11ffa7749cf95c7ff16a96507a28225Dustin Graves            log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4249825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                    UNRECOGNIZED_VALUE, LayerName,
4250491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                    "vkCmdCopyImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4251491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            return false;
4252491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        }
4253e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
4254c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
4255c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    return true;
4256c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes}
4257c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4258956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4259956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                        VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4260956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                        const VkImageBlit *pRegions, VkFilter filter) {
4261956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4262491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4263c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
4264c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
4265956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdBlitImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4266956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                     regionCount, pRegions, filter);
4267c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
4268956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4269c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        PreCmdBlitImage(commandBuffer, pRegions);
4270c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
4271491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, commandBuffer)
4272491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
4273c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
4274b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski}
4275b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski
4276491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnbool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4277491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (pRegions != nullptr) {
4278491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4279491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                                                      VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4280ce31fbafc11ffa7749cf95c7ff16a96507a28225Dustin Graves            log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4281825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                    UNRECOGNIZED_VALUE, LayerName,
4282491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                    "vkCmdCopyBufferToImage parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4283491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                    "enumerator");
4284491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            return false;
4285491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        }
4286e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
4287c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
4288c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    return true;
4289c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes}
4290c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4291956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
4292956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                VkImageLayout dstImageLayout, uint32_t regionCount,
4293956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                const VkBufferImageCopy *pRegions) {
4294956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4295491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4296c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
4297c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
4298956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdCopyBufferToImage(my_data->report_data, srcBuffer, dstImage, dstImageLayout, regionCount,
4299956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                             pRegions);
4300c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
4301956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4302c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        PreCmdCopyBufferToImage(commandBuffer, pRegions);
4303c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
4304491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, commandBuffer)
4305491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
4306c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
4307b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski}
4308b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski
4309491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnbool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageCopy *pRegions) {
4310491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (pRegions != nullptr) {
4311491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if ((pRegions->imageSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4312491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                                                      VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4313ce31fbafc11ffa7749cf95c7ff16a96507a28225Dustin Graves            log_msg(mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4314825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                    UNRECOGNIZED_VALUE, LayerName,
4315491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                    "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
4316491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                    "enumerator");
4317491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            return false;
4318491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        }
4319e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
4320c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
4321c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    return true;
4322c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes}
4323c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4324956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4325956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
4326956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4327491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4328c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
4329c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
4330956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdCopyImageToBuffer(my_data->report_data, srcImage, srcImageLayout, dstBuffer, regionCount,
4331956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                             pRegions);
4332c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
4333956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4334c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        PreCmdCopyImageToBuffer(commandBuffer, pRegions);
4335c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4336491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, commandBuffer)
4337491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
4338c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
4339c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes}
4340c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4341e43d3cee564a734d8f2333346f618004357d6e0cMark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4342e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski                                           VkDeviceSize dataSize, const uint32_t *pData) {
4343e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski    bool skip_call = false;
4344491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4345c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
4346c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
4347e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski    skip_call |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData);
4348c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4349e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski    if (dstOffset & 3) {
4350825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski        skip_call |= log_msg(
4351825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski            my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4352825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski            LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
4353e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski    }
4354e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski
4355e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski    if ((dataSize <= 0) || (dataSize > 65536)) {
4356e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski        skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
4357825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                             INVALID_USAGE, LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64
4358825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                                                       "), must be greater than zero and less than or equal to 65536",
4359e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski                             dataSize);
4360e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski    } else if (dataSize & 3) {
4361825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski        skip_call |= log_msg(
4362825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski            my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4363825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski            LayerName, "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", dataSize);
4364e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski    }
4365e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski
4366e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski    if (!skip_call) {
4367491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, commandBuffer)
4368491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
4369c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
4370c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes}
4371c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4372e43d3cee564a734d8f2333346f618004357d6e0cMark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4373e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski                                         VkDeviceSize size, uint32_t data) {
4374e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski    bool skip_call = false;
4375cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4376cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    assert(my_data != NULL);
4377cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
4378e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski    skip_call |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data);
4379cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
4380e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski    if (dstOffset & 3) {
4381825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski        skip_call |= log_msg(
4382825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski            my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4383825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski            LayerName, "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset);
4384e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski    }
4385e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski
4386e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski    if (size != VK_WHOLE_SIZE) {
4387e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski        if (size <= 0) {
4388e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski            skip_call |= log_msg(
4389e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski                my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE,
4390825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                LayerName, "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size);
4391e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski        } else if (size & 3) {
4392e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski            skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__,
4393825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                                 INVALID_USAGE, LayerName,
4394e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski                                 "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size);
4395e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski        }
4396e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski    }
4397e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski
4398e43d3cee564a734d8f2333346f618004357d6e0cMark Lobodzinski    if (!skip_call) {
4399cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
4400cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    }
4401ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
4402c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4403956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4404956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                              const VkClearColorValue *pColor, uint32_t rangeCount,
4405956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                              const VkImageSubresourceRange *pRanges) {
4406956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4407491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4408c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
4409c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
4410956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdClearColorImage(my_data->report_data, image, imageLayout, pColor, rangeCount, pRanges);
4411ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
4412956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4413491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, commandBuffer)
4414491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
4415c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
4416ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes}
4417ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
4418956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
4419956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                     const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
4420956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                     const VkImageSubresourceRange *pRanges) {
4421956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4422491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4423c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
4424c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
4425956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdClearDepthStencilImage(my_data->report_data, image, imageLayout, pDepthStencil,
4426956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                  rangeCount, pRanges);
4427c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
4428956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4429491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, commandBuffer)
4430491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
4431c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
4432c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes}
4433c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
44347b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
44357b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I Wu                                               const VkClearAttachment *pAttachments, uint32_t rectCount,
44367b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I Wu                                               const VkClearRect *pRects) {
4437956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4438491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4439c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
4440c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
4441956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdClearAttachments(my_data->report_data, attachmentCount, pAttachments, rectCount, pRects);
4442b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski
4443956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4444491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, commandBuffer)
4445491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
4446c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
4447b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski}
4448b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski
4449491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnbool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRegions) {
4450491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    if (pRegions != nullptr) {
4451491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if ((pRegions->srcSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4452491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                                                    VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4453491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            log_msg(
4454ce31fbafc11ffa7749cf95c7ff16a96507a28225Dustin Graves                mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4455825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                UNRECOGNIZED_VALUE, LayerName,
4456491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                "vkCmdResolveImage parameter, VkImageAspect pRegions->srcSubresource.aspectMask, is an unrecognized enumerator");
4457491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            return false;
4458491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        }
4459491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        if ((pRegions->dstSubresource.aspectMask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT |
4460491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                                                    VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT)) == 0) {
4461491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            log_msg(
4462ce31fbafc11ffa7749cf95c7ff16a96507a28225Dustin Graves                mdd(commandBuffer), VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
4463825ac70f99460ccb9494d34f93d8ee7ec303e5deMark Lobodzinski                UNRECOGNIZED_VALUE, LayerName,
4464491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                "vkCmdResolveImage parameter, VkImageAspect pRegions->dstSubresource.aspectMask, is an unrecognized enumerator");
4465491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            return false;
4466491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        }
4467e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes    }
4468c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
4469c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    return true;
4470c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes}
4471c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4472956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
4473956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                           VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
4474956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                           const VkImageResolve *pRegions) {
4475956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4476491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4477c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
4478c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
4479956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdResolveImage(my_data->report_data, srcImage, srcImageLayout, dstImage, dstImageLayout,
4480956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                        regionCount, pRegions);
4481c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4482956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4483c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        PreCmdResolveImage(commandBuffer, pRegions);
4484c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
4485491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, commandBuffer)
4486491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
4487c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
4488c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes}
4489c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4490956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
4491956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4492cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4493cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    assert(my_data != NULL);
4494cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
4495956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdSetEvent(my_data->report_data, event, stageMask);
4496cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
4497956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4498cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
4499cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    }
4500c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes}
4501c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4502956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
4503956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4504cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4505cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    assert(my_data != NULL);
4506cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
4507956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdResetEvent(my_data->report_data, event, stageMask);
4508cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
4509956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4510cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
4511cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    }
4512c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes}
4513c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4514956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
4515956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                         VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
4516956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                         uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4517956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                         uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4518956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                         uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4519956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4520491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4521c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
4522c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
4523956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdWaitEvents(my_data->report_data, eventCount, pEvents, srcStageMask, dstStageMask,
4524956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                      memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4525956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                      pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
4526a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn
4527956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4528491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, commandBuffer)
4529491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
4530491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                            bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
4531491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    }
4532491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn}
4533491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn
4534956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
4535956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                              VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
4536956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                              uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
4537956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                              uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
4538956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                              uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
4539956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4540491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4541c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
4542c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves
4543956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdPipelineBarrier(my_data->report_data, srcStageMask, dstStageMask, dependencyFlags,
4544956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                           memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
4545956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                           pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
4546a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn
4547956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4548491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, commandBuffer)
4549491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
4550491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                                 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
4551c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
4552c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes}
4553c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4554956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
4555956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                         VkQueryControlFlags flags) {
4556956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4557cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4558cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    assert(my_data != NULL);
4559cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
4560956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdBeginQuery(my_data->report_data, queryPool, slot, flags);
4561cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
4562956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4563cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
4564cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    }
4565c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes}
4566c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
45677b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
4568956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4569cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4570cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    assert(my_data != NULL);
4571cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
4572956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdEndQuery(my_data->report_data, queryPool, slot);
4573cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
4574956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4575cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, slot);
4576cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    }
4577c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes}
4578c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4579956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4580956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                             uint32_t queryCount) {
4581956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4582cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4583cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    assert(my_data != NULL);
4584cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
4585956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdResetQueryPool(my_data->report_data, queryPool, firstQuery, queryCount);
4586cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
4587956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4588cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        get_dispatch_table(pc_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
4589cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    }
4590c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes}
4591c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4592491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnbool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
4593491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn                           uint32_t slot) {
4594ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
459559c215d5fe27c1fd8da2a14be6e144d40f2cd6b4Chia-I Wu    ValidateEnumerator(pipelineStage);
4596c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
4597c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes    return true;
4598c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes}
4599c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
46007b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
46017b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I Wu                                             VkQueryPool queryPool, uint32_t query) {
4602956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4603cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4604cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    assert(my_data != NULL);
4605cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
4606956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdWriteTimestamp(my_data->report_data, pipelineStage, queryPool, query);
460720f68594175ea65bde6294bb2c0959024a3df155Mark Lobodzinski
4608956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4609cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        get_dispatch_table(pc_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4610cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
4611cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        PostCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
4612cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    }
4613c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes}
4614c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4615956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
4616956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                   uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
4617956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                   VkDeviceSize stride, VkQueryResultFlags flags) {
4618956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4619cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4620cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    assert(my_data != NULL);
4621cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
4622956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdCopyQueryPoolResults(my_data->report_data, queryPool, firstQuery, queryCount, dstBuffer,
4623956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                dstOffset, stride, flags);
4624cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves
4625956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4626cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves        get_dispatch_table(pc_device_table_map, commandBuffer)
4627cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves            ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
4628cba0861249f2112e41cd00600a832d7fb605c7b8Dustin Graves    }
4629491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn}
4630491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn
4631956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
4632956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                            uint32_t offset, uint32_t size, const void *pValues) {
4633956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4634491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4635c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
4636c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
4637956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdPushConstants(my_data->report_data, layout, stageFlags, offset, size, pValues);
4638c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
4639956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4640491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, commandBuffer)
4641491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
4642c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes    }
4643c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes}
4644c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4645956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
4646956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                              VkSubpassContents contents) {
4647956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4648491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4649c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
4650e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
4651956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdBeginRenderPass(my_data->report_data, pRenderPassBegin, contents);
4652ea53d6fffd5bf5861ebaa462fae5365dd77c2a46Jeremy Hayes
4653956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4654c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves        get_dispatch_table(pc_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
4655c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
4656f0615e2d3a6b0b1b633f777cdb2bd03b2c20eb57Jon Ashburn}
4657f0615e2d3a6b0b1b633f777cdb2bd03b2c20eb57Jon Ashburn
46587b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
4659956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4660c3fc3d8e91f24136f4e2cc036e92033b826a96e7Dustin Graves    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4661c3fc3d8e91f24136f4e2cc036e92033b826a96e7Dustin Graves    assert(my_data != NULL);
4662c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu
4663956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdNextSubpass(my_data->report_data, contents);
4664c3fc3d8e91f24136f4e2cc036e92033b826a96e7Dustin Graves
4665956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4666c3fc3d8e91f24136f4e2cc036e92033b826a96e7Dustin Graves        get_dispatch_table(pc_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
4667c3fc3d8e91f24136f4e2cc036e92033b826a96e7Dustin Graves    }
4668e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes}
4669e841fdc68f9d44b26b2b4542c02a3f23bb6c1752Jeremy Hayes
46707b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
4671b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
467288eaa3bf0c7874f8b62cf35e3b649201ecc47c36Chia-I Wu}
4673c278df83ca4958fda8efcf3b52e2f89c8ccd8991Chia-I Wu
4674956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
4675956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                              const VkCommandBuffer *pCommandBuffers) {
4676956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
4677491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4678c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    assert(my_data != NULL);
4679c27938e86dbf318ea4d7dd411f4ebbe42bea19c9Jeremy Hayes
4680956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCmdExecuteCommands(my_data->report_data, commandBufferCount, pCommandBuffers);
4681c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4682956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4683491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn        get_dispatch_table(pc_device_table_map, commandBuffer)
4684491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn            ->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
4685c87f31ee35ccc0cd9fd637b6f1b7e3c8dae51c2dDustin Graves    }
46865b66aa51f060c804e1804cf45909ed6489552c62Chia-I Wu}
4687c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
4688956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
4689a4e71cd8b4e77502943dd894ed95426a25dffbd5Chia-I Wu    return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4690a4e71cd8b4e77502943dd894ed95426a25dffbd5Chia-I Wu}
4691a4e71cd8b4e77502943dd894ed95426a25dffbd5Chia-I Wu
4692956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4693956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                              VkLayerProperties *pProperties) {
4694a4e71cd8b4e77502943dd894ed95426a25dffbd5Chia-I Wu    return util_GetLayerProperties(1, &global_layer, pCount, pProperties);
4695a4e71cd8b4e77502943dd894ed95426a25dffbd5Chia-I Wu}
4696a4e71cd8b4e77502943dd894ed95426a25dffbd5Chia-I Wu
4697956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4698956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                    VkExtensionProperties *pProperties) {
4699a4e71cd8b4e77502943dd894ed95426a25dffbd5Chia-I Wu    if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
4700a4e71cd8b4e77502943dd894ed95426a25dffbd5Chia-I Wu        return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
4701a4e71cd8b4e77502943dd894ed95426a25dffbd5Chia-I Wu
4702a4e71cd8b4e77502943dd894ed95426a25dffbd5Chia-I Wu    return VK_ERROR_LAYER_NOT_PRESENT;
4703a4e71cd8b4e77502943dd894ed95426a25dffbd5Chia-I Wu}
4704a4e71cd8b4e77502943dd894ed95426a25dffbd5Chia-I Wu
4705956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
4706956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                  uint32_t *pCount, VkExtensionProperties *pProperties) {
470710e00a4031ad2744efadfcb2c8eab521472f35a7Chia-I Wu    /* parameter_validation does not have any physical device extensions */
4708381a54a40f7d927402fbeef3cd320c877bb2f344Chia-I Wu    if (pLayerName && !strcmp(pLayerName, global_layer.layerName))
470910e00a4031ad2744efadfcb2c8eab521472f35a7Chia-I Wu        return util_GetExtensionProperties(0, NULL, pCount, pProperties);
4710381a54a40f7d927402fbeef3cd320c877bb2f344Chia-I Wu
4711381a54a40f7d927402fbeef3cd320c877bb2f344Chia-I Wu    assert(physicalDevice);
4712381a54a40f7d927402fbeef3cd320c877bb2f344Chia-I Wu
4713381a54a40f7d927402fbeef3cd320c877bb2f344Chia-I Wu    return get_dispatch_table(pc_instance_table_map, physicalDevice)
4714381a54a40f7d927402fbeef3cd320c877bb2f344Chia-I Wu        ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
471510e00a4031ad2744efadfcb2c8eab521472f35a7Chia-I Wu}
471610e00a4031ad2744efadfcb2c8eab521472f35a7Chia-I Wu
47178c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski// WSI Extension Functions
47188c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
47198c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
4720956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                  const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
47218c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4722956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
47238c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
47248c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    assert(my_data != NULL);
47258c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4726956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkCreateSwapchainKHR(my_data->report_data, pCreateInfo, pAllocator, pSwapchain);
47278c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4728956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
47298c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        result = get_dispatch_table(pc_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
47308c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
47318c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        validate_result(my_data->report_data, "vkCreateSwapchainKHR", result);
47328c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    }
47338c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
47348c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    return result;
47358c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski}
47368c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
47378c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
4738956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                     VkImage *pSwapchainImages) {
47398c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4740956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
47418c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
47428c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    assert(my_data != NULL);
47438c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4744956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |=
47458c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        parameter_validation_vkGetSwapchainImagesKHR(my_data->report_data, swapchain, pSwapchainImageCount, pSwapchainImages);
47468c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4747956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
47488c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        result = get_dispatch_table(pc_device_table_map, device)
47498c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski                     ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
47508c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
47518c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        validate_result(my_data->report_data, "vkGetSwapchainImagesKHR", result);
47528c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    }
47538c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
47548c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    return result;
47558c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski}
47568c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
47578c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
4758956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                   VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
47598c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4760956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
47618c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
47628c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    assert(my_data != NULL);
47638c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4764956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |=
47658c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        parameter_validation_vkAcquireNextImageKHR(my_data->report_data, swapchain, timeout, semaphore, fence, pImageIndex);
47668c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4767956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
47688c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        result = get_dispatch_table(pc_device_table_map, device)
4769956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                     ->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
47708c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
47718c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        validate_result(my_data->report_data, "vkAcquireNextImageKHR", result);
47728c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    }
47738c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
47748c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    return result;
47758c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski}
47768c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
47778c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
47788c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4779956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
47808c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
47818c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    assert(my_data != NULL);
47828c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4783956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkQueuePresentKHR(my_data->report_data, pPresentInfo);
47848c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4785956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
47868c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        result = get_dispatch_table(pc_device_table_map, queue)->QueuePresentKHR(queue, pPresentInfo);
47878c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
47888c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        validate_result(my_data->report_data, "vkQueuePresentKHR", result);
47898c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    }
47908c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
47918c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    return result;
47928c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski}
47938c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
47948c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
47958c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski                                                                  VkSurfaceKHR surface, VkBool32 *pSupported) {
47968c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4797956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
47988c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
47998c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    assert(my_data != NULL);
48008c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4801956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |=
48028c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        parameter_validation_vkGetPhysicalDeviceSurfaceSupportKHR(my_data->report_data, queueFamilyIndex, surface, pSupported);
48038c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4804956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
48058c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        result = get_dispatch_table(pc_instance_table_map, physicalDevice)
48068c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski                     ->GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
48078c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
48088c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceSupportKHR", result);
48098c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    }
48108c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
48118c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    return result;
48128c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski}
48138c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
48148c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
48158c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski                                                                       VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
48168c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4817956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
48188c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
48198c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    assert(my_data != NULL);
48208c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4821956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |=
4822956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        parameter_validation_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(my_data->report_data, surface, pSurfaceCapabilities);
48238c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4824956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
48258c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        result = get_dispatch_table(pc_instance_table_map, physicalDevice)
48268c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski                     ->GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
48278c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
48288c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", result);
48298c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    }
48308c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
48318c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    return result;
48328c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski}
48338c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
48348c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
48358c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski                                                                  uint32_t *pSurfaceFormatCount,
48368c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski                                                                  VkSurfaceFormatKHR *pSurfaceFormats) {
48378c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4838956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
48398c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
48408c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    assert(my_data != NULL);
48418c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4842956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkGetPhysicalDeviceSurfaceFormatsKHR(my_data->report_data, surface, pSurfaceFormatCount,
4843956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                           pSurfaceFormats);
48448c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4845956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
48468c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        result = get_dispatch_table(pc_instance_table_map, physicalDevice)
48478c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski                     ->GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
48488c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
48498c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfaceFormatsKHR", result);
48508c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    }
48518c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
48528c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    return result;
48538c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski}
48548c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
48558c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
48568c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski                                                                       uint32_t *pPresentModeCount,
48578c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski                                                                       VkPresentModeKHR *pPresentModes) {
48588c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4859956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = false;
48608c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
48618c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    assert(my_data != NULL);
48628c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4863956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    skip_call |= parameter_validation_vkGetPhysicalDeviceSurfacePresentModesKHR(my_data->report_data, surface, pPresentModeCount,
4864956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                                pPresentModes);
48658c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4866956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
48678c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        result = get_dispatch_table(pc_instance_table_map, physicalDevice)
48688c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski                     ->GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
48698c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
48708c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        validate_result(my_data->report_data, "vkGetPhysicalDeviceSurfacePresentModesKHR", result);
48718c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    }
48728c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
48738c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    return result;
48748c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski}
48758c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
48768c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#ifdef VK_USE_PLATFORM_WIN32_KHR
48778c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
48788c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski                                                     const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
48798c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
48808c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
48818c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
48828c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    assert(my_data != NULL);
48838c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4884956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = parameter_validation_vkCreateWin32SurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
48858c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4886956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
48878c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        result =
48888c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski            get_dispatch_table(pc_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
48898c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    }
48908c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
48918c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    validate_result(my_data->report_data, "vkCreateWin32SurfaceKHR", result);
48928c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
48938c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    return result;
48948c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski}
48958c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#endif // VK_USE_PLATFORM_WIN32_KHR
48968c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
48978c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#ifdef VK_USE_PLATFORM_XCB_KHR
48988c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
48998c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski                                                   const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
49008c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
49018c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
49028c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
49038c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    assert(my_data != NULL);
49048c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4905956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = parameter_validation_vkCreateXcbSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
49068c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4907956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
49088c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        result =
49098c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski            get_dispatch_table(pc_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
49108c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    }
49118c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
49128c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    validate_result(my_data->report_data, "vkCreateXcbSurfaceKHR", result);
49138c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
49148c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    return result;
49158c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski}
49168c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4917956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4918956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                          uint32_t queueFamilyIndex, xcb_connection_t *connection,
4919956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                          xcb_visualid_t visual_id) {
49208c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    VkBool32 result = false;
49218c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
49228c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
49238c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    assert(my_data != NULL);
49248c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4925956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = parameter_validation_vkGetPhysicalDeviceXcbPresentationSupportKHR(my_data->report_data, queueFamilyIndex,
4926956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                                       connection, visual_id);
49278c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4928956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4929956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4930956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                     ->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
49318c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    }
49328c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
49338c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    return result;
49348c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski}
49358c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#endif // VK_USE_PLATFORM_XCB_KHR
49368c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
49378c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#ifdef VK_USE_PLATFORM_XLIB_KHR
49388c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
4939956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                    const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
49408c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
49418c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
49428c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
49438c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    assert(my_data != NULL);
49448c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4945956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = parameter_validation_vkCreateXlibSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
49468c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4947956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
49488c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        result =
49498c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski            get_dispatch_table(pc_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
49508c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    }
49518c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
49528c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    validate_result(my_data->report_data, "vkCreateXlibSurfaceKHR", result);
49538c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
49548c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    return result;
49558c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski}
49568c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4957956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4958956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                           uint32_t queueFamilyIndex, Display *dpy,
4959956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                           VisualID visualID) {
49608c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    VkBool32 result = false;
49618c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
49628c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
49638c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    assert(my_data != NULL);
49648c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4965956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call =
4966956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        parameter_validation_vkGetPhysicalDeviceXlibPresentationSupportKHR(my_data->report_data, queueFamilyIndex, dpy, visualID);
49678c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4968956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
4969956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        result = get_dispatch_table(pc_instance_table_map, physicalDevice)
4970956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                     ->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
49718c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    }
4972e8a100f135c260ad3021b630d7715dc14e09d6a6Karl Schultz    return result;
49738c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski}
49748c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#endif // VK_USE_PLATFORM_XLIB_KHR
49758c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
49768c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#ifdef VK_USE_PLATFORM_MIR_KHR
49778c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
4978956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                   const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
49798c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
49808c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
49818c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
49828c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    assert(my_data != NULL);
49838c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4984956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = parameter_validation_vkCreateMirSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
49858c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4986956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
49878c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        result =
49888c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski            get_dispatch_table(pc_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
49898c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    }
49908c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
49918c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    validate_result(my_data->report_data, "vkCreateMirSurfaceKHR", result);
49928c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
49938c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    return result;
49948c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski}
49958c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
4996956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
4997956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                          uint32_t queueFamilyIndex, MirConnection *connection) {
49988c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    VkBool32 result = false;
49998c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
50008c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
50018c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    assert(my_data != NULL);
50028c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
5003956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call =
5004956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        parameter_validation_vkGetPhysicalDeviceMirPresentationSupportKHR(my_data->report_data, queueFamilyIndex, connection);
50058c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
5006956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
5007956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5008956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                     ->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
50098c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    }
50108c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski}
50118c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#endif // VK_USE_PLATFORM_MIR_KHR
50128c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
50138c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#ifdef VK_USE_PLATFORM_WAYLAND_KHR
50148c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
5015956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                       const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
50168c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
50178c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
50188c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
50198c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    assert(my_data != NULL);
50208c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
5021956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = parameter_validation_vkCreateWaylandSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
50228c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
5023956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
5024956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        result = get_dispatch_table(pc_instance_table_map, instance)
5025956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                     ->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
50268c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    }
50278c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
50288c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    validate_result(my_data->report_data, "vkCreateWaylandSurfaceKHR", result);
50298c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
50308c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    return result;
50318c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski}
50328c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
5033956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
5034956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                              uint32_t queueFamilyIndex,
5035956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                              struct wl_display *display) {
50368c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    VkBool32 result = false;
50378c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
50388c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
50398c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    assert(my_data != NULL);
50408c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
5041956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call =
5042956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        parameter_validation_vkGetPhysicalDeviceWaylandPresentationSupportKHR(my_data->report_data, queueFamilyIndex, display);
50438c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
5044956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
5045956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5046956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                     ->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
50478c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    }
50488c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski}
50498c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#endif // VK_USE_PLATFORM_WAYLAND_KHR
50508c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
50518c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#ifdef VK_USE_PLATFORM_ANDROID_KHR
50528c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
5053956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                       const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
50548c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
50558c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
50568c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
50578c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    assert(my_data != NULL);
50588c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
5059956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    bool skip_call = parameter_validation_vkCreateAndroidSurfaceKHR(my_data->report_data, pCreateInfo, pAllocator, pSurface);
50608c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
5061956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (!skip_call) {
5062956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        result = get_dispatch_table(pc_instance_table_map, instance)
5063956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                     ->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
50648c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    }
50658c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
50668c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    validate_result(my_data->report_data, "vkCreateAndroidSurfaceKHR", result);
50678c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
50688c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    return result;
50698c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski}
50708c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#endif // VK_USE_PLATFORM_ANDROID_KHR
50718c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
507219ab93c7fb4fb9ae62679852783a97f599d1b367Mark YoungVKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
507319ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young                                                         const VkSwapchainCreateInfoKHR *pCreateInfos,
507419ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young                                                         const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
507519ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
507619ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young    bool skip_call = false;
507719ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
507819ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young    assert(my_data != NULL);
507919ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young
508019ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young    skip_call |= parameter_validation_vkCreateSharedSwapchainsKHR(my_data->report_data, swapchainCount, pCreateInfos, pAllocator,
508119ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young                                                                  pSwapchains);
508219ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young
508319ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young    if (!skip_call) {
508419ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young        result = get_dispatch_table(pc_device_table_map, device)
508519ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young                     ->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
508619ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young
508719ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young        validate_result(my_data->report_data, "vkCreateSharedSwapchainsKHR", result);
508819ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young    }
508919ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young
509019ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young    return result;
509119ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young}
509219ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young
5093fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski// VK_EXT_debug_marker Extension
5094fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
5095fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5096fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    bool skip_call = false;
5097fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5098fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    assert(my_data != NULL);
5099fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski
5100fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    skip_call |= parameter_validation_vkDebugMarkerSetObjectTagEXT(my_data->report_data, pTagInfo);
5101fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski
5102fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    if (!skip_call) {
5103fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski        result = get_dispatch_table(pc_device_table_map, device)->DebugMarkerSetObjectTagEXT(device, pTagInfo);
5104fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski
5105fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski        validate_result(my_data->report_data, "vkDebugMarkerSetObjectTagEXT", result);
5106fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    }
5107fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski
5108fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    return result;
5109fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski}
5110fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski
5111fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
5112fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5113fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    bool skip_call = false;
5114fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5115fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    assert(my_data != NULL);
5116fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski
5117fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    skip_call |= parameter_validation_vkDebugMarkerSetObjectNameEXT(my_data->report_data, pNameInfo);
5118fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski
5119fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    if (!skip_call) {
5120fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski        VkResult result = get_dispatch_table(pc_device_table_map, device)->DebugMarkerSetObjectNameEXT(device, pNameInfo);
5121fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski
5122fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski        validate_result(my_data->report_data, "vkDebugMarkerSetObjectNameEXT", result);
5123fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    }
5124fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski
5125fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    return result;
5126fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski}
5127fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski
5128fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
5129fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    bool skip_call = false;
5130fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5131fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    assert(my_data != NULL);
5132fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski
5133fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    skip_call |= parameter_validation_vkCmdDebugMarkerBeginEXT(my_data->report_data, pMarkerInfo);
5134fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski
5135fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    if (!skip_call) {
5136fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski        get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
5137fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    }
5138fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski}
5139fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski
5140fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark LobodzinskiVKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
5141fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    bool skip_call = false;
5142fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
5143fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    assert(my_data != NULL);
5144fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski
5145fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    skip_call |= parameter_validation_vkCmdDebugMarkerInsertEXT(my_data->report_data, pMarkerInfo);
5146fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski
5147fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    if (!skip_call) {
5148fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski        get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
5149fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski    }
5150fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski}
5151fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski
5152c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski// VK_NV_external_memory_capabilities Extension
5153c92401037746bfd57b3872434008dc2301c89338Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
5154c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski    VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
5155c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski    VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
5156c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski    VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
5157c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski
5158c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5159c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski    bool skip_call = false;
5160c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski    layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
5161c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski    assert(my_data != NULL);
5162c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski
5163c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski    skip_call |= parameter_validation_vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
5164c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski        my_data->report_data, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
5165c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski
5166c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski    if (!skip_call) {
5167c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski        result = get_dispatch_table(pc_instance_table_map, physicalDevice)
5168c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski                     ->GetPhysicalDeviceExternalImageFormatPropertiesNV(physicalDevice, format, type, tiling, usage, flags,
5169c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski                                                                        externalHandleType, pExternalImageFormatProperties);
5170c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski
5171c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski        validate_result(my_data->report_data, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV", result);
5172c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski    }
5173c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski
5174c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski    return result;
5175c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski}
5176c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski
5177b026ed12073ccca12f7c333474076f369eaef08dMark Lobodzinski#ifdef VK_USE_PLATFORM_WIN32_KHR
5178b026ed12073ccca12f7c333474076f369eaef08dMark Lobodzinski// VK_NV_external_memory_win32 Extension
5179b026ed12073ccca12f7c333474076f369eaef08dMark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
5180b026ed12073ccca12f7c333474076f369eaef08dMark Lobodzinski                                                      VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
5181b026ed12073ccca12f7c333474076f369eaef08dMark Lobodzinski
5182b026ed12073ccca12f7c333474076f369eaef08dMark Lobodzinski    VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5183b026ed12073ccca12f7c333474076f369eaef08dMark Lobodzinski    bool skip_call = false;
5184b026ed12073ccca12f7c333474076f369eaef08dMark Lobodzinski    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5185b026ed12073ccca12f7c333474076f369eaef08dMark Lobodzinski    assert(my_data != NULL);
5186b026ed12073ccca12f7c333474076f369eaef08dMark Lobodzinski
5187b026ed12073ccca12f7c333474076f369eaef08dMark Lobodzinski    skip_call |= parameter_validation_vkGetMemoryWin32HandleNV(my_data->report_data, memory, handleType, pHandle);
5188b026ed12073ccca12f7c333474076f369eaef08dMark Lobodzinski
5189b026ed12073ccca12f7c333474076f369eaef08dMark Lobodzinski    if (!skip_call) {
5190b026ed12073ccca12f7c333474076f369eaef08dMark Lobodzinski        result = get_dispatch_table(pc_device_table_map, device)->GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
5191b026ed12073ccca12f7c333474076f369eaef08dMark Lobodzinski    }
5192b026ed12073ccca12f7c333474076f369eaef08dMark Lobodzinski
5193b026ed12073ccca12f7c333474076f369eaef08dMark Lobodzinski    return result;
5194b026ed12073ccca12f7c333474076f369eaef08dMark Lobodzinski}
5195b026ed12073ccca12f7c333474076f369eaef08dMark Lobodzinski#endif // VK_USE_PLATFORM_WIN32_KHR
5196c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski
5197c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski
5198fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski
5199956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinskistatic PFN_vkVoidFunction intercept_core_instance_command(const char *name);
52008c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
5201956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinskistatic PFN_vkVoidFunction intercept_core_device_command(const char *name);
52028c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
5203956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinskistatic PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device);
52048c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
5205956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinskistatic PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance);
52068c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
52077b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
5208bab209437b44c55f3068e416b5efa6bebda65a59Chia-I Wu    assert(device);
5209bab209437b44c55f3068e416b5efa6bebda65a59Chia-I Wu
5210b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski    layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
5211b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski
5212bb84994a71bd9b17b407ac33eb82020014b8126aDustin Graves    if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) {
5213b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski        return NULL;
5214b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski    }
5215b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski
5216bab209437b44c55f3068e416b5efa6bebda65a59Chia-I Wu    PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
5217bab209437b44c55f3068e416b5efa6bebda65a59Chia-I Wu    if (proc)
5218bab209437b44c55f3068e416b5efa6bebda65a59Chia-I Wu        return proc;
52192bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter
52208c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    proc = InterceptWsiEnabledCommand(funcName, device);
52218c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    if (proc)
52228c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        return proc;
52238c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
5224b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL)
52252bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter        return NULL;
5226b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName);
5227c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes}
5228c6cfa5772820b7d75469f113266187bda00e2c76Jeremy Hayes
52297b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I WuVKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
5230fc4ebd6db76615ac51ff732627222f0b830949f1Chia-I Wu    PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
52315a5da26ab8e94ac12324dcc4b970e48f38faa234Chia-I Wu    if (!proc)
52325a5da26ab8e94ac12324dcc4b970e48f38faa234Chia-I Wu        proc = intercept_core_device_command(funcName);
52338c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
52348c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    if (!proc)
52358c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        proc = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
5236956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski
5237fc4ebd6db76615ac51ff732627222f0b830949f1Chia-I Wu    if (proc)
5238fc4ebd6db76615ac51ff732627222f0b830949f1Chia-I Wu        return proc;
5239fc4ebd6db76615ac51ff732627222f0b830949f1Chia-I Wu
5240fc4ebd6db76615ac51ff732627222f0b830949f1Chia-I Wu    assert(instance);
52412bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter
5242b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
5243b2c8e0814487a459507ac51e8856d90a845e101aMark Lobodzinski
5244fc4ebd6db76615ac51ff732627222f0b830949f1Chia-I Wu    proc = debug_report_get_instance_proc_addr(data->report_data, funcName);
52458c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    if (!proc)
52468c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        proc = InterceptWsiEnabledCommand(funcName, instance);
52478c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
5248fc4ebd6db76615ac51ff732627222f0b830949f1Chia-I Wu    if (proc)
5249fc4ebd6db76615ac51ff732627222f0b830949f1Chia-I Wu        return proc;
525009f8504df85293a4ca7a9eb234f42e7949f7a049Courtney Goeltzenleuchter
5251b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL)
52522bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter        return NULL;
5253b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski    return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
525479b78ace8a69e7e9ef067d3575aee09c5a05a50fJon Ashburn}
525510e00a4031ad2744efadfcb2c8eab521472f35a7Chia-I Wu
5256956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinskistatic PFN_vkVoidFunction intercept_core_instance_command(const char *name) {
5257fc4ebd6db76615ac51ff732627222f0b830949f1Chia-I Wu    static const struct {
5258fc4ebd6db76615ac51ff732627222f0b830949f1Chia-I Wu        const char *name;
5259fc4ebd6db76615ac51ff732627222f0b830949f1Chia-I Wu        PFN_vkVoidFunction proc;
5260fc4ebd6db76615ac51ff732627222f0b830949f1Chia-I Wu    } core_instance_commands[] = {
5261956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr)},
5262956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance)},
5263956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance)},
5264956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice)},
5265956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices)},
5266956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties)},
5267956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures)},
5268956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties)},
5269956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties)},
5270956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkGetPhysicalDeviceSparseImageFormatProperties",
5271956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski         reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties)},
5272956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties)},
5273956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties)},
5274956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties)},
5275956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties)},
5276956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties)},
5277956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties)},
5278c92401037746bfd57b3872434008dc2301c89338Mark Lobodzinski        {"vkGetPhysicalDeviceExternalImageFormatPropertiesNV", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceExternalImageFormatPropertiesNV) },
5279fc4ebd6db76615ac51ff732627222f0b830949f1Chia-I Wu    };
5280fc4ebd6db76615ac51ff732627222f0b830949f1Chia-I Wu
5281fc4ebd6db76615ac51ff732627222f0b830949f1Chia-I Wu    for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
5282fc4ebd6db76615ac51ff732627222f0b830949f1Chia-I Wu        if (!strcmp(core_instance_commands[i].name, name))
5283fc4ebd6db76615ac51ff732627222f0b830949f1Chia-I Wu            return core_instance_commands[i].proc;
5284fc4ebd6db76615ac51ff732627222f0b830949f1Chia-I Wu    }
5285fc4ebd6db76615ac51ff732627222f0b830949f1Chia-I Wu
5286fc4ebd6db76615ac51ff732627222f0b830949f1Chia-I Wu    return nullptr;
5287fc4ebd6db76615ac51ff732627222f0b830949f1Chia-I Wu}
5288fc4ebd6db76615ac51ff732627222f0b830949f1Chia-I Wu
5289956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinskistatic PFN_vkVoidFunction intercept_core_device_command(const char *name) {
5290bab209437b44c55f3068e416b5efa6bebda65a59Chia-I Wu    static const struct {
5291bab209437b44c55f3068e416b5efa6bebda65a59Chia-I Wu        const char *name;
5292bab209437b44c55f3068e416b5efa6bebda65a59Chia-I Wu        PFN_vkVoidFunction proc;
5293bab209437b44c55f3068e416b5efa6bebda65a59Chia-I Wu    } core_device_commands[] = {
5294956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr)},
5295956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice)},
5296956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue)},
5297956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(QueueSubmit)},
5298956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(QueueWaitIdle)},
5299956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(DeviceWaitIdle)},
5300956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkAllocateMemory", reinterpret_cast<PFN_vkVoidFunction>(AllocateMemory)},
5301956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(FreeMemory)},
5302956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(MapMemory)},
5303956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(UnmapMemory)},
5304956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(FlushMappedMemoryRanges)},
5305956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(InvalidateMappedMemoryRanges)},
5306956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(GetDeviceMemoryCommitment)},
5307956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(BindBufferMemory)},
5308956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(BindImageMemory)},
5309956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence)},
5310956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence)},
5311956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(ResetFences)},
5312956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(GetFenceStatus)},
5313956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(WaitForFences)},
5314956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore)},
5315956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(DestroySemaphore)},
5316956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent)},
5317956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent)},
5318956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(GetEventStatus)},
5319956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(SetEvent)},
5320956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(ResetEvent)},
5321956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CreateQueryPool)},
5322956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyQueryPool)},
5323956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(GetQueryPoolResults)},
5324956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer)},
5325956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer)},
5326956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView)},
5327956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView)},
5328956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(CreateImage)},
5329956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(DestroyImage)},
5330956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(GetImageSubresourceLayout)},
5331956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(CreateImageView)},
5332956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(DestroyImageView)},
5333956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule)},
5334956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(DestroyShaderModule)},
5335956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineCache)},
5336956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineCache)},
5337956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(GetPipelineCacheData)},
5338956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(MergePipelineCaches)},
5339956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateGraphicsPipelines)},
5340956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines)},
5341956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipeline)},
5342956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(CreatePipelineLayout)},
5343956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyPipelineLayout)},
5344956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(CreateSampler)},
5345956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(DestroySampler)},
5346956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout)},
5347956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout)},
5348956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool)},
5349956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool)},
5350956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(ResetDescriptorPool)},
5351956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkAllocateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(AllocateDescriptorSets)},
5352956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(FreeDescriptorSets)},
5353956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(UpdateDescriptorSets)},
5354956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport)},
5355956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor)},
5356956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth)},
5357956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias)},
5358956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants)},
5359956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds)},
5360956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask)},
5361956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask)},
5362956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference)},
5363956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkAllocateCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers)},
5364956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkFreeCommandBuffers", reinterpret_cast<PFN_vkVoidFunction>(FreeCommandBuffers)},
5365956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(BeginCommandBuffer)},
5366956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(EndCommandBuffer)},
5367956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandBuffer)},
5368956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline)},
5369956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets)},
5370956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers)},
5371956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer)},
5372956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(CmdDraw)},
5373956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexed)},
5374956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndirect)},
5375956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDrawIndexedIndirect)},
5376956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatch)},
5377956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(CmdDispatchIndirect)},
5378956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBuffer)},
5379956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImage)},
5380956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(CmdBlitImage)},
5381956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyBufferToImage)},
5382956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyImageToBuffer)},
5383956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer)},
5384956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdFillBuffer)},
5385956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearColorImage)},
5386956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(CmdClearDepthStencilImage)},
5387956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdClearAttachments", reinterpret_cast<PFN_vkVoidFunction>(CmdClearAttachments)},
5388956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage)},
5389956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent)},
5390956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent)},
5391956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents)},
5392956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(CmdPipelineBarrier)},
5393956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery)},
5394956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdEndQuery)},
5395956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool)},
5396956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp)},
5397956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(CmdCopyQueryPoolResults)},
5398956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdPushConstants)},
5399956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer)},
5400956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer)},
5401956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CreateRenderPass)},
5402956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(DestroyRenderPass)},
5403956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(GetRenderAreaGranularity)},
5404956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandPool)},
5405956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandPool)},
5406956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(ResetCommandPool)},
5407956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass)},
5408956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(CmdNextSubpass)},
5409956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(CmdExecuteCommands)},
5410956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdEndRenderPass)},
5411fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski        {"vkDebugMarkerSetObjectTagEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectTagEXT) },
5412fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski        {"vkDebugMarkerSetObjectNameEXT", reinterpret_cast<PFN_vkVoidFunction>(DebugMarkerSetObjectNameEXT) },
5413fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski        {"vkCmdDebugMarkerBeginEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerBeginEXT) },
5414fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski        {"vkCmdDebugMarkerInsertEXT", reinterpret_cast<PFN_vkVoidFunction>(CmdDebugMarkerInsertEXT) },
5415b026ed12073ccca12f7c333474076f369eaef08dMark Lobodzinski#ifdef VK_USE_PLATFORM_WIN32_KHR
5416b026ed12073ccca12f7c333474076f369eaef08dMark Lobodzinski        {"vkGetMemoryWin32HandleNV", reinterpret_cast<PFN_vkVoidFunction>(GetMemoryWin32HandleNV) },
5417b026ed12073ccca12f7c333474076f369eaef08dMark Lobodzinski#endif // VK_USE_PLATFORM_WIN32_KHR
5418fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski};
5419fc397b868d8157d3aa07d4825950bba7a6b8bf6cMark Lobodzinski
5420bab209437b44c55f3068e416b5efa6bebda65a59Chia-I Wu
5421bab209437b44c55f3068e416b5efa6bebda65a59Chia-I Wu    for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) {
5422bab209437b44c55f3068e416b5efa6bebda65a59Chia-I Wu        if (!strcmp(core_device_commands[i].name, name))
5423bab209437b44c55f3068e416b5efa6bebda65a59Chia-I Wu            return core_device_commands[i].proc;
5424bab209437b44c55f3068e416b5efa6bebda65a59Chia-I Wu    }
5425bab209437b44c55f3068e416b5efa6bebda65a59Chia-I Wu
5426bab209437b44c55f3068e416b5efa6bebda65a59Chia-I Wu    return nullptr;
5427bab209437b44c55f3068e416b5efa6bebda65a59Chia-I Wu}
5428bab209437b44c55f3068e416b5efa6bebda65a59Chia-I Wu
5429956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinskistatic PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
54308c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    static const struct {
54318c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        const char *name;
54328c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        PFN_vkVoidFunction proc;
54338c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    } wsi_device_commands[] = {
5434956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkCreateSwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR)},
5435956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkGetSwapchainImagesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR)},
5436956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkAcquireNextImageKHR", reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR)},
5437956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkQueuePresentKHR", reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR)},
54388c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    };
54398c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
54408c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    if (device) {
54418c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
54428c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
544319ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young        if (device_data->wsi_enabled) {
544419ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young            for (size_t i = 0; i < ARRAY_SIZE(wsi_device_commands); i++) {
544519ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young                if (!strcmp(wsi_device_commands[i].name, name))
544619ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young                    return wsi_device_commands[i].proc;
544719ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young            }
544819ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young        }
544919ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young
545019ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young        if (device_data->wsi_display_swapchain_enabled) {
545119ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young            if (!strcmp("vkCreateSharedSwapchainsKHR", name)) {
545219ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young                return reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR);
545319ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young            }
545419ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young        }
54558c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    }
54568c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
54578c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    return nullptr;
54588c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski}
54598c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
54608c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinskistatic PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
54618c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    static const struct {
54628c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        const char *name;
54638c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        PFN_vkVoidFunction proc;
54648c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    } wsi_instance_commands[] = {
5465956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR)},
5466956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
5467956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski         reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR)},
5468956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR)},
5469956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        {"vkGetPhysicalDeviceSurfacePresentModesKHR",
5470956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski         reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR)},
54718c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    };
54728c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
54738c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
5474956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if (instance_extension_map.size() == 0 || !instance_extension_map[pTable].wsi_enabled)
54758c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        return nullptr;
54768c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
54778c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    for (size_t i = 0; i < ARRAY_SIZE(wsi_instance_commands); i++) {
54788c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        if (!strcmp(wsi_instance_commands[i].name, name))
54798c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski            return wsi_instance_commands[i].proc;
54808c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    }
54818c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
54828c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#ifdef VK_USE_PLATFORM_WIN32_KHR
5483956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if ((instance_extension_map[pTable].win32_enabled == true) && !strcmp("vkCreateWin32SurfaceKHR", name))
54848c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        return reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR);
54858c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#endif // VK_USE_PLATFORM_WIN32_KHR
54868c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#ifdef VK_USE_PLATFORM_XCB_KHR
5487956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if ((instance_extension_map[pTable].xcb_enabled == true) && !strcmp("vkCreateXcbSurfaceKHR", name))
54888c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        return reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR);
5489956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if ((instance_extension_map[pTable].xcb_enabled == true) && !strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name))
54908c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR);
54918c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#endif // VK_USE_PLATFORM_XCB_KHR
54928c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#ifdef VK_USE_PLATFORM_XLIB_KHR
5493956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if ((instance_extension_map[pTable].xlib_enabled == true) && !strcmp("vkCreateXlibSurfaceKHR", name))
54948c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        return reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR);
5495956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if ((instance_extension_map[pTable].xlib_enabled == true) && !strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name))
54968c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR);
54978c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#endif // VK_USE_PLATFORM_XLIB_KHR
54988c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#ifdef VK_USE_PLATFORM_MIR_KHR
5499956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if ((instance_extension_map[pTable].mir_enabled == true) && !strcmp("vkCreateMirSurfaceKHR", name))
55008c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        return reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR);
5501956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if ((instance_extension_map[pTable].mir_enabled == true) && !strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name))
55028c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR);
55038c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#endif // VK_USE_PLATFORM_MIR_KHR
55048c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#ifdef VK_USE_PLATFORM_WAYLAND_KHR
5505956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if ((instance_extension_map[pTable].wayland_enabled == true) && !strcmp("vkCreateWaylandSurfaceKHR", name))
55068c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        return reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR);
5507956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if ((instance_extension_map[pTable].wayland_enabled == true) &&
5508956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski        !strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name))
55098c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR);
55108c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#endif // VK_USE_PLATFORM_WAYLAND_KHR
55118c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#ifdef VK_USE_PLATFORM_ANDROID_KHR
5512956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski    if ((instance_extension_map[pTable].android_enabled == true) && !strcmp("vkCreateAndroidSurfaceKHR", name))
55138c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski        return reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR);
55148c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski#endif // VK_USE_PLATFORM_ANDROID_KHR
55158c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
55168c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski    return nullptr;
55178c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski}
55188c22ca55f11ab5a7adb94a55ebf72cd5343a4eadMark Lobodzinski
5519e68a153278bbefa18f1d9ced5e191cbf7cec8150Chia-I Wu} // namespace parameter_validation
5520e68a153278bbefa18f1d9ced5e191cbf7cec8150Chia-I Wu
5521e68a153278bbefa18f1d9ced5e191cbf7cec8150Chia-I Wu// vk_layer_logging.h expects these to be defined
5522e68a153278bbefa18f1d9ced5e191cbf7cec8150Chia-I Wu
5523956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
5524956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                              const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
5525956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                              const VkAllocationCallbacks *pAllocator,
5526956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                              VkDebugReportCallbackEXT *pMsgCallback) {
55277b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I Wu    return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
5528e68a153278bbefa18f1d9ced5e191cbf7cec8150Chia-I Wu}
5529e68a153278bbefa18f1d9ced5e191cbf7cec8150Chia-I Wu
5530956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
5531956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                           const VkAllocationCallbacks *pAllocator) {
55327b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I Wu    parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
5533e68a153278bbefa18f1d9ced5e191cbf7cec8150Chia-I Wu}
5534e68a153278bbefa18f1d9ced5e191cbf7cec8150Chia-I Wu
5535956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
5536956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                   VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
5537956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                   int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
55387b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I Wu    parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
5539e68a153278bbefa18f1d9ced5e191cbf7cec8150Chia-I Wu}
5540e68a153278bbefa18f1d9ced5e191cbf7cec8150Chia-I Wu
5541e68a153278bbefa18f1d9ced5e191cbf7cec8150Chia-I Wu// loader-layer interface v0
5542e68a153278bbefa18f1d9ced5e191cbf7cec8150Chia-I Wu
5543956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
5544956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                                      VkExtensionProperties *pProperties) {
5545a4e71cd8b4e77502943dd894ed95426a25dffbd5Chia-I Wu    return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
554610e00a4031ad2744efadfcb2c8eab521472f35a7Chia-I Wu}
554710e00a4031ad2744efadfcb2c8eab521472f35a7Chia-I Wu
5548956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
5549956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                                  VkLayerProperties *pProperties) {
5550a4e71cd8b4e77502943dd894ed95426a25dffbd5Chia-I Wu    return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties);
555110e00a4031ad2744efadfcb2c8eab521472f35a7Chia-I Wu}
555210e00a4031ad2744efadfcb2c8eab521472f35a7Chia-I Wu
5553956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark LobodzinskiVK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
5554956b832a152c2c97d6591aa6d735f4cdfc8d9e51Mark Lobodzinski                                                                                VkLayerProperties *pProperties) {
5555a4e71cd8b4e77502943dd894ed95426a25dffbd5Chia-I Wu    // the layer command handles VK_NULL_HANDLE just fine internally
5556a4e71cd8b4e77502943dd894ed95426a25dffbd5Chia-I Wu    assert(physicalDevice == VK_NULL_HANDLE);
5557a4e71cd8b4e77502943dd894ed95426a25dffbd5Chia-I Wu    return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
5558e68a153278bbefa18f1d9ced5e191cbf7cec8150Chia-I Wu}
5559e68a153278bbefa18f1d9ced5e191cbf7cec8150Chia-I Wu
5560e68a153278bbefa18f1d9ced5e191cbf7cec8150Chia-I WuVK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
5561e68a153278bbefa18f1d9ced5e191cbf7cec8150Chia-I Wu                                                                                    const char *pLayerName, uint32_t *pCount,
5562e68a153278bbefa18f1d9ced5e191cbf7cec8150Chia-I Wu                                                                                    VkExtensionProperties *pProperties) {
5563a4e71cd8b4e77502943dd894ed95426a25dffbd5Chia-I Wu    // the layer command handles VK_NULL_HANDLE just fine internally
5564a4e71cd8b4e77502943dd894ed95426a25dffbd5Chia-I Wu    assert(physicalDevice == VK_NULL_HANDLE);
5565381a54a40f7d927402fbeef3cd320c877bb2f344Chia-I Wu    return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
5566e68a153278bbefa18f1d9ced5e191cbf7cec8150Chia-I Wu}
5567e68a153278bbefa18f1d9ced5e191cbf7cec8150Chia-I Wu
5568e68a153278bbefa18f1d9ced5e191cbf7cec8150Chia-I WuVK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
55697b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I Wu    return parameter_validation::GetDeviceProcAddr(dev, funcName);
5570e68a153278bbefa18f1d9ced5e191cbf7cec8150Chia-I Wu}
5571e68a153278bbefa18f1d9ced5e191cbf7cec8150Chia-I Wu
5572e68a153278bbefa18f1d9ced5e191cbf7cec8150Chia-I WuVK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
55737b4e0349ce65296f8a1e1ed72b6d2880cefa4098Chia-I Wu    return parameter_validation::GetInstanceProcAddr(instance, funcName);
557410e00a4031ad2744efadfcb2c8eab521472f35a7Chia-I Wu}
5575