// Copyright 2015-2022 The Khronos Group Inc.
//
// SPDX-License-Identifier: Apache-2.0 OR MIT
//

// This header is generated from the Khronos Vulkan XML API Registry.

#ifndef VULKAN_RAII_HPP
#define VULKAN_RAII_HPP

#include <vulkan/vulkan.hpp>

#if !defined(VULKAN_HPP_RAII_NAMESPACE)
#	define VULKAN_HPP_RAII_NAMESPACE raii
#endif

namespace VULKAN_HPP_NAMESPACE {
namespace VULKAN_HPP_RAII_NAMESPACE {
#if !defined(VULKAN_HPP_DISABLE_ENHANCED_MODE) && !defined(VULKAN_HPP_NO_EXCEPTIONS)

template<class T, class U = T>
VULKAN_HPP_CONSTEXPR_14 VULKAN_HPP_INLINE T exchange(T &obj, U &&newValue)
{
#	if(14 <= VULKAN_HPP_CPP_VERSION)
	return std::exchange<T>(obj, std::forward<U>(newValue));
#	else
	T oldValue = std::move(obj);
	obj = std::forward<U>(newValue);
	return oldValue;
#	endif
}

class ContextDispatcher : public DispatchLoaderBase
{
public:
	ContextDispatcher(PFN_vkGetInstanceProcAddr getProcAddr)
	    : vkGetInstanceProcAddr(getProcAddr)
	    //=== VK_VERSION_1_0 ===
	    , vkCreateInstance(PFN_vkCreateInstance(getProcAddr(NULL, "vkCreateInstance")))
	    , vkEnumerateInstanceExtensionProperties(PFN_vkEnumerateInstanceExtensionProperties(getProcAddr(NULL, "vkEnumerateInstanceExtensionProperties")))
	    , vkEnumerateInstanceLayerProperties(PFN_vkEnumerateInstanceLayerProperties(getProcAddr(NULL, "vkEnumerateInstanceLayerProperties")))
	    //=== VK_VERSION_1_1 ===
	    , vkEnumerateInstanceVersion(PFN_vkEnumerateInstanceVersion(getProcAddr(NULL, "vkEnumerateInstanceVersion")))
	{
	}

public:
	PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = 0;

	//=== VK_VERSION_1_0 ===
	PFN_vkCreateInstance vkCreateInstance = 0;
	PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties = 0;
	PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties = 0;

	//=== VK_VERSION_1_1 ===
	PFN_vkEnumerateInstanceVersion vkEnumerateInstanceVersion = 0;
};

class InstanceDispatcher : public DispatchLoaderBase
{
public:
	InstanceDispatcher(PFN_vkGetInstanceProcAddr getProcAddr, VkInstance instance)
	    : vkGetInstanceProcAddr(getProcAddr)
	{
		//=== VK_VERSION_1_0 ===
		vkDestroyInstance = PFN_vkDestroyInstance(vkGetInstanceProcAddr(instance, "vkDestroyInstance"));
		vkEnumeratePhysicalDevices = PFN_vkEnumeratePhysicalDevices(vkGetInstanceProcAddr(instance, "vkEnumeratePhysicalDevices"));
		vkGetPhysicalDeviceFeatures = PFN_vkGetPhysicalDeviceFeatures(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures"));
		vkGetPhysicalDeviceFormatProperties =
		    PFN_vkGetPhysicalDeviceFormatProperties(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties"));
		vkGetPhysicalDeviceImageFormatProperties =
		    PFN_vkGetPhysicalDeviceImageFormatProperties(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceImageFormatProperties"));
		vkGetPhysicalDeviceProperties = PFN_vkGetPhysicalDeviceProperties(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties"));
		vkGetPhysicalDeviceQueueFamilyProperties =
		    PFN_vkGetPhysicalDeviceQueueFamilyProperties(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties"));
		vkGetPhysicalDeviceMemoryProperties =
		    PFN_vkGetPhysicalDeviceMemoryProperties(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceMemoryProperties"));
		vkCreateDevice = PFN_vkCreateDevice(vkGetInstanceProcAddr(instance, "vkCreateDevice"));
		vkEnumerateDeviceExtensionProperties =
		    PFN_vkEnumerateDeviceExtensionProperties(vkGetInstanceProcAddr(instance, "vkEnumerateDeviceExtensionProperties"));
		vkEnumerateDeviceLayerProperties = PFN_vkEnumerateDeviceLayerProperties(vkGetInstanceProcAddr(instance, "vkEnumerateDeviceLayerProperties"));
		vkGetPhysicalDeviceSparseImageFormatProperties =
		    PFN_vkGetPhysicalDeviceSparseImageFormatProperties(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSparseImageFormatProperties"));

		//=== VK_VERSION_1_1 ===
		vkEnumeratePhysicalDeviceGroups = PFN_vkEnumeratePhysicalDeviceGroups(vkGetInstanceProcAddr(instance, "vkEnumeratePhysicalDeviceGroups"));
		vkGetPhysicalDeviceFeatures2 = PFN_vkGetPhysicalDeviceFeatures2(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures2"));
		vkGetPhysicalDeviceProperties2 = PFN_vkGetPhysicalDeviceProperties2(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties2"));
		vkGetPhysicalDeviceFormatProperties2 =
		    PFN_vkGetPhysicalDeviceFormatProperties2(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties2"));
		vkGetPhysicalDeviceImageFormatProperties2 =
		    PFN_vkGetPhysicalDeviceImageFormatProperties2(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceImageFormatProperties2"));
		vkGetPhysicalDeviceQueueFamilyProperties2 =
		    PFN_vkGetPhysicalDeviceQueueFamilyProperties2(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties2"));
		vkGetPhysicalDeviceMemoryProperties2 =
		    PFN_vkGetPhysicalDeviceMemoryProperties2(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceMemoryProperties2"));
		vkGetPhysicalDeviceSparseImageFormatProperties2 =
		    PFN_vkGetPhysicalDeviceSparseImageFormatProperties2(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSparseImageFormatProperties2"));
		vkGetPhysicalDeviceExternalBufferProperties =
		    PFN_vkGetPhysicalDeviceExternalBufferProperties(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalBufferProperties"));
		vkGetPhysicalDeviceExternalFenceProperties =
		    PFN_vkGetPhysicalDeviceExternalFenceProperties(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalFenceProperties"));
		vkGetPhysicalDeviceExternalSemaphoreProperties =
		    PFN_vkGetPhysicalDeviceExternalSemaphoreProperties(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalSemaphoreProperties"));

		//=== VK_VERSION_1_3 ===
		vkGetPhysicalDeviceToolProperties = PFN_vkGetPhysicalDeviceToolProperties(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceToolProperties"));

		//=== VK_EXT_acquire_drm_display ===
		vkAcquireDrmDisplayEXT = PFN_vkAcquireDrmDisplayEXT(vkGetInstanceProcAddr(instance, "vkAcquireDrmDisplayEXT"));
		vkGetDrmDisplayEXT = PFN_vkGetDrmDisplayEXT(vkGetInstanceProcAddr(instance, "vkGetDrmDisplayEXT"));

#	if defined(VK_USE_PLATFORM_XLIB_XRANDR_EXT)
		//=== VK_EXT_acquire_xlib_display ===
		vkAcquireXlibDisplayEXT = PFN_vkAcquireXlibDisplayEXT(vkGetInstanceProcAddr(instance, "vkAcquireXlibDisplayEXT"));
		vkGetRandROutputDisplayEXT = PFN_vkGetRandROutputDisplayEXT(vkGetInstanceProcAddr(instance, "vkGetRandROutputDisplayEXT"));
#	endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/

		//=== VK_EXT_calibrated_timestamps ===
		vkGetPhysicalDeviceCalibrateableTimeDomainsEXT =
		    PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT"));

		//=== VK_EXT_debug_report ===
		vkCreateDebugReportCallbackEXT = PFN_vkCreateDebugReportCallbackEXT(vkGetInstanceProcAddr(instance, "vkCreateDebugReportCallbackEXT"));
		vkDestroyDebugReportCallbackEXT = PFN_vkDestroyDebugReportCallbackEXT(vkGetInstanceProcAddr(instance, "vkDestroyDebugReportCallbackEXT"));
		vkDebugReportMessageEXT = PFN_vkDebugReportMessageEXT(vkGetInstanceProcAddr(instance, "vkDebugReportMessageEXT"));

		//=== VK_EXT_debug_utils ===
		vkCreateDebugUtilsMessengerEXT = PFN_vkCreateDebugUtilsMessengerEXT(vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT"));
		vkDestroyDebugUtilsMessengerEXT = PFN_vkDestroyDebugUtilsMessengerEXT(vkGetInstanceProcAddr(instance, "vkDestroyDebugUtilsMessengerEXT"));
		vkSubmitDebugUtilsMessageEXT = PFN_vkSubmitDebugUtilsMessageEXT(vkGetInstanceProcAddr(instance, "vkSubmitDebugUtilsMessageEXT"));

		//=== VK_EXT_direct_mode_display ===
		vkReleaseDisplayEXT = PFN_vkReleaseDisplayEXT(vkGetInstanceProcAddr(instance, "vkReleaseDisplayEXT"));

#	if defined(VK_USE_PLATFORM_DIRECTFB_EXT)
		//=== VK_EXT_directfb_surface ===
		vkCreateDirectFBSurfaceEXT = PFN_vkCreateDirectFBSurfaceEXT(vkGetInstanceProcAddr(instance, "vkCreateDirectFBSurfaceEXT"));
		vkGetPhysicalDeviceDirectFBPresentationSupportEXT =
		    PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceDirectFBPresentationSupportEXT"));
#	endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/

		//=== VK_EXT_display_surface_counter ===
		vkGetPhysicalDeviceSurfaceCapabilities2EXT =
		    PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceCapabilities2EXT"));

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
		//=== VK_EXT_full_screen_exclusive ===
		vkGetPhysicalDeviceSurfacePresentModes2EXT =
		    PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfacePresentModes2EXT"));
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

		//=== VK_EXT_headless_surface ===
		vkCreateHeadlessSurfaceEXT = PFN_vkCreateHeadlessSurfaceEXT(vkGetInstanceProcAddr(instance, "vkCreateHeadlessSurfaceEXT"));

#	if defined(VK_USE_PLATFORM_METAL_EXT)
		//=== VK_EXT_metal_surface ===
		vkCreateMetalSurfaceEXT = PFN_vkCreateMetalSurfaceEXT(vkGetInstanceProcAddr(instance, "vkCreateMetalSurfaceEXT"));
#	endif /*VK_USE_PLATFORM_METAL_EXT*/

		//=== VK_EXT_sample_locations ===
		vkGetPhysicalDeviceMultisamplePropertiesEXT =
		    PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceMultisamplePropertiesEXT"));

		//=== VK_EXT_tooling_info ===
		vkGetPhysicalDeviceToolPropertiesEXT =
		    PFN_vkGetPhysicalDeviceToolPropertiesEXT(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceToolPropertiesEXT"));
		if(!vkGetPhysicalDeviceToolProperties)
			vkGetPhysicalDeviceToolProperties = vkGetPhysicalDeviceToolPropertiesEXT;

#	if defined(VK_USE_PLATFORM_FUCHSIA)
		//=== VK_FUCHSIA_imagepipe_surface ===
		vkCreateImagePipeSurfaceFUCHSIA = PFN_vkCreateImagePipeSurfaceFUCHSIA(vkGetInstanceProcAddr(instance, "vkCreateImagePipeSurfaceFUCHSIA"));
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

#	if defined(VK_USE_PLATFORM_GGP)
		//=== VK_GGP_stream_descriptor_surface ===
		vkCreateStreamDescriptorSurfaceGGP = PFN_vkCreateStreamDescriptorSurfaceGGP(vkGetInstanceProcAddr(instance, "vkCreateStreamDescriptorSurfaceGGP"));
#	endif /*VK_USE_PLATFORM_GGP*/

#	if defined(VK_USE_PLATFORM_ANDROID_KHR)
		//=== VK_KHR_android_surface ===
		vkCreateAndroidSurfaceKHR = PFN_vkCreateAndroidSurfaceKHR(vkGetInstanceProcAddr(instance, "vkCreateAndroidSurfaceKHR"));
#	endif /*VK_USE_PLATFORM_ANDROID_KHR*/

		//=== VK_KHR_device_group ===
		vkGetPhysicalDevicePresentRectanglesKHR =
		    PFN_vkGetPhysicalDevicePresentRectanglesKHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDevicePresentRectanglesKHR"));

		//=== VK_KHR_device_group_creation ===
		vkEnumeratePhysicalDeviceGroupsKHR = PFN_vkEnumeratePhysicalDeviceGroupsKHR(vkGetInstanceProcAddr(instance, "vkEnumeratePhysicalDeviceGroupsKHR"));
		if(!vkEnumeratePhysicalDeviceGroups)
			vkEnumeratePhysicalDeviceGroups = vkEnumeratePhysicalDeviceGroupsKHR;

		//=== VK_KHR_display ===
		vkGetPhysicalDeviceDisplayPropertiesKHR =
		    PFN_vkGetPhysicalDeviceDisplayPropertiesKHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceDisplayPropertiesKHR"));
		vkGetPhysicalDeviceDisplayPlanePropertiesKHR =
		    PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR"));
		vkGetDisplayPlaneSupportedDisplaysKHR =
		    PFN_vkGetDisplayPlaneSupportedDisplaysKHR(vkGetInstanceProcAddr(instance, "vkGetDisplayPlaneSupportedDisplaysKHR"));
		vkGetDisplayModePropertiesKHR = PFN_vkGetDisplayModePropertiesKHR(vkGetInstanceProcAddr(instance, "vkGetDisplayModePropertiesKHR"));
		vkCreateDisplayModeKHR = PFN_vkCreateDisplayModeKHR(vkGetInstanceProcAddr(instance, "vkCreateDisplayModeKHR"));
		vkGetDisplayPlaneCapabilitiesKHR = PFN_vkGetDisplayPlaneCapabilitiesKHR(vkGetInstanceProcAddr(instance, "vkGetDisplayPlaneCapabilitiesKHR"));
		vkCreateDisplayPlaneSurfaceKHR = PFN_vkCreateDisplayPlaneSurfaceKHR(vkGetInstanceProcAddr(instance, "vkCreateDisplayPlaneSurfaceKHR"));

		//=== VK_KHR_external_fence_capabilities ===
		vkGetPhysicalDeviceExternalFencePropertiesKHR =
		    PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalFencePropertiesKHR"));
		if(!vkGetPhysicalDeviceExternalFenceProperties)
			vkGetPhysicalDeviceExternalFenceProperties = vkGetPhysicalDeviceExternalFencePropertiesKHR;

		//=== VK_KHR_external_memory_capabilities ===
		vkGetPhysicalDeviceExternalBufferPropertiesKHR =
		    PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalBufferPropertiesKHR"));
		if(!vkGetPhysicalDeviceExternalBufferProperties)
			vkGetPhysicalDeviceExternalBufferProperties = vkGetPhysicalDeviceExternalBufferPropertiesKHR;

		//=== VK_KHR_external_semaphore_capabilities ===
		vkGetPhysicalDeviceExternalSemaphorePropertiesKHR =
		    PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalSemaphorePropertiesKHR"));
		if(!vkGetPhysicalDeviceExternalSemaphoreProperties)
			vkGetPhysicalDeviceExternalSemaphoreProperties = vkGetPhysicalDeviceExternalSemaphorePropertiesKHR;

		//=== VK_KHR_fragment_shading_rate ===
		vkGetPhysicalDeviceFragmentShadingRatesKHR =
		    PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFragmentShadingRatesKHR"));

		//=== VK_KHR_get_display_properties2 ===
		vkGetPhysicalDeviceDisplayProperties2KHR =
		    PFN_vkGetPhysicalDeviceDisplayProperties2KHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceDisplayProperties2KHR"));
		vkGetPhysicalDeviceDisplayPlaneProperties2KHR =
		    PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceDisplayPlaneProperties2KHR"));
		vkGetDisplayModeProperties2KHR = PFN_vkGetDisplayModeProperties2KHR(vkGetInstanceProcAddr(instance, "vkGetDisplayModeProperties2KHR"));
		vkGetDisplayPlaneCapabilities2KHR = PFN_vkGetDisplayPlaneCapabilities2KHR(vkGetInstanceProcAddr(instance, "vkGetDisplayPlaneCapabilities2KHR"));

		//=== VK_KHR_get_physical_device_properties2 ===
		vkGetPhysicalDeviceFeatures2KHR = PFN_vkGetPhysicalDeviceFeatures2KHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures2KHR"));
		if(!vkGetPhysicalDeviceFeatures2)
			vkGetPhysicalDeviceFeatures2 = vkGetPhysicalDeviceFeatures2KHR;
		vkGetPhysicalDeviceProperties2KHR = PFN_vkGetPhysicalDeviceProperties2KHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties2KHR"));
		if(!vkGetPhysicalDeviceProperties2)
			vkGetPhysicalDeviceProperties2 = vkGetPhysicalDeviceProperties2KHR;
		vkGetPhysicalDeviceFormatProperties2KHR =
		    PFN_vkGetPhysicalDeviceFormatProperties2KHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties2KHR"));
		if(!vkGetPhysicalDeviceFormatProperties2)
			vkGetPhysicalDeviceFormatProperties2 = vkGetPhysicalDeviceFormatProperties2KHR;
		vkGetPhysicalDeviceImageFormatProperties2KHR =
		    PFN_vkGetPhysicalDeviceImageFormatProperties2KHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceImageFormatProperties2KHR"));
		if(!vkGetPhysicalDeviceImageFormatProperties2)
			vkGetPhysicalDeviceImageFormatProperties2 = vkGetPhysicalDeviceImageFormatProperties2KHR;
		vkGetPhysicalDeviceQueueFamilyProperties2KHR =
		    PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties2KHR"));
		if(!vkGetPhysicalDeviceQueueFamilyProperties2)
			vkGetPhysicalDeviceQueueFamilyProperties2 = vkGetPhysicalDeviceQueueFamilyProperties2KHR;
		vkGetPhysicalDeviceMemoryProperties2KHR =
		    PFN_vkGetPhysicalDeviceMemoryProperties2KHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceMemoryProperties2KHR"));
		if(!vkGetPhysicalDeviceMemoryProperties2)
			vkGetPhysicalDeviceMemoryProperties2 = vkGetPhysicalDeviceMemoryProperties2KHR;
		vkGetPhysicalDeviceSparseImageFormatProperties2KHR =
		    PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSparseImageFormatProperties2KHR"));
		if(!vkGetPhysicalDeviceSparseImageFormatProperties2)
			vkGetPhysicalDeviceSparseImageFormatProperties2 = vkGetPhysicalDeviceSparseImageFormatProperties2KHR;

		//=== VK_KHR_get_surface_capabilities2 ===
		vkGetPhysicalDeviceSurfaceCapabilities2KHR =
		    PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceCapabilities2KHR"));
		vkGetPhysicalDeviceSurfaceFormats2KHR =
		    PFN_vkGetPhysicalDeviceSurfaceFormats2KHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceFormats2KHR"));

		//=== VK_KHR_performance_query ===
		vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR = PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
		    vkGetInstanceProcAddr(instance, "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR"));
		vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR = PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(
		    vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR"));

		//=== VK_KHR_surface ===
		vkDestroySurfaceKHR = PFN_vkDestroySurfaceKHR(vkGetInstanceProcAddr(instance, "vkDestroySurfaceKHR"));
		vkGetPhysicalDeviceSurfaceSupportKHR =
		    PFN_vkGetPhysicalDeviceSurfaceSupportKHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceSupportKHR"));
		vkGetPhysicalDeviceSurfaceCapabilitiesKHR =
		    PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR"));
		vkGetPhysicalDeviceSurfaceFormatsKHR =
		    PFN_vkGetPhysicalDeviceSurfaceFormatsKHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceFormatsKHR"));
		vkGetPhysicalDeviceSurfacePresentModesKHR =
		    PFN_vkGetPhysicalDeviceSurfacePresentModesKHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfacePresentModesKHR"));

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
		//=== VK_KHR_video_queue ===
		vkGetPhysicalDeviceVideoCapabilitiesKHR =
		    PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceVideoCapabilitiesKHR"));
		vkGetPhysicalDeviceVideoFormatPropertiesKHR =
		    PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceVideoFormatPropertiesKHR"));
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_USE_PLATFORM_WAYLAND_KHR)
		//=== VK_KHR_wayland_surface ===
		vkCreateWaylandSurfaceKHR = PFN_vkCreateWaylandSurfaceKHR(vkGetInstanceProcAddr(instance, "vkCreateWaylandSurfaceKHR"));
		vkGetPhysicalDeviceWaylandPresentationSupportKHR =
		    PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceWaylandPresentationSupportKHR"));
#	endif /*VK_USE_PLATFORM_WAYLAND_KHR*/

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
		//=== VK_KHR_win32_surface ===
		vkCreateWin32SurfaceKHR = PFN_vkCreateWin32SurfaceKHR(vkGetInstanceProcAddr(instance, "vkCreateWin32SurfaceKHR"));
		vkGetPhysicalDeviceWin32PresentationSupportKHR =
		    PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceWin32PresentationSupportKHR"));
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

#	if defined(VK_USE_PLATFORM_XCB_KHR)
		//=== VK_KHR_xcb_surface ===
		vkCreateXcbSurfaceKHR = PFN_vkCreateXcbSurfaceKHR(vkGetInstanceProcAddr(instance, "vkCreateXcbSurfaceKHR"));
		vkGetPhysicalDeviceXcbPresentationSupportKHR =
		    PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceXcbPresentationSupportKHR"));
#	endif /*VK_USE_PLATFORM_XCB_KHR*/

#	if defined(VK_USE_PLATFORM_XLIB_KHR)
		//=== VK_KHR_xlib_surface ===
		vkCreateXlibSurfaceKHR = PFN_vkCreateXlibSurfaceKHR(vkGetInstanceProcAddr(instance, "vkCreateXlibSurfaceKHR"));
		vkGetPhysicalDeviceXlibPresentationSupportKHR =
		    PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceXlibPresentationSupportKHR"));
#	endif /*VK_USE_PLATFORM_XLIB_KHR*/

#	if defined(VK_USE_PLATFORM_IOS_MVK)
		//=== VK_MVK_ios_surface ===
		vkCreateIOSSurfaceMVK = PFN_vkCreateIOSSurfaceMVK(vkGetInstanceProcAddr(instance, "vkCreateIOSSurfaceMVK"));
#	endif /*VK_USE_PLATFORM_IOS_MVK*/

#	if defined(VK_USE_PLATFORM_MACOS_MVK)
		//=== VK_MVK_macos_surface ===
		vkCreateMacOSSurfaceMVK = PFN_vkCreateMacOSSurfaceMVK(vkGetInstanceProcAddr(instance, "vkCreateMacOSSurfaceMVK"));
#	endif /*VK_USE_PLATFORM_MACOS_MVK*/

#	if defined(VK_USE_PLATFORM_VI_NN)
		//=== VK_NN_vi_surface ===
		vkCreateViSurfaceNN = PFN_vkCreateViSurfaceNN(vkGetInstanceProcAddr(instance, "vkCreateViSurfaceNN"));
#	endif /*VK_USE_PLATFORM_VI_NN*/

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
		//=== VK_NV_acquire_winrt_display ===
		vkAcquireWinrtDisplayNV = PFN_vkAcquireWinrtDisplayNV(vkGetInstanceProcAddr(instance, "vkAcquireWinrtDisplayNV"));
		vkGetWinrtDisplayNV = PFN_vkGetWinrtDisplayNV(vkGetInstanceProcAddr(instance, "vkGetWinrtDisplayNV"));
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

		//=== VK_NV_cooperative_matrix ===
		vkGetPhysicalDeviceCooperativeMatrixPropertiesNV =
		    PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV"));

		//=== VK_NV_coverage_reduction_mode ===
		vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV = PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(
		    vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV"));

		//=== VK_NV_external_memory_capabilities ===
		vkGetPhysicalDeviceExternalImageFormatPropertiesNV =
		    PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV"));

#	if defined(VK_USE_PLATFORM_SCREEN_QNX)
		//=== VK_QNX_screen_surface ===
		vkCreateScreenSurfaceQNX = PFN_vkCreateScreenSurfaceQNX(vkGetInstanceProcAddr(instance, "vkCreateScreenSurfaceQNX"));
		vkGetPhysicalDeviceScreenPresentationSupportQNX =
		    PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceScreenPresentationSupportQNX"));
#	endif /*VK_USE_PLATFORM_SCREEN_QNX*/

		vkGetDeviceProcAddr = PFN_vkGetDeviceProcAddr(vkGetInstanceProcAddr(instance, "vkGetDeviceProcAddr"));
	}

public:
	//=== VK_VERSION_1_0 ===
	PFN_vkDestroyInstance vkDestroyInstance = 0;
	PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices = 0;
	PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures = 0;
	PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties = 0;
	PFN_vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatProperties = 0;
	PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties = 0;
	PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties = 0;
	PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties = 0;
	PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = 0;
	PFN_vkCreateDevice vkCreateDevice = 0;
	PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties = 0;
	PFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties = 0;
	PFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties = 0;

	//=== VK_VERSION_1_1 ===
	PFN_vkEnumeratePhysicalDeviceGroups vkEnumeratePhysicalDeviceGroups = 0;
	PFN_vkGetPhysicalDeviceFeatures2 vkGetPhysicalDeviceFeatures2 = 0;
	PFN_vkGetPhysicalDeviceProperties2 vkGetPhysicalDeviceProperties2 = 0;
	PFN_vkGetPhysicalDeviceFormatProperties2 vkGetPhysicalDeviceFormatProperties2 = 0;
	PFN_vkGetPhysicalDeviceImageFormatProperties2 vkGetPhysicalDeviceImageFormatProperties2 = 0;
	PFN_vkGetPhysicalDeviceQueueFamilyProperties2 vkGetPhysicalDeviceQueueFamilyProperties2 = 0;
	PFN_vkGetPhysicalDeviceMemoryProperties2 vkGetPhysicalDeviceMemoryProperties2 = 0;
	PFN_vkGetPhysicalDeviceSparseImageFormatProperties2 vkGetPhysicalDeviceSparseImageFormatProperties2 = 0;
	PFN_vkGetPhysicalDeviceExternalBufferProperties vkGetPhysicalDeviceExternalBufferProperties = 0;
	PFN_vkGetPhysicalDeviceExternalFenceProperties vkGetPhysicalDeviceExternalFenceProperties = 0;
	PFN_vkGetPhysicalDeviceExternalSemaphoreProperties vkGetPhysicalDeviceExternalSemaphoreProperties = 0;

	//=== VK_VERSION_1_3 ===
	PFN_vkGetPhysicalDeviceToolProperties vkGetPhysicalDeviceToolProperties = 0;

	//=== VK_EXT_acquire_drm_display ===
	PFN_vkAcquireDrmDisplayEXT vkAcquireDrmDisplayEXT = 0;
	PFN_vkGetDrmDisplayEXT vkGetDrmDisplayEXT = 0;

#	if defined(VK_USE_PLATFORM_XLIB_XRANDR_EXT)
	//=== VK_EXT_acquire_xlib_display ===
	PFN_vkAcquireXlibDisplayEXT vkAcquireXlibDisplayEXT = 0;
	PFN_vkGetRandROutputDisplayEXT vkGetRandROutputDisplayEXT = 0;
#	else
	PFN_dummy vkAcquireXlibDisplayEXT_placeholder = 0;
	PFN_dummy vkGetRandROutputDisplayEXT_placeholder = 0;
#	endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/

	//=== VK_EXT_calibrated_timestamps ===
	PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT vkGetPhysicalDeviceCalibrateableTimeDomainsEXT = 0;

	//=== VK_EXT_debug_report ===
	PFN_vkCreateDebugReportCallbackEXT vkCreateDebugReportCallbackEXT = 0;
	PFN_vkDestroyDebugReportCallbackEXT vkDestroyDebugReportCallbackEXT = 0;
	PFN_vkDebugReportMessageEXT vkDebugReportMessageEXT = 0;

	//=== VK_EXT_debug_utils ===
	PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT = 0;
	PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT = 0;
	PFN_vkSubmitDebugUtilsMessageEXT vkSubmitDebugUtilsMessageEXT = 0;

	//=== VK_EXT_direct_mode_display ===
	PFN_vkReleaseDisplayEXT vkReleaseDisplayEXT = 0;

#	if defined(VK_USE_PLATFORM_DIRECTFB_EXT)
	//=== VK_EXT_directfb_surface ===
	PFN_vkCreateDirectFBSurfaceEXT vkCreateDirectFBSurfaceEXT = 0;
	PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT vkGetPhysicalDeviceDirectFBPresentationSupportEXT = 0;
#	else
	PFN_dummy vkCreateDirectFBSurfaceEXT_placeholder = 0;
	PFN_dummy vkGetPhysicalDeviceDirectFBPresentationSupportEXT_placeholder = 0;
#	endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/

	//=== VK_EXT_display_surface_counter ===
	PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT vkGetPhysicalDeviceSurfaceCapabilities2EXT = 0;

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
	//=== VK_EXT_full_screen_exclusive ===
	PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT vkGetPhysicalDeviceSurfacePresentModes2EXT = 0;
#	else
	PFN_dummy vkGetPhysicalDeviceSurfacePresentModes2EXT_placeholder = 0;
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

	//=== VK_EXT_headless_surface ===
	PFN_vkCreateHeadlessSurfaceEXT vkCreateHeadlessSurfaceEXT = 0;

#	if defined(VK_USE_PLATFORM_METAL_EXT)
	//=== VK_EXT_metal_surface ===
	PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT = 0;
#	else
	PFN_dummy vkCreateMetalSurfaceEXT_placeholder = 0;
#	endif /*VK_USE_PLATFORM_METAL_EXT*/

	//=== VK_EXT_sample_locations ===
	PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT vkGetPhysicalDeviceMultisamplePropertiesEXT = 0;

	//=== VK_EXT_tooling_info ===
	PFN_vkGetPhysicalDeviceToolPropertiesEXT vkGetPhysicalDeviceToolPropertiesEXT = 0;

#	if defined(VK_USE_PLATFORM_FUCHSIA)
	//=== VK_FUCHSIA_imagepipe_surface ===
	PFN_vkCreateImagePipeSurfaceFUCHSIA vkCreateImagePipeSurfaceFUCHSIA = 0;
#	else
	PFN_dummy vkCreateImagePipeSurfaceFUCHSIA_placeholder = 0;
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

#	if defined(VK_USE_PLATFORM_GGP)
	//=== VK_GGP_stream_descriptor_surface ===
	PFN_vkCreateStreamDescriptorSurfaceGGP vkCreateStreamDescriptorSurfaceGGP = 0;
#	else
	PFN_dummy vkCreateStreamDescriptorSurfaceGGP_placeholder = 0;
#	endif /*VK_USE_PLATFORM_GGP*/

#	if defined(VK_USE_PLATFORM_ANDROID_KHR)
	//=== VK_KHR_android_surface ===
	PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR = 0;
#	else
	PFN_dummy vkCreateAndroidSurfaceKHR_placeholder = 0;
#	endif /*VK_USE_PLATFORM_ANDROID_KHR*/

	//=== VK_KHR_device_group ===
	PFN_vkGetPhysicalDevicePresentRectanglesKHR vkGetPhysicalDevicePresentRectanglesKHR = 0;

	//=== VK_KHR_device_group_creation ===
	PFN_vkEnumeratePhysicalDeviceGroupsKHR vkEnumeratePhysicalDeviceGroupsKHR = 0;

	//=== VK_KHR_display ===
	PFN_vkGetPhysicalDeviceDisplayPropertiesKHR vkGetPhysicalDeviceDisplayPropertiesKHR = 0;
	PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR vkGetPhysicalDeviceDisplayPlanePropertiesKHR = 0;
	PFN_vkGetDisplayPlaneSupportedDisplaysKHR vkGetDisplayPlaneSupportedDisplaysKHR = 0;
	PFN_vkGetDisplayModePropertiesKHR vkGetDisplayModePropertiesKHR = 0;
	PFN_vkCreateDisplayModeKHR vkCreateDisplayModeKHR = 0;
	PFN_vkGetDisplayPlaneCapabilitiesKHR vkGetDisplayPlaneCapabilitiesKHR = 0;
	PFN_vkCreateDisplayPlaneSurfaceKHR vkCreateDisplayPlaneSurfaceKHR = 0;

	//=== VK_KHR_external_fence_capabilities ===
	PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR vkGetPhysicalDeviceExternalFencePropertiesKHR = 0;

	//=== VK_KHR_external_memory_capabilities ===
	PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR vkGetPhysicalDeviceExternalBufferPropertiesKHR = 0;

	//=== VK_KHR_external_semaphore_capabilities ===
	PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR vkGetPhysicalDeviceExternalSemaphorePropertiesKHR = 0;

	//=== VK_KHR_fragment_shading_rate ===
	PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR vkGetPhysicalDeviceFragmentShadingRatesKHR = 0;

	//=== VK_KHR_get_display_properties2 ===
	PFN_vkGetPhysicalDeviceDisplayProperties2KHR vkGetPhysicalDeviceDisplayProperties2KHR = 0;
	PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR vkGetPhysicalDeviceDisplayPlaneProperties2KHR = 0;
	PFN_vkGetDisplayModeProperties2KHR vkGetDisplayModeProperties2KHR = 0;
	PFN_vkGetDisplayPlaneCapabilities2KHR vkGetDisplayPlaneCapabilities2KHR = 0;

	//=== VK_KHR_get_physical_device_properties2 ===
	PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR = 0;
	PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR = 0;
	PFN_vkGetPhysicalDeviceFormatProperties2KHR vkGetPhysicalDeviceFormatProperties2KHR = 0;
	PFN_vkGetPhysicalDeviceImageFormatProperties2KHR vkGetPhysicalDeviceImageFormatProperties2KHR = 0;
	PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR vkGetPhysicalDeviceQueueFamilyProperties2KHR = 0;
	PFN_vkGetPhysicalDeviceMemoryProperties2KHR vkGetPhysicalDeviceMemoryProperties2KHR = 0;
	PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR vkGetPhysicalDeviceSparseImageFormatProperties2KHR = 0;

	//=== VK_KHR_get_surface_capabilities2 ===
	PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR vkGetPhysicalDeviceSurfaceCapabilities2KHR = 0;
	PFN_vkGetPhysicalDeviceSurfaceFormats2KHR vkGetPhysicalDeviceSurfaceFormats2KHR = 0;

	//=== VK_KHR_performance_query ===
	PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR = 0;
	PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR = 0;

	//=== VK_KHR_surface ===
	PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR = 0;
	PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR = 0;
	PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR = 0;
	PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR = 0;
	PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR = 0;

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
	//=== VK_KHR_video_queue ===
	PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR vkGetPhysicalDeviceVideoCapabilitiesKHR = 0;
	PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR vkGetPhysicalDeviceVideoFormatPropertiesKHR = 0;
#	else
	PFN_dummy vkGetPhysicalDeviceVideoCapabilitiesKHR_placeholder = 0;
	PFN_dummy vkGetPhysicalDeviceVideoFormatPropertiesKHR_placeholder = 0;
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_USE_PLATFORM_WAYLAND_KHR)
	//=== VK_KHR_wayland_surface ===
	PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR = 0;
	PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR vkGetPhysicalDeviceWaylandPresentationSupportKHR = 0;
#	else
	PFN_dummy vkCreateWaylandSurfaceKHR_placeholder = 0;
	PFN_dummy vkGetPhysicalDeviceWaylandPresentationSupportKHR_placeholder = 0;
#	endif /*VK_USE_PLATFORM_WAYLAND_KHR*/

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
	//=== VK_KHR_win32_surface ===
	PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR = 0;
	PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR vkGetPhysicalDeviceWin32PresentationSupportKHR = 0;
#	else
	PFN_dummy vkCreateWin32SurfaceKHR_placeholder = 0;
	PFN_dummy vkGetPhysicalDeviceWin32PresentationSupportKHR_placeholder = 0;
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

#	if defined(VK_USE_PLATFORM_XCB_KHR)
	//=== VK_KHR_xcb_surface ===
	PFN_vkCreateXcbSurfaceKHR vkCreateXcbSurfaceKHR = 0;
	PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR vkGetPhysicalDeviceXcbPresentationSupportKHR = 0;
#	else
	PFN_dummy vkCreateXcbSurfaceKHR_placeholder = 0;
	PFN_dummy vkGetPhysicalDeviceXcbPresentationSupportKHR_placeholder = 0;
#	endif /*VK_USE_PLATFORM_XCB_KHR*/

#	if defined(VK_USE_PLATFORM_XLIB_KHR)
	//=== VK_KHR_xlib_surface ===
	PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR = 0;
	PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR vkGetPhysicalDeviceXlibPresentationSupportKHR = 0;
#	else
	PFN_dummy vkCreateXlibSurfaceKHR_placeholder = 0;
	PFN_dummy vkGetPhysicalDeviceXlibPresentationSupportKHR_placeholder = 0;
#	endif /*VK_USE_PLATFORM_XLIB_KHR*/

#	if defined(VK_USE_PLATFORM_IOS_MVK)
	//=== VK_MVK_ios_surface ===
	PFN_vkCreateIOSSurfaceMVK vkCreateIOSSurfaceMVK = 0;
#	else
	PFN_dummy vkCreateIOSSurfaceMVK_placeholder = 0;
#	endif /*VK_USE_PLATFORM_IOS_MVK*/

#	if defined(VK_USE_PLATFORM_MACOS_MVK)
	//=== VK_MVK_macos_surface ===
	PFN_vkCreateMacOSSurfaceMVK vkCreateMacOSSurfaceMVK = 0;
#	else
	PFN_dummy vkCreateMacOSSurfaceMVK_placeholder = 0;
#	endif /*VK_USE_PLATFORM_MACOS_MVK*/

#	if defined(VK_USE_PLATFORM_VI_NN)
	//=== VK_NN_vi_surface ===
	PFN_vkCreateViSurfaceNN vkCreateViSurfaceNN = 0;
#	else
	PFN_dummy vkCreateViSurfaceNN_placeholder = 0;
#	endif /*VK_USE_PLATFORM_VI_NN*/

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
	//=== VK_NV_acquire_winrt_display ===
	PFN_vkAcquireWinrtDisplayNV vkAcquireWinrtDisplayNV = 0;
	PFN_vkGetWinrtDisplayNV vkGetWinrtDisplayNV = 0;
#	else
	PFN_dummy vkAcquireWinrtDisplayNV_placeholder = 0;
	PFN_dummy vkGetWinrtDisplayNV_placeholder = 0;
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

	//=== VK_NV_cooperative_matrix ===
	PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV vkGetPhysicalDeviceCooperativeMatrixPropertiesNV = 0;

	//=== VK_NV_coverage_reduction_mode ===
	PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV = 0;

	//=== VK_NV_external_memory_capabilities ===
	PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV vkGetPhysicalDeviceExternalImageFormatPropertiesNV = 0;

#	if defined(VK_USE_PLATFORM_SCREEN_QNX)
	//=== VK_QNX_screen_surface ===
	PFN_vkCreateScreenSurfaceQNX vkCreateScreenSurfaceQNX = 0;
	PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX vkGetPhysicalDeviceScreenPresentationSupportQNX = 0;
#	else
	PFN_dummy vkCreateScreenSurfaceQNX_placeholder = 0;
	PFN_dummy vkGetPhysicalDeviceScreenPresentationSupportQNX_placeholder = 0;
#	endif /*VK_USE_PLATFORM_SCREEN_QNX*/

	PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr = 0;
};

class DeviceDispatcher : public DispatchLoaderBase
{
public:
	DeviceDispatcher(PFN_vkGetDeviceProcAddr getProcAddr, VkDevice device)
	    : vkGetDeviceProcAddr(getProcAddr)
	{
		//=== VK_VERSION_1_0 ===
		vkGetDeviceProcAddr = PFN_vkGetDeviceProcAddr(vkGetDeviceProcAddr(device, "vkGetDeviceProcAddr"));
		vkDestroyDevice = PFN_vkDestroyDevice(vkGetDeviceProcAddr(device, "vkDestroyDevice"));
		vkGetDeviceQueue = PFN_vkGetDeviceQueue(vkGetDeviceProcAddr(device, "vkGetDeviceQueue"));
		vkQueueSubmit = PFN_vkQueueSubmit(vkGetDeviceProcAddr(device, "vkQueueSubmit"));
		vkQueueWaitIdle = PFN_vkQueueWaitIdle(vkGetDeviceProcAddr(device, "vkQueueWaitIdle"));
		vkDeviceWaitIdle = PFN_vkDeviceWaitIdle(vkGetDeviceProcAddr(device, "vkDeviceWaitIdle"));
		vkAllocateMemory = PFN_vkAllocateMemory(vkGetDeviceProcAddr(device, "vkAllocateMemory"));
		vkFreeMemory = PFN_vkFreeMemory(vkGetDeviceProcAddr(device, "vkFreeMemory"));
		vkMapMemory = PFN_vkMapMemory(vkGetDeviceProcAddr(device, "vkMapMemory"));
		vkUnmapMemory = PFN_vkUnmapMemory(vkGetDeviceProcAddr(device, "vkUnmapMemory"));
		vkFlushMappedMemoryRanges = PFN_vkFlushMappedMemoryRanges(vkGetDeviceProcAddr(device, "vkFlushMappedMemoryRanges"));
		vkInvalidateMappedMemoryRanges = PFN_vkInvalidateMappedMemoryRanges(vkGetDeviceProcAddr(device, "vkInvalidateMappedMemoryRanges"));
		vkGetDeviceMemoryCommitment = PFN_vkGetDeviceMemoryCommitment(vkGetDeviceProcAddr(device, "vkGetDeviceMemoryCommitment"));
		vkBindBufferMemory = PFN_vkBindBufferMemory(vkGetDeviceProcAddr(device, "vkBindBufferMemory"));
		vkBindImageMemory = PFN_vkBindImageMemory(vkGetDeviceProcAddr(device, "vkBindImageMemory"));
		vkGetBufferMemoryRequirements = PFN_vkGetBufferMemoryRequirements(vkGetDeviceProcAddr(device, "vkGetBufferMemoryRequirements"));
		vkGetImageMemoryRequirements = PFN_vkGetImageMemoryRequirements(vkGetDeviceProcAddr(device, "vkGetImageMemoryRequirements"));
		vkGetImageSparseMemoryRequirements = PFN_vkGetImageSparseMemoryRequirements(vkGetDeviceProcAddr(device, "vkGetImageSparseMemoryRequirements"));
		vkQueueBindSparse = PFN_vkQueueBindSparse(vkGetDeviceProcAddr(device, "vkQueueBindSparse"));
		vkCreateFence = PFN_vkCreateFence(vkGetDeviceProcAddr(device, "vkCreateFence"));
		vkDestroyFence = PFN_vkDestroyFence(vkGetDeviceProcAddr(device, "vkDestroyFence"));
		vkResetFences = PFN_vkResetFences(vkGetDeviceProcAddr(device, "vkResetFences"));
		vkGetFenceStatus = PFN_vkGetFenceStatus(vkGetDeviceProcAddr(device, "vkGetFenceStatus"));
		vkWaitForFences = PFN_vkWaitForFences(vkGetDeviceProcAddr(device, "vkWaitForFences"));
		vkCreateSemaphore = PFN_vkCreateSemaphore(vkGetDeviceProcAddr(device, "vkCreateSemaphore"));
		vkDestroySemaphore = PFN_vkDestroySemaphore(vkGetDeviceProcAddr(device, "vkDestroySemaphore"));
		vkCreateEvent = PFN_vkCreateEvent(vkGetDeviceProcAddr(device, "vkCreateEvent"));
		vkDestroyEvent = PFN_vkDestroyEvent(vkGetDeviceProcAddr(device, "vkDestroyEvent"));
		vkGetEventStatus = PFN_vkGetEventStatus(vkGetDeviceProcAddr(device, "vkGetEventStatus"));
		vkSetEvent = PFN_vkSetEvent(vkGetDeviceProcAddr(device, "vkSetEvent"));
		vkResetEvent = PFN_vkResetEvent(vkGetDeviceProcAddr(device, "vkResetEvent"));
		vkCreateQueryPool = PFN_vkCreateQueryPool(vkGetDeviceProcAddr(device, "vkCreateQueryPool"));
		vkDestroyQueryPool = PFN_vkDestroyQueryPool(vkGetDeviceProcAddr(device, "vkDestroyQueryPool"));
		vkGetQueryPoolResults = PFN_vkGetQueryPoolResults(vkGetDeviceProcAddr(device, "vkGetQueryPoolResults"));
		vkCreateBuffer = PFN_vkCreateBuffer(vkGetDeviceProcAddr(device, "vkCreateBuffer"));
		vkDestroyBuffer = PFN_vkDestroyBuffer(vkGetDeviceProcAddr(device, "vkDestroyBuffer"));
		vkCreateBufferView = PFN_vkCreateBufferView(vkGetDeviceProcAddr(device, "vkCreateBufferView"));
		vkDestroyBufferView = PFN_vkDestroyBufferView(vkGetDeviceProcAddr(device, "vkDestroyBufferView"));
		vkCreateImage = PFN_vkCreateImage(vkGetDeviceProcAddr(device, "vkCreateImage"));
		vkDestroyImage = PFN_vkDestroyImage(vkGetDeviceProcAddr(device, "vkDestroyImage"));
		vkGetImageSubresourceLayout = PFN_vkGetImageSubresourceLayout(vkGetDeviceProcAddr(device, "vkGetImageSubresourceLayout"));
		vkCreateImageView = PFN_vkCreateImageView(vkGetDeviceProcAddr(device, "vkCreateImageView"));
		vkDestroyImageView = PFN_vkDestroyImageView(vkGetDeviceProcAddr(device, "vkDestroyImageView"));
		vkCreateShaderModule = PFN_vkCreateShaderModule(vkGetDeviceProcAddr(device, "vkCreateShaderModule"));
		vkDestroyShaderModule = PFN_vkDestroyShaderModule(vkGetDeviceProcAddr(device, "vkDestroyShaderModule"));
		vkCreatePipelineCache = PFN_vkCreatePipelineCache(vkGetDeviceProcAddr(device, "vkCreatePipelineCache"));
		vkDestroyPipelineCache = PFN_vkDestroyPipelineCache(vkGetDeviceProcAddr(device, "vkDestroyPipelineCache"));
		vkGetPipelineCacheData = PFN_vkGetPipelineCacheData(vkGetDeviceProcAddr(device, "vkGetPipelineCacheData"));
		vkMergePipelineCaches = PFN_vkMergePipelineCaches(vkGetDeviceProcAddr(device, "vkMergePipelineCaches"));
		vkCreateGraphicsPipelines = PFN_vkCreateGraphicsPipelines(vkGetDeviceProcAddr(device, "vkCreateGraphicsPipelines"));
		vkCreateComputePipelines = PFN_vkCreateComputePipelines(vkGetDeviceProcAddr(device, "vkCreateComputePipelines"));
		vkDestroyPipeline = PFN_vkDestroyPipeline(vkGetDeviceProcAddr(device, "vkDestroyPipeline"));
		vkCreatePipelineLayout = PFN_vkCreatePipelineLayout(vkGetDeviceProcAddr(device, "vkCreatePipelineLayout"));
		vkDestroyPipelineLayout = PFN_vkDestroyPipelineLayout(vkGetDeviceProcAddr(device, "vkDestroyPipelineLayout"));
		vkCreateSampler = PFN_vkCreateSampler(vkGetDeviceProcAddr(device, "vkCreateSampler"));
		vkDestroySampler = PFN_vkDestroySampler(vkGetDeviceProcAddr(device, "vkDestroySampler"));
		vkCreateDescriptorSetLayout = PFN_vkCreateDescriptorSetLayout(vkGetDeviceProcAddr(device, "vkCreateDescriptorSetLayout"));
		vkDestroyDescriptorSetLayout = PFN_vkDestroyDescriptorSetLayout(vkGetDeviceProcAddr(device, "vkDestroyDescriptorSetLayout"));
		vkCreateDescriptorPool = PFN_vkCreateDescriptorPool(vkGetDeviceProcAddr(device, "vkCreateDescriptorPool"));
		vkDestroyDescriptorPool = PFN_vkDestroyDescriptorPool(vkGetDeviceProcAddr(device, "vkDestroyDescriptorPool"));
		vkResetDescriptorPool = PFN_vkResetDescriptorPool(vkGetDeviceProcAddr(device, "vkResetDescriptorPool"));
		vkAllocateDescriptorSets = PFN_vkAllocateDescriptorSets(vkGetDeviceProcAddr(device, "vkAllocateDescriptorSets"));
		vkFreeDescriptorSets = PFN_vkFreeDescriptorSets(vkGetDeviceProcAddr(device, "vkFreeDescriptorSets"));
		vkUpdateDescriptorSets = PFN_vkUpdateDescriptorSets(vkGetDeviceProcAddr(device, "vkUpdateDescriptorSets"));
		vkCreateFramebuffer = PFN_vkCreateFramebuffer(vkGetDeviceProcAddr(device, "vkCreateFramebuffer"));
		vkDestroyFramebuffer = PFN_vkDestroyFramebuffer(vkGetDeviceProcAddr(device, "vkDestroyFramebuffer"));
		vkCreateRenderPass = PFN_vkCreateRenderPass(vkGetDeviceProcAddr(device, "vkCreateRenderPass"));
		vkDestroyRenderPass = PFN_vkDestroyRenderPass(vkGetDeviceProcAddr(device, "vkDestroyRenderPass"));
		vkGetRenderAreaGranularity = PFN_vkGetRenderAreaGranularity(vkGetDeviceProcAddr(device, "vkGetRenderAreaGranularity"));
		vkCreateCommandPool = PFN_vkCreateCommandPool(vkGetDeviceProcAddr(device, "vkCreateCommandPool"));
		vkDestroyCommandPool = PFN_vkDestroyCommandPool(vkGetDeviceProcAddr(device, "vkDestroyCommandPool"));
		vkResetCommandPool = PFN_vkResetCommandPool(vkGetDeviceProcAddr(device, "vkResetCommandPool"));
		vkAllocateCommandBuffers = PFN_vkAllocateCommandBuffers(vkGetDeviceProcAddr(device, "vkAllocateCommandBuffers"));
		vkFreeCommandBuffers = PFN_vkFreeCommandBuffers(vkGetDeviceProcAddr(device, "vkFreeCommandBuffers"));
		vkBeginCommandBuffer = PFN_vkBeginCommandBuffer(vkGetDeviceProcAddr(device, "vkBeginCommandBuffer"));
		vkEndCommandBuffer = PFN_vkEndCommandBuffer(vkGetDeviceProcAddr(device, "vkEndCommandBuffer"));
		vkResetCommandBuffer = PFN_vkResetCommandBuffer(vkGetDeviceProcAddr(device, "vkResetCommandBuffer"));
		vkCmdBindPipeline = PFN_vkCmdBindPipeline(vkGetDeviceProcAddr(device, "vkCmdBindPipeline"));
		vkCmdSetViewport = PFN_vkCmdSetViewport(vkGetDeviceProcAddr(device, "vkCmdSetViewport"));
		vkCmdSetScissor = PFN_vkCmdSetScissor(vkGetDeviceProcAddr(device, "vkCmdSetScissor"));
		vkCmdSetLineWidth = PFN_vkCmdSetLineWidth(vkGetDeviceProcAddr(device, "vkCmdSetLineWidth"));
		vkCmdSetDepthBias = PFN_vkCmdSetDepthBias(vkGetDeviceProcAddr(device, "vkCmdSetDepthBias"));
		vkCmdSetBlendConstants = PFN_vkCmdSetBlendConstants(vkGetDeviceProcAddr(device, "vkCmdSetBlendConstants"));
		vkCmdSetDepthBounds = PFN_vkCmdSetDepthBounds(vkGetDeviceProcAddr(device, "vkCmdSetDepthBounds"));
		vkCmdSetStencilCompareMask = PFN_vkCmdSetStencilCompareMask(vkGetDeviceProcAddr(device, "vkCmdSetStencilCompareMask"));
		vkCmdSetStencilWriteMask = PFN_vkCmdSetStencilWriteMask(vkGetDeviceProcAddr(device, "vkCmdSetStencilWriteMask"));
		vkCmdSetStencilReference = PFN_vkCmdSetStencilReference(vkGetDeviceProcAddr(device, "vkCmdSetStencilReference"));
		vkCmdBindDescriptorSets = PFN_vkCmdBindDescriptorSets(vkGetDeviceProcAddr(device, "vkCmdBindDescriptorSets"));
		vkCmdBindIndexBuffer = PFN_vkCmdBindIndexBuffer(vkGetDeviceProcAddr(device, "vkCmdBindIndexBuffer"));
		vkCmdBindVertexBuffers = PFN_vkCmdBindVertexBuffers(vkGetDeviceProcAddr(device, "vkCmdBindVertexBuffers"));
		vkCmdDraw = PFN_vkCmdDraw(vkGetDeviceProcAddr(device, "vkCmdDraw"));
		vkCmdDrawIndexed = PFN_vkCmdDrawIndexed(vkGetDeviceProcAddr(device, "vkCmdDrawIndexed"));
		vkCmdDrawIndirect = PFN_vkCmdDrawIndirect(vkGetDeviceProcAddr(device, "vkCmdDrawIndirect"));
		vkCmdDrawIndexedIndirect = PFN_vkCmdDrawIndexedIndirect(vkGetDeviceProcAddr(device, "vkCmdDrawIndexedIndirect"));
		vkCmdDispatch = PFN_vkCmdDispatch(vkGetDeviceProcAddr(device, "vkCmdDispatch"));
		vkCmdDispatchIndirect = PFN_vkCmdDispatchIndirect(vkGetDeviceProcAddr(device, "vkCmdDispatchIndirect"));
		vkCmdCopyBuffer = PFN_vkCmdCopyBuffer(vkGetDeviceProcAddr(device, "vkCmdCopyBuffer"));
		vkCmdCopyImage = PFN_vkCmdCopyImage(vkGetDeviceProcAddr(device, "vkCmdCopyImage"));
		vkCmdBlitImage = PFN_vkCmdBlitImage(vkGetDeviceProcAddr(device, "vkCmdBlitImage"));
		vkCmdCopyBufferToImage = PFN_vkCmdCopyBufferToImage(vkGetDeviceProcAddr(device, "vkCmdCopyBufferToImage"));
		vkCmdCopyImageToBuffer = PFN_vkCmdCopyImageToBuffer(vkGetDeviceProcAddr(device, "vkCmdCopyImageToBuffer"));
		vkCmdUpdateBuffer = PFN_vkCmdUpdateBuffer(vkGetDeviceProcAddr(device, "vkCmdUpdateBuffer"));
		vkCmdFillBuffer = PFN_vkCmdFillBuffer(vkGetDeviceProcAddr(device, "vkCmdFillBuffer"));
		vkCmdClearColorImage = PFN_vkCmdClearColorImage(vkGetDeviceProcAddr(device, "vkCmdClearColorImage"));
		vkCmdClearDepthStencilImage = PFN_vkCmdClearDepthStencilImage(vkGetDeviceProcAddr(device, "vkCmdClearDepthStencilImage"));
		vkCmdClearAttachments = PFN_vkCmdClearAttachments(vkGetDeviceProcAddr(device, "vkCmdClearAttachments"));
		vkCmdResolveImage = PFN_vkCmdResolveImage(vkGetDeviceProcAddr(device, "vkCmdResolveImage"));
		vkCmdSetEvent = PFN_vkCmdSetEvent(vkGetDeviceProcAddr(device, "vkCmdSetEvent"));
		vkCmdResetEvent = PFN_vkCmdResetEvent(vkGetDeviceProcAddr(device, "vkCmdResetEvent"));
		vkCmdWaitEvents = PFN_vkCmdWaitEvents(vkGetDeviceProcAddr(device, "vkCmdWaitEvents"));
		vkCmdPipelineBarrier = PFN_vkCmdPipelineBarrier(vkGetDeviceProcAddr(device, "vkCmdPipelineBarrier"));
		vkCmdBeginQuery = PFN_vkCmdBeginQuery(vkGetDeviceProcAddr(device, "vkCmdBeginQuery"));
		vkCmdEndQuery = PFN_vkCmdEndQuery(vkGetDeviceProcAddr(device, "vkCmdEndQuery"));
		vkCmdResetQueryPool = PFN_vkCmdResetQueryPool(vkGetDeviceProcAddr(device, "vkCmdResetQueryPool"));
		vkCmdWriteTimestamp = PFN_vkCmdWriteTimestamp(vkGetDeviceProcAddr(device, "vkCmdWriteTimestamp"));
		vkCmdCopyQueryPoolResults = PFN_vkCmdCopyQueryPoolResults(vkGetDeviceProcAddr(device, "vkCmdCopyQueryPoolResults"));
		vkCmdPushConstants = PFN_vkCmdPushConstants(vkGetDeviceProcAddr(device, "vkCmdPushConstants"));
		vkCmdBeginRenderPass = PFN_vkCmdBeginRenderPass(vkGetDeviceProcAddr(device, "vkCmdBeginRenderPass"));
		vkCmdNextSubpass = PFN_vkCmdNextSubpass(vkGetDeviceProcAddr(device, "vkCmdNextSubpass"));
		vkCmdEndRenderPass = PFN_vkCmdEndRenderPass(vkGetDeviceProcAddr(device, "vkCmdEndRenderPass"));
		vkCmdExecuteCommands = PFN_vkCmdExecuteCommands(vkGetDeviceProcAddr(device, "vkCmdExecuteCommands"));

		//=== VK_VERSION_1_1 ===
		vkBindBufferMemory2 = PFN_vkBindBufferMemory2(vkGetDeviceProcAddr(device, "vkBindBufferMemory2"));
		vkBindImageMemory2 = PFN_vkBindImageMemory2(vkGetDeviceProcAddr(device, "vkBindImageMemory2"));
		vkGetDeviceGroupPeerMemoryFeatures = PFN_vkGetDeviceGroupPeerMemoryFeatures(vkGetDeviceProcAddr(device, "vkGetDeviceGroupPeerMemoryFeatures"));
		vkCmdSetDeviceMask = PFN_vkCmdSetDeviceMask(vkGetDeviceProcAddr(device, "vkCmdSetDeviceMask"));
		vkCmdDispatchBase = PFN_vkCmdDispatchBase(vkGetDeviceProcAddr(device, "vkCmdDispatchBase"));
		vkGetImageMemoryRequirements2 = PFN_vkGetImageMemoryRequirements2(vkGetDeviceProcAddr(device, "vkGetImageMemoryRequirements2"));
		vkGetBufferMemoryRequirements2 = PFN_vkGetBufferMemoryRequirements2(vkGetDeviceProcAddr(device, "vkGetBufferMemoryRequirements2"));
		vkGetImageSparseMemoryRequirements2 = PFN_vkGetImageSparseMemoryRequirements2(vkGetDeviceProcAddr(device, "vkGetImageSparseMemoryRequirements2"));
		vkTrimCommandPool = PFN_vkTrimCommandPool(vkGetDeviceProcAddr(device, "vkTrimCommandPool"));
		vkGetDeviceQueue2 = PFN_vkGetDeviceQueue2(vkGetDeviceProcAddr(device, "vkGetDeviceQueue2"));
		vkCreateSamplerYcbcrConversion = PFN_vkCreateSamplerYcbcrConversion(vkGetDeviceProcAddr(device, "vkCreateSamplerYcbcrConversion"));
		vkDestroySamplerYcbcrConversion = PFN_vkDestroySamplerYcbcrConversion(vkGetDeviceProcAddr(device, "vkDestroySamplerYcbcrConversion"));
		vkCreateDescriptorUpdateTemplate = PFN_vkCreateDescriptorUpdateTemplate(vkGetDeviceProcAddr(device, "vkCreateDescriptorUpdateTemplate"));
		vkDestroyDescriptorUpdateTemplate = PFN_vkDestroyDescriptorUpdateTemplate(vkGetDeviceProcAddr(device, "vkDestroyDescriptorUpdateTemplate"));
		vkUpdateDescriptorSetWithTemplate = PFN_vkUpdateDescriptorSetWithTemplate(vkGetDeviceProcAddr(device, "vkUpdateDescriptorSetWithTemplate"));
		vkGetDescriptorSetLayoutSupport = PFN_vkGetDescriptorSetLayoutSupport(vkGetDeviceProcAddr(device, "vkGetDescriptorSetLayoutSupport"));

		//=== VK_VERSION_1_2 ===
		vkCmdDrawIndirectCount = PFN_vkCmdDrawIndirectCount(vkGetDeviceProcAddr(device, "vkCmdDrawIndirectCount"));
		vkCmdDrawIndexedIndirectCount = PFN_vkCmdDrawIndexedIndirectCount(vkGetDeviceProcAddr(device, "vkCmdDrawIndexedIndirectCount"));
		vkCreateRenderPass2 = PFN_vkCreateRenderPass2(vkGetDeviceProcAddr(device, "vkCreateRenderPass2"));
		vkCmdBeginRenderPass2 = PFN_vkCmdBeginRenderPass2(vkGetDeviceProcAddr(device, "vkCmdBeginRenderPass2"));
		vkCmdNextSubpass2 = PFN_vkCmdNextSubpass2(vkGetDeviceProcAddr(device, "vkCmdNextSubpass2"));
		vkCmdEndRenderPass2 = PFN_vkCmdEndRenderPass2(vkGetDeviceProcAddr(device, "vkCmdEndRenderPass2"));
		vkResetQueryPool = PFN_vkResetQueryPool(vkGetDeviceProcAddr(device, "vkResetQueryPool"));
		vkGetSemaphoreCounterValue = PFN_vkGetSemaphoreCounterValue(vkGetDeviceProcAddr(device, "vkGetSemaphoreCounterValue"));
		vkWaitSemaphores = PFN_vkWaitSemaphores(vkGetDeviceProcAddr(device, "vkWaitSemaphores"));
		vkSignalSemaphore = PFN_vkSignalSemaphore(vkGetDeviceProcAddr(device, "vkSignalSemaphore"));
		vkGetBufferDeviceAddress = PFN_vkGetBufferDeviceAddress(vkGetDeviceProcAddr(device, "vkGetBufferDeviceAddress"));
		vkGetBufferOpaqueCaptureAddress = PFN_vkGetBufferOpaqueCaptureAddress(vkGetDeviceProcAddr(device, "vkGetBufferOpaqueCaptureAddress"));
		vkGetDeviceMemoryOpaqueCaptureAddress =
		    PFN_vkGetDeviceMemoryOpaqueCaptureAddress(vkGetDeviceProcAddr(device, "vkGetDeviceMemoryOpaqueCaptureAddress"));

		//=== VK_VERSION_1_3 ===
		vkCreatePrivateDataSlot = PFN_vkCreatePrivateDataSlot(vkGetDeviceProcAddr(device, "vkCreatePrivateDataSlot"));
		vkDestroyPrivateDataSlot = PFN_vkDestroyPrivateDataSlot(vkGetDeviceProcAddr(device, "vkDestroyPrivateDataSlot"));
		vkSetPrivateData = PFN_vkSetPrivateData(vkGetDeviceProcAddr(device, "vkSetPrivateData"));
		vkGetPrivateData = PFN_vkGetPrivateData(vkGetDeviceProcAddr(device, "vkGetPrivateData"));
		vkCmdSetEvent2 = PFN_vkCmdSetEvent2(vkGetDeviceProcAddr(device, "vkCmdSetEvent2"));
		vkCmdResetEvent2 = PFN_vkCmdResetEvent2(vkGetDeviceProcAddr(device, "vkCmdResetEvent2"));
		vkCmdWaitEvents2 = PFN_vkCmdWaitEvents2(vkGetDeviceProcAddr(device, "vkCmdWaitEvents2"));
		vkCmdPipelineBarrier2 = PFN_vkCmdPipelineBarrier2(vkGetDeviceProcAddr(device, "vkCmdPipelineBarrier2"));
		vkCmdWriteTimestamp2 = PFN_vkCmdWriteTimestamp2(vkGetDeviceProcAddr(device, "vkCmdWriteTimestamp2"));
		vkQueueSubmit2 = PFN_vkQueueSubmit2(vkGetDeviceProcAddr(device, "vkQueueSubmit2"));
		vkCmdCopyBuffer2 = PFN_vkCmdCopyBuffer2(vkGetDeviceProcAddr(device, "vkCmdCopyBuffer2"));
		vkCmdCopyImage2 = PFN_vkCmdCopyImage2(vkGetDeviceProcAddr(device, "vkCmdCopyImage2"));
		vkCmdCopyBufferToImage2 = PFN_vkCmdCopyBufferToImage2(vkGetDeviceProcAddr(device, "vkCmdCopyBufferToImage2"));
		vkCmdCopyImageToBuffer2 = PFN_vkCmdCopyImageToBuffer2(vkGetDeviceProcAddr(device, "vkCmdCopyImageToBuffer2"));
		vkCmdBlitImage2 = PFN_vkCmdBlitImage2(vkGetDeviceProcAddr(device, "vkCmdBlitImage2"));
		vkCmdResolveImage2 = PFN_vkCmdResolveImage2(vkGetDeviceProcAddr(device, "vkCmdResolveImage2"));
		vkCmdBeginRendering = PFN_vkCmdBeginRendering(vkGetDeviceProcAddr(device, "vkCmdBeginRendering"));
		vkCmdEndRendering = PFN_vkCmdEndRendering(vkGetDeviceProcAddr(device, "vkCmdEndRendering"));
		vkCmdSetCullMode = PFN_vkCmdSetCullMode(vkGetDeviceProcAddr(device, "vkCmdSetCullMode"));
		vkCmdSetFrontFace = PFN_vkCmdSetFrontFace(vkGetDeviceProcAddr(device, "vkCmdSetFrontFace"));
		vkCmdSetPrimitiveTopology = PFN_vkCmdSetPrimitiveTopology(vkGetDeviceProcAddr(device, "vkCmdSetPrimitiveTopology"));
		vkCmdSetViewportWithCount = PFN_vkCmdSetViewportWithCount(vkGetDeviceProcAddr(device, "vkCmdSetViewportWithCount"));
		vkCmdSetScissorWithCount = PFN_vkCmdSetScissorWithCount(vkGetDeviceProcAddr(device, "vkCmdSetScissorWithCount"));
		vkCmdBindVertexBuffers2 = PFN_vkCmdBindVertexBuffers2(vkGetDeviceProcAddr(device, "vkCmdBindVertexBuffers2"));
		vkCmdSetDepthTestEnable = PFN_vkCmdSetDepthTestEnable(vkGetDeviceProcAddr(device, "vkCmdSetDepthTestEnable"));
		vkCmdSetDepthWriteEnable = PFN_vkCmdSetDepthWriteEnable(vkGetDeviceProcAddr(device, "vkCmdSetDepthWriteEnable"));
		vkCmdSetDepthCompareOp = PFN_vkCmdSetDepthCompareOp(vkGetDeviceProcAddr(device, "vkCmdSetDepthCompareOp"));
		vkCmdSetDepthBoundsTestEnable = PFN_vkCmdSetDepthBoundsTestEnable(vkGetDeviceProcAddr(device, "vkCmdSetDepthBoundsTestEnable"));
		vkCmdSetStencilTestEnable = PFN_vkCmdSetStencilTestEnable(vkGetDeviceProcAddr(device, "vkCmdSetStencilTestEnable"));
		vkCmdSetStencilOp = PFN_vkCmdSetStencilOp(vkGetDeviceProcAddr(device, "vkCmdSetStencilOp"));
		vkCmdSetRasterizerDiscardEnable = PFN_vkCmdSetRasterizerDiscardEnable(vkGetDeviceProcAddr(device, "vkCmdSetRasterizerDiscardEnable"));
		vkCmdSetDepthBiasEnable = PFN_vkCmdSetDepthBiasEnable(vkGetDeviceProcAddr(device, "vkCmdSetDepthBiasEnable"));
		vkCmdSetPrimitiveRestartEnable = PFN_vkCmdSetPrimitiveRestartEnable(vkGetDeviceProcAddr(device, "vkCmdSetPrimitiveRestartEnable"));
		vkGetDeviceBufferMemoryRequirements = PFN_vkGetDeviceBufferMemoryRequirements(vkGetDeviceProcAddr(device, "vkGetDeviceBufferMemoryRequirements"));
		vkGetDeviceImageMemoryRequirements = PFN_vkGetDeviceImageMemoryRequirements(vkGetDeviceProcAddr(device, "vkGetDeviceImageMemoryRequirements"));
		vkGetDeviceImageSparseMemoryRequirements =
		    PFN_vkGetDeviceImageSparseMemoryRequirements(vkGetDeviceProcAddr(device, "vkGetDeviceImageSparseMemoryRequirements"));

		//=== VK_AMD_buffer_marker ===
		vkCmdWriteBufferMarkerAMD = PFN_vkCmdWriteBufferMarkerAMD(vkGetDeviceProcAddr(device, "vkCmdWriteBufferMarkerAMD"));

		//=== VK_AMD_display_native_hdr ===
		vkSetLocalDimmingAMD = PFN_vkSetLocalDimmingAMD(vkGetDeviceProcAddr(device, "vkSetLocalDimmingAMD"));

		//=== VK_AMD_draw_indirect_count ===
		vkCmdDrawIndirectCountAMD = PFN_vkCmdDrawIndirectCountAMD(vkGetDeviceProcAddr(device, "vkCmdDrawIndirectCountAMD"));
		if(!vkCmdDrawIndirectCount)
			vkCmdDrawIndirectCount = vkCmdDrawIndirectCountAMD;
		vkCmdDrawIndexedIndirectCountAMD = PFN_vkCmdDrawIndexedIndirectCountAMD(vkGetDeviceProcAddr(device, "vkCmdDrawIndexedIndirectCountAMD"));
		if(!vkCmdDrawIndexedIndirectCount)
			vkCmdDrawIndexedIndirectCount = vkCmdDrawIndexedIndirectCountAMD;

		//=== VK_AMD_shader_info ===
		vkGetShaderInfoAMD = PFN_vkGetShaderInfoAMD(vkGetDeviceProcAddr(device, "vkGetShaderInfoAMD"));

#	if defined(VK_USE_PLATFORM_ANDROID_KHR)
		//=== VK_ANDROID_external_memory_android_hardware_buffer ===
		vkGetAndroidHardwareBufferPropertiesANDROID =
		    PFN_vkGetAndroidHardwareBufferPropertiesANDROID(vkGetDeviceProcAddr(device, "vkGetAndroidHardwareBufferPropertiesANDROID"));
		vkGetMemoryAndroidHardwareBufferANDROID =
		    PFN_vkGetMemoryAndroidHardwareBufferANDROID(vkGetDeviceProcAddr(device, "vkGetMemoryAndroidHardwareBufferANDROID"));
#	endif /*VK_USE_PLATFORM_ANDROID_KHR*/

		//=== VK_EXT_buffer_device_address ===
		vkGetBufferDeviceAddressEXT = PFN_vkGetBufferDeviceAddressEXT(vkGetDeviceProcAddr(device, "vkGetBufferDeviceAddressEXT"));
		if(!vkGetBufferDeviceAddress)
			vkGetBufferDeviceAddress = vkGetBufferDeviceAddressEXT;

		//=== VK_EXT_calibrated_timestamps ===
		vkGetCalibratedTimestampsEXT = PFN_vkGetCalibratedTimestampsEXT(vkGetDeviceProcAddr(device, "vkGetCalibratedTimestampsEXT"));

		//=== VK_EXT_color_write_enable ===
		vkCmdSetColorWriteEnableEXT = PFN_vkCmdSetColorWriteEnableEXT(vkGetDeviceProcAddr(device, "vkCmdSetColorWriteEnableEXT"));

		//=== VK_EXT_conditional_rendering ===
		vkCmdBeginConditionalRenderingEXT = PFN_vkCmdBeginConditionalRenderingEXT(vkGetDeviceProcAddr(device, "vkCmdBeginConditionalRenderingEXT"));
		vkCmdEndConditionalRenderingEXT = PFN_vkCmdEndConditionalRenderingEXT(vkGetDeviceProcAddr(device, "vkCmdEndConditionalRenderingEXT"));

		//=== VK_EXT_debug_marker ===
		vkDebugMarkerSetObjectTagEXT = PFN_vkDebugMarkerSetObjectTagEXT(vkGetDeviceProcAddr(device, "vkDebugMarkerSetObjectTagEXT"));
		vkDebugMarkerSetObjectNameEXT = PFN_vkDebugMarkerSetObjectNameEXT(vkGetDeviceProcAddr(device, "vkDebugMarkerSetObjectNameEXT"));
		vkCmdDebugMarkerBeginEXT = PFN_vkCmdDebugMarkerBeginEXT(vkGetDeviceProcAddr(device, "vkCmdDebugMarkerBeginEXT"));
		vkCmdDebugMarkerEndEXT = PFN_vkCmdDebugMarkerEndEXT(vkGetDeviceProcAddr(device, "vkCmdDebugMarkerEndEXT"));
		vkCmdDebugMarkerInsertEXT = PFN_vkCmdDebugMarkerInsertEXT(vkGetDeviceProcAddr(device, "vkCmdDebugMarkerInsertEXT"));

		//=== VK_EXT_debug_utils ===
		vkSetDebugUtilsObjectNameEXT = PFN_vkSetDebugUtilsObjectNameEXT(vkGetDeviceProcAddr(device, "vkSetDebugUtilsObjectNameEXT"));
		vkSetDebugUtilsObjectTagEXT = PFN_vkSetDebugUtilsObjectTagEXT(vkGetDeviceProcAddr(device, "vkSetDebugUtilsObjectTagEXT"));
		vkQueueBeginDebugUtilsLabelEXT = PFN_vkQueueBeginDebugUtilsLabelEXT(vkGetDeviceProcAddr(device, "vkQueueBeginDebugUtilsLabelEXT"));
		vkQueueEndDebugUtilsLabelEXT = PFN_vkQueueEndDebugUtilsLabelEXT(vkGetDeviceProcAddr(device, "vkQueueEndDebugUtilsLabelEXT"));
		vkQueueInsertDebugUtilsLabelEXT = PFN_vkQueueInsertDebugUtilsLabelEXT(vkGetDeviceProcAddr(device, "vkQueueInsertDebugUtilsLabelEXT"));
		vkCmdBeginDebugUtilsLabelEXT = PFN_vkCmdBeginDebugUtilsLabelEXT(vkGetDeviceProcAddr(device, "vkCmdBeginDebugUtilsLabelEXT"));
		vkCmdEndDebugUtilsLabelEXT = PFN_vkCmdEndDebugUtilsLabelEXT(vkGetDeviceProcAddr(device, "vkCmdEndDebugUtilsLabelEXT"));
		vkCmdInsertDebugUtilsLabelEXT = PFN_vkCmdInsertDebugUtilsLabelEXT(vkGetDeviceProcAddr(device, "vkCmdInsertDebugUtilsLabelEXT"));

		//=== VK_EXT_discard_rectangles ===
		vkCmdSetDiscardRectangleEXT = PFN_vkCmdSetDiscardRectangleEXT(vkGetDeviceProcAddr(device, "vkCmdSetDiscardRectangleEXT"));

		//=== VK_EXT_display_control ===
		vkDisplayPowerControlEXT = PFN_vkDisplayPowerControlEXT(vkGetDeviceProcAddr(device, "vkDisplayPowerControlEXT"));
		vkRegisterDeviceEventEXT = PFN_vkRegisterDeviceEventEXT(vkGetDeviceProcAddr(device, "vkRegisterDeviceEventEXT"));
		vkRegisterDisplayEventEXT = PFN_vkRegisterDisplayEventEXT(vkGetDeviceProcAddr(device, "vkRegisterDisplayEventEXT"));
		vkGetSwapchainCounterEXT = PFN_vkGetSwapchainCounterEXT(vkGetDeviceProcAddr(device, "vkGetSwapchainCounterEXT"));

		//=== VK_EXT_extended_dynamic_state ===
		vkCmdSetCullModeEXT = PFN_vkCmdSetCullModeEXT(vkGetDeviceProcAddr(device, "vkCmdSetCullModeEXT"));
		if(!vkCmdSetCullMode)
			vkCmdSetCullMode = vkCmdSetCullModeEXT;
		vkCmdSetFrontFaceEXT = PFN_vkCmdSetFrontFaceEXT(vkGetDeviceProcAddr(device, "vkCmdSetFrontFaceEXT"));
		if(!vkCmdSetFrontFace)
			vkCmdSetFrontFace = vkCmdSetFrontFaceEXT;
		vkCmdSetPrimitiveTopologyEXT = PFN_vkCmdSetPrimitiveTopologyEXT(vkGetDeviceProcAddr(device, "vkCmdSetPrimitiveTopologyEXT"));
		if(!vkCmdSetPrimitiveTopology)
			vkCmdSetPrimitiveTopology = vkCmdSetPrimitiveTopologyEXT;
		vkCmdSetViewportWithCountEXT = PFN_vkCmdSetViewportWithCountEXT(vkGetDeviceProcAddr(device, "vkCmdSetViewportWithCountEXT"));
		if(!vkCmdSetViewportWithCount)
			vkCmdSetViewportWithCount = vkCmdSetViewportWithCountEXT;
		vkCmdSetScissorWithCountEXT = PFN_vkCmdSetScissorWithCountEXT(vkGetDeviceProcAddr(device, "vkCmdSetScissorWithCountEXT"));
		if(!vkCmdSetScissorWithCount)
			vkCmdSetScissorWithCount = vkCmdSetScissorWithCountEXT;
		vkCmdBindVertexBuffers2EXT = PFN_vkCmdBindVertexBuffers2EXT(vkGetDeviceProcAddr(device, "vkCmdBindVertexBuffers2EXT"));
		if(!vkCmdBindVertexBuffers2)
			vkCmdBindVertexBuffers2 = vkCmdBindVertexBuffers2EXT;
		vkCmdSetDepthTestEnableEXT = PFN_vkCmdSetDepthTestEnableEXT(vkGetDeviceProcAddr(device, "vkCmdSetDepthTestEnableEXT"));
		if(!vkCmdSetDepthTestEnable)
			vkCmdSetDepthTestEnable = vkCmdSetDepthTestEnableEXT;
		vkCmdSetDepthWriteEnableEXT = PFN_vkCmdSetDepthWriteEnableEXT(vkGetDeviceProcAddr(device, "vkCmdSetDepthWriteEnableEXT"));
		if(!vkCmdSetDepthWriteEnable)
			vkCmdSetDepthWriteEnable = vkCmdSetDepthWriteEnableEXT;
		vkCmdSetDepthCompareOpEXT = PFN_vkCmdSetDepthCompareOpEXT(vkGetDeviceProcAddr(device, "vkCmdSetDepthCompareOpEXT"));
		if(!vkCmdSetDepthCompareOp)
			vkCmdSetDepthCompareOp = vkCmdSetDepthCompareOpEXT;
		vkCmdSetDepthBoundsTestEnableEXT = PFN_vkCmdSetDepthBoundsTestEnableEXT(vkGetDeviceProcAddr(device, "vkCmdSetDepthBoundsTestEnableEXT"));
		if(!vkCmdSetDepthBoundsTestEnable)
			vkCmdSetDepthBoundsTestEnable = vkCmdSetDepthBoundsTestEnableEXT;
		vkCmdSetStencilTestEnableEXT = PFN_vkCmdSetStencilTestEnableEXT(vkGetDeviceProcAddr(device, "vkCmdSetStencilTestEnableEXT"));
		if(!vkCmdSetStencilTestEnable)
			vkCmdSetStencilTestEnable = vkCmdSetStencilTestEnableEXT;
		vkCmdSetStencilOpEXT = PFN_vkCmdSetStencilOpEXT(vkGetDeviceProcAddr(device, "vkCmdSetStencilOpEXT"));
		if(!vkCmdSetStencilOp)
			vkCmdSetStencilOp = vkCmdSetStencilOpEXT;

		//=== VK_EXT_extended_dynamic_state2 ===
		vkCmdSetPatchControlPointsEXT = PFN_vkCmdSetPatchControlPointsEXT(vkGetDeviceProcAddr(device, "vkCmdSetPatchControlPointsEXT"));
		vkCmdSetRasterizerDiscardEnableEXT = PFN_vkCmdSetRasterizerDiscardEnableEXT(vkGetDeviceProcAddr(device, "vkCmdSetRasterizerDiscardEnableEXT"));
		if(!vkCmdSetRasterizerDiscardEnable)
			vkCmdSetRasterizerDiscardEnable = vkCmdSetRasterizerDiscardEnableEXT;
		vkCmdSetDepthBiasEnableEXT = PFN_vkCmdSetDepthBiasEnableEXT(vkGetDeviceProcAddr(device, "vkCmdSetDepthBiasEnableEXT"));
		if(!vkCmdSetDepthBiasEnable)
			vkCmdSetDepthBiasEnable = vkCmdSetDepthBiasEnableEXT;
		vkCmdSetLogicOpEXT = PFN_vkCmdSetLogicOpEXT(vkGetDeviceProcAddr(device, "vkCmdSetLogicOpEXT"));
		vkCmdSetPrimitiveRestartEnableEXT = PFN_vkCmdSetPrimitiveRestartEnableEXT(vkGetDeviceProcAddr(device, "vkCmdSetPrimitiveRestartEnableEXT"));
		if(!vkCmdSetPrimitiveRestartEnable)
			vkCmdSetPrimitiveRestartEnable = vkCmdSetPrimitiveRestartEnableEXT;

		//=== VK_EXT_external_memory_host ===
		vkGetMemoryHostPointerPropertiesEXT = PFN_vkGetMemoryHostPointerPropertiesEXT(vkGetDeviceProcAddr(device, "vkGetMemoryHostPointerPropertiesEXT"));

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
		//=== VK_EXT_full_screen_exclusive ===
		vkAcquireFullScreenExclusiveModeEXT = PFN_vkAcquireFullScreenExclusiveModeEXT(vkGetDeviceProcAddr(device, "vkAcquireFullScreenExclusiveModeEXT"));
		vkReleaseFullScreenExclusiveModeEXT = PFN_vkReleaseFullScreenExclusiveModeEXT(vkGetDeviceProcAddr(device, "vkReleaseFullScreenExclusiveModeEXT"));
		vkGetDeviceGroupSurfacePresentModes2EXT =
		    PFN_vkGetDeviceGroupSurfacePresentModes2EXT(vkGetDeviceProcAddr(device, "vkGetDeviceGroupSurfacePresentModes2EXT"));
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

		//=== VK_EXT_hdr_metadata ===
		vkSetHdrMetadataEXT = PFN_vkSetHdrMetadataEXT(vkGetDeviceProcAddr(device, "vkSetHdrMetadataEXT"));

		//=== VK_EXT_host_query_reset ===
		vkResetQueryPoolEXT = PFN_vkResetQueryPoolEXT(vkGetDeviceProcAddr(device, "vkResetQueryPoolEXT"));
		if(!vkResetQueryPool)
			vkResetQueryPool = vkResetQueryPoolEXT;

		//=== VK_EXT_image_drm_format_modifier ===
		vkGetImageDrmFormatModifierPropertiesEXT =
		    PFN_vkGetImageDrmFormatModifierPropertiesEXT(vkGetDeviceProcAddr(device, "vkGetImageDrmFormatModifierPropertiesEXT"));

		//=== VK_EXT_line_rasterization ===
		vkCmdSetLineStippleEXT = PFN_vkCmdSetLineStippleEXT(vkGetDeviceProcAddr(device, "vkCmdSetLineStippleEXT"));

		//=== VK_EXT_multi_draw ===
		vkCmdDrawMultiEXT = PFN_vkCmdDrawMultiEXT(vkGetDeviceProcAddr(device, "vkCmdDrawMultiEXT"));
		vkCmdDrawMultiIndexedEXT = PFN_vkCmdDrawMultiIndexedEXT(vkGetDeviceProcAddr(device, "vkCmdDrawMultiIndexedEXT"));

		//=== VK_EXT_pageable_device_local_memory ===
		vkSetDeviceMemoryPriorityEXT = PFN_vkSetDeviceMemoryPriorityEXT(vkGetDeviceProcAddr(device, "vkSetDeviceMemoryPriorityEXT"));

		//=== VK_EXT_private_data ===
		vkCreatePrivateDataSlotEXT = PFN_vkCreatePrivateDataSlotEXT(vkGetDeviceProcAddr(device, "vkCreatePrivateDataSlotEXT"));
		if(!vkCreatePrivateDataSlot)
			vkCreatePrivateDataSlot = vkCreatePrivateDataSlotEXT;
		vkDestroyPrivateDataSlotEXT = PFN_vkDestroyPrivateDataSlotEXT(vkGetDeviceProcAddr(device, "vkDestroyPrivateDataSlotEXT"));
		if(!vkDestroyPrivateDataSlot)
			vkDestroyPrivateDataSlot = vkDestroyPrivateDataSlotEXT;
		vkSetPrivateDataEXT = PFN_vkSetPrivateDataEXT(vkGetDeviceProcAddr(device, "vkSetPrivateDataEXT"));
		if(!vkSetPrivateData)
			vkSetPrivateData = vkSetPrivateDataEXT;
		vkGetPrivateDataEXT = PFN_vkGetPrivateDataEXT(vkGetDeviceProcAddr(device, "vkGetPrivateDataEXT"));
		if(!vkGetPrivateData)
			vkGetPrivateData = vkGetPrivateDataEXT;

		//=== VK_EXT_sample_locations ===
		vkCmdSetSampleLocationsEXT = PFN_vkCmdSetSampleLocationsEXT(vkGetDeviceProcAddr(device, "vkCmdSetSampleLocationsEXT"));

		//=== VK_EXT_transform_feedback ===
		vkCmdBindTransformFeedbackBuffersEXT =
		    PFN_vkCmdBindTransformFeedbackBuffersEXT(vkGetDeviceProcAddr(device, "vkCmdBindTransformFeedbackBuffersEXT"));
		vkCmdBeginTransformFeedbackEXT = PFN_vkCmdBeginTransformFeedbackEXT(vkGetDeviceProcAddr(device, "vkCmdBeginTransformFeedbackEXT"));
		vkCmdEndTransformFeedbackEXT = PFN_vkCmdEndTransformFeedbackEXT(vkGetDeviceProcAddr(device, "vkCmdEndTransformFeedbackEXT"));
		vkCmdBeginQueryIndexedEXT = PFN_vkCmdBeginQueryIndexedEXT(vkGetDeviceProcAddr(device, "vkCmdBeginQueryIndexedEXT"));
		vkCmdEndQueryIndexedEXT = PFN_vkCmdEndQueryIndexedEXT(vkGetDeviceProcAddr(device, "vkCmdEndQueryIndexedEXT"));
		vkCmdDrawIndirectByteCountEXT = PFN_vkCmdDrawIndirectByteCountEXT(vkGetDeviceProcAddr(device, "vkCmdDrawIndirectByteCountEXT"));

		//=== VK_EXT_validation_cache ===
		vkCreateValidationCacheEXT = PFN_vkCreateValidationCacheEXT(vkGetDeviceProcAddr(device, "vkCreateValidationCacheEXT"));
		vkDestroyValidationCacheEXT = PFN_vkDestroyValidationCacheEXT(vkGetDeviceProcAddr(device, "vkDestroyValidationCacheEXT"));
		vkMergeValidationCachesEXT = PFN_vkMergeValidationCachesEXT(vkGetDeviceProcAddr(device, "vkMergeValidationCachesEXT"));
		vkGetValidationCacheDataEXT = PFN_vkGetValidationCacheDataEXT(vkGetDeviceProcAddr(device, "vkGetValidationCacheDataEXT"));

		//=== VK_EXT_vertex_input_dynamic_state ===
		vkCmdSetVertexInputEXT = PFN_vkCmdSetVertexInputEXT(vkGetDeviceProcAddr(device, "vkCmdSetVertexInputEXT"));

#	if defined(VK_USE_PLATFORM_FUCHSIA)
		//=== VK_FUCHSIA_buffer_collection ===
		vkCreateBufferCollectionFUCHSIA = PFN_vkCreateBufferCollectionFUCHSIA(vkGetDeviceProcAddr(device, "vkCreateBufferCollectionFUCHSIA"));
		vkSetBufferCollectionImageConstraintsFUCHSIA =
		    PFN_vkSetBufferCollectionImageConstraintsFUCHSIA(vkGetDeviceProcAddr(device, "vkSetBufferCollectionImageConstraintsFUCHSIA"));
		vkSetBufferCollectionBufferConstraintsFUCHSIA =
		    PFN_vkSetBufferCollectionBufferConstraintsFUCHSIA(vkGetDeviceProcAddr(device, "vkSetBufferCollectionBufferConstraintsFUCHSIA"));
		vkDestroyBufferCollectionFUCHSIA = PFN_vkDestroyBufferCollectionFUCHSIA(vkGetDeviceProcAddr(device, "vkDestroyBufferCollectionFUCHSIA"));
		vkGetBufferCollectionPropertiesFUCHSIA =
		    PFN_vkGetBufferCollectionPropertiesFUCHSIA(vkGetDeviceProcAddr(device, "vkGetBufferCollectionPropertiesFUCHSIA"));
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

#	if defined(VK_USE_PLATFORM_FUCHSIA)
		//=== VK_FUCHSIA_external_memory ===
		vkGetMemoryZirconHandleFUCHSIA = PFN_vkGetMemoryZirconHandleFUCHSIA(vkGetDeviceProcAddr(device, "vkGetMemoryZirconHandleFUCHSIA"));
		vkGetMemoryZirconHandlePropertiesFUCHSIA =
		    PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA(vkGetDeviceProcAddr(device, "vkGetMemoryZirconHandlePropertiesFUCHSIA"));
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

#	if defined(VK_USE_PLATFORM_FUCHSIA)
		//=== VK_FUCHSIA_external_semaphore ===
		vkImportSemaphoreZirconHandleFUCHSIA =
		    PFN_vkImportSemaphoreZirconHandleFUCHSIA(vkGetDeviceProcAddr(device, "vkImportSemaphoreZirconHandleFUCHSIA"));
		vkGetSemaphoreZirconHandleFUCHSIA = PFN_vkGetSemaphoreZirconHandleFUCHSIA(vkGetDeviceProcAddr(device, "vkGetSemaphoreZirconHandleFUCHSIA"));
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

		//=== VK_GOOGLE_display_timing ===
		vkGetRefreshCycleDurationGOOGLE = PFN_vkGetRefreshCycleDurationGOOGLE(vkGetDeviceProcAddr(device, "vkGetRefreshCycleDurationGOOGLE"));
		vkGetPastPresentationTimingGOOGLE = PFN_vkGetPastPresentationTimingGOOGLE(vkGetDeviceProcAddr(device, "vkGetPastPresentationTimingGOOGLE"));

		//=== VK_HUAWEI_invocation_mask ===
		vkCmdBindInvocationMaskHUAWEI = PFN_vkCmdBindInvocationMaskHUAWEI(vkGetDeviceProcAddr(device, "vkCmdBindInvocationMaskHUAWEI"));

		//=== VK_HUAWEI_subpass_shading ===
		vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI =
		    PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(vkGetDeviceProcAddr(device, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI"));
		vkCmdSubpassShadingHUAWEI = PFN_vkCmdSubpassShadingHUAWEI(vkGetDeviceProcAddr(device, "vkCmdSubpassShadingHUAWEI"));

		//=== VK_INTEL_performance_query ===
		vkInitializePerformanceApiINTEL = PFN_vkInitializePerformanceApiINTEL(vkGetDeviceProcAddr(device, "vkInitializePerformanceApiINTEL"));
		vkUninitializePerformanceApiINTEL = PFN_vkUninitializePerformanceApiINTEL(vkGetDeviceProcAddr(device, "vkUninitializePerformanceApiINTEL"));
		vkCmdSetPerformanceMarkerINTEL = PFN_vkCmdSetPerformanceMarkerINTEL(vkGetDeviceProcAddr(device, "vkCmdSetPerformanceMarkerINTEL"));
		vkCmdSetPerformanceStreamMarkerINTEL =
		    PFN_vkCmdSetPerformanceStreamMarkerINTEL(vkGetDeviceProcAddr(device, "vkCmdSetPerformanceStreamMarkerINTEL"));
		vkCmdSetPerformanceOverrideINTEL = PFN_vkCmdSetPerformanceOverrideINTEL(vkGetDeviceProcAddr(device, "vkCmdSetPerformanceOverrideINTEL"));
		vkAcquirePerformanceConfigurationINTEL =
		    PFN_vkAcquirePerformanceConfigurationINTEL(vkGetDeviceProcAddr(device, "vkAcquirePerformanceConfigurationINTEL"));
		vkReleasePerformanceConfigurationINTEL =
		    PFN_vkReleasePerformanceConfigurationINTEL(vkGetDeviceProcAddr(device, "vkReleasePerformanceConfigurationINTEL"));
		vkQueueSetPerformanceConfigurationINTEL =
		    PFN_vkQueueSetPerformanceConfigurationINTEL(vkGetDeviceProcAddr(device, "vkQueueSetPerformanceConfigurationINTEL"));
		vkGetPerformanceParameterINTEL = PFN_vkGetPerformanceParameterINTEL(vkGetDeviceProcAddr(device, "vkGetPerformanceParameterINTEL"));

		//=== VK_KHR_acceleration_structure ===
		vkCreateAccelerationStructureKHR = PFN_vkCreateAccelerationStructureKHR(vkGetDeviceProcAddr(device, "vkCreateAccelerationStructureKHR"));
		vkDestroyAccelerationStructureKHR = PFN_vkDestroyAccelerationStructureKHR(vkGetDeviceProcAddr(device, "vkDestroyAccelerationStructureKHR"));
		vkCmdBuildAccelerationStructuresKHR = PFN_vkCmdBuildAccelerationStructuresKHR(vkGetDeviceProcAddr(device, "vkCmdBuildAccelerationStructuresKHR"));
		vkCmdBuildAccelerationStructuresIndirectKHR =
		    PFN_vkCmdBuildAccelerationStructuresIndirectKHR(vkGetDeviceProcAddr(device, "vkCmdBuildAccelerationStructuresIndirectKHR"));
		vkBuildAccelerationStructuresKHR = PFN_vkBuildAccelerationStructuresKHR(vkGetDeviceProcAddr(device, "vkBuildAccelerationStructuresKHR"));
		vkCopyAccelerationStructureKHR = PFN_vkCopyAccelerationStructureKHR(vkGetDeviceProcAddr(device, "vkCopyAccelerationStructureKHR"));
		vkCopyAccelerationStructureToMemoryKHR =
		    PFN_vkCopyAccelerationStructureToMemoryKHR(vkGetDeviceProcAddr(device, "vkCopyAccelerationStructureToMemoryKHR"));
		vkCopyMemoryToAccelerationStructureKHR =
		    PFN_vkCopyMemoryToAccelerationStructureKHR(vkGetDeviceProcAddr(device, "vkCopyMemoryToAccelerationStructureKHR"));
		vkWriteAccelerationStructuresPropertiesKHR =
		    PFN_vkWriteAccelerationStructuresPropertiesKHR(vkGetDeviceProcAddr(device, "vkWriteAccelerationStructuresPropertiesKHR"));
		vkCmdCopyAccelerationStructureKHR = PFN_vkCmdCopyAccelerationStructureKHR(vkGetDeviceProcAddr(device, "vkCmdCopyAccelerationStructureKHR"));
		vkCmdCopyAccelerationStructureToMemoryKHR =
		    PFN_vkCmdCopyAccelerationStructureToMemoryKHR(vkGetDeviceProcAddr(device, "vkCmdCopyAccelerationStructureToMemoryKHR"));
		vkCmdCopyMemoryToAccelerationStructureKHR =
		    PFN_vkCmdCopyMemoryToAccelerationStructureKHR(vkGetDeviceProcAddr(device, "vkCmdCopyMemoryToAccelerationStructureKHR"));
		vkGetAccelerationStructureDeviceAddressKHR =
		    PFN_vkGetAccelerationStructureDeviceAddressKHR(vkGetDeviceProcAddr(device, "vkGetAccelerationStructureDeviceAddressKHR"));
		vkCmdWriteAccelerationStructuresPropertiesKHR =
		    PFN_vkCmdWriteAccelerationStructuresPropertiesKHR(vkGetDeviceProcAddr(device, "vkCmdWriteAccelerationStructuresPropertiesKHR"));
		vkGetDeviceAccelerationStructureCompatibilityKHR =
		    PFN_vkGetDeviceAccelerationStructureCompatibilityKHR(vkGetDeviceProcAddr(device, "vkGetDeviceAccelerationStructureCompatibilityKHR"));
		vkGetAccelerationStructureBuildSizesKHR =
		    PFN_vkGetAccelerationStructureBuildSizesKHR(vkGetDeviceProcAddr(device, "vkGetAccelerationStructureBuildSizesKHR"));

		//=== VK_KHR_bind_memory2 ===
		vkBindBufferMemory2KHR = PFN_vkBindBufferMemory2KHR(vkGetDeviceProcAddr(device, "vkBindBufferMemory2KHR"));
		if(!vkBindBufferMemory2)
			vkBindBufferMemory2 = vkBindBufferMemory2KHR;
		vkBindImageMemory2KHR = PFN_vkBindImageMemory2KHR(vkGetDeviceProcAddr(device, "vkBindImageMemory2KHR"));
		if(!vkBindImageMemory2)
			vkBindImageMemory2 = vkBindImageMemory2KHR;

		//=== VK_KHR_buffer_device_address ===
		vkGetBufferDeviceAddressKHR = PFN_vkGetBufferDeviceAddressKHR(vkGetDeviceProcAddr(device, "vkGetBufferDeviceAddressKHR"));
		if(!vkGetBufferDeviceAddress)
			vkGetBufferDeviceAddress = vkGetBufferDeviceAddressKHR;
		vkGetBufferOpaqueCaptureAddressKHR = PFN_vkGetBufferOpaqueCaptureAddressKHR(vkGetDeviceProcAddr(device, "vkGetBufferOpaqueCaptureAddressKHR"));
		if(!vkGetBufferOpaqueCaptureAddress)
			vkGetBufferOpaqueCaptureAddress = vkGetBufferOpaqueCaptureAddressKHR;
		vkGetDeviceMemoryOpaqueCaptureAddressKHR =
		    PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR(vkGetDeviceProcAddr(device, "vkGetDeviceMemoryOpaqueCaptureAddressKHR"));
		if(!vkGetDeviceMemoryOpaqueCaptureAddress)
			vkGetDeviceMemoryOpaqueCaptureAddress = vkGetDeviceMemoryOpaqueCaptureAddressKHR;

		//=== VK_KHR_copy_commands2 ===
		vkCmdCopyBuffer2KHR = PFN_vkCmdCopyBuffer2KHR(vkGetDeviceProcAddr(device, "vkCmdCopyBuffer2KHR"));
		if(!vkCmdCopyBuffer2)
			vkCmdCopyBuffer2 = vkCmdCopyBuffer2KHR;
		vkCmdCopyImage2KHR = PFN_vkCmdCopyImage2KHR(vkGetDeviceProcAddr(device, "vkCmdCopyImage2KHR"));
		if(!vkCmdCopyImage2)
			vkCmdCopyImage2 = vkCmdCopyImage2KHR;
		vkCmdCopyBufferToImage2KHR = PFN_vkCmdCopyBufferToImage2KHR(vkGetDeviceProcAddr(device, "vkCmdCopyBufferToImage2KHR"));
		if(!vkCmdCopyBufferToImage2)
			vkCmdCopyBufferToImage2 = vkCmdCopyBufferToImage2KHR;
		vkCmdCopyImageToBuffer2KHR = PFN_vkCmdCopyImageToBuffer2KHR(vkGetDeviceProcAddr(device, "vkCmdCopyImageToBuffer2KHR"));
		if(!vkCmdCopyImageToBuffer2)
			vkCmdCopyImageToBuffer2 = vkCmdCopyImageToBuffer2KHR;
		vkCmdBlitImage2KHR = PFN_vkCmdBlitImage2KHR(vkGetDeviceProcAddr(device, "vkCmdBlitImage2KHR"));
		if(!vkCmdBlitImage2)
			vkCmdBlitImage2 = vkCmdBlitImage2KHR;
		vkCmdResolveImage2KHR = PFN_vkCmdResolveImage2KHR(vkGetDeviceProcAddr(device, "vkCmdResolveImage2KHR"));
		if(!vkCmdResolveImage2)
			vkCmdResolveImage2 = vkCmdResolveImage2KHR;

		//=== VK_KHR_create_renderpass2 ===
		vkCreateRenderPass2KHR = PFN_vkCreateRenderPass2KHR(vkGetDeviceProcAddr(device, "vkCreateRenderPass2KHR"));
		if(!vkCreateRenderPass2)
			vkCreateRenderPass2 = vkCreateRenderPass2KHR;
		vkCmdBeginRenderPass2KHR = PFN_vkCmdBeginRenderPass2KHR(vkGetDeviceProcAddr(device, "vkCmdBeginRenderPass2KHR"));
		if(!vkCmdBeginRenderPass2)
			vkCmdBeginRenderPass2 = vkCmdBeginRenderPass2KHR;
		vkCmdNextSubpass2KHR = PFN_vkCmdNextSubpass2KHR(vkGetDeviceProcAddr(device, "vkCmdNextSubpass2KHR"));
		if(!vkCmdNextSubpass2)
			vkCmdNextSubpass2 = vkCmdNextSubpass2KHR;
		vkCmdEndRenderPass2KHR = PFN_vkCmdEndRenderPass2KHR(vkGetDeviceProcAddr(device, "vkCmdEndRenderPass2KHR"));
		if(!vkCmdEndRenderPass2)
			vkCmdEndRenderPass2 = vkCmdEndRenderPass2KHR;

		//=== VK_KHR_deferred_host_operations ===
		vkCreateDeferredOperationKHR = PFN_vkCreateDeferredOperationKHR(vkGetDeviceProcAddr(device, "vkCreateDeferredOperationKHR"));
		vkDestroyDeferredOperationKHR = PFN_vkDestroyDeferredOperationKHR(vkGetDeviceProcAddr(device, "vkDestroyDeferredOperationKHR"));
		vkGetDeferredOperationMaxConcurrencyKHR =
		    PFN_vkGetDeferredOperationMaxConcurrencyKHR(vkGetDeviceProcAddr(device, "vkGetDeferredOperationMaxConcurrencyKHR"));
		vkGetDeferredOperationResultKHR = PFN_vkGetDeferredOperationResultKHR(vkGetDeviceProcAddr(device, "vkGetDeferredOperationResultKHR"));
		vkDeferredOperationJoinKHR = PFN_vkDeferredOperationJoinKHR(vkGetDeviceProcAddr(device, "vkDeferredOperationJoinKHR"));

		//=== VK_KHR_descriptor_update_template ===
		vkCreateDescriptorUpdateTemplateKHR = PFN_vkCreateDescriptorUpdateTemplateKHR(vkGetDeviceProcAddr(device, "vkCreateDescriptorUpdateTemplateKHR"));
		if(!vkCreateDescriptorUpdateTemplate)
			vkCreateDescriptorUpdateTemplate = vkCreateDescriptorUpdateTemplateKHR;
		vkDestroyDescriptorUpdateTemplateKHR =
		    PFN_vkDestroyDescriptorUpdateTemplateKHR(vkGetDeviceProcAddr(device, "vkDestroyDescriptorUpdateTemplateKHR"));
		if(!vkDestroyDescriptorUpdateTemplate)
			vkDestroyDescriptorUpdateTemplate = vkDestroyDescriptorUpdateTemplateKHR;
		vkUpdateDescriptorSetWithTemplateKHR =
		    PFN_vkUpdateDescriptorSetWithTemplateKHR(vkGetDeviceProcAddr(device, "vkUpdateDescriptorSetWithTemplateKHR"));
		if(!vkUpdateDescriptorSetWithTemplate)
			vkUpdateDescriptorSetWithTemplate = vkUpdateDescriptorSetWithTemplateKHR;
		vkCmdPushDescriptorSetWithTemplateKHR =
		    PFN_vkCmdPushDescriptorSetWithTemplateKHR(vkGetDeviceProcAddr(device, "vkCmdPushDescriptorSetWithTemplateKHR"));

		//=== VK_KHR_device_group ===
		vkGetDeviceGroupPeerMemoryFeaturesKHR =
		    PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR(vkGetDeviceProcAddr(device, "vkGetDeviceGroupPeerMemoryFeaturesKHR"));
		if(!vkGetDeviceGroupPeerMemoryFeatures)
			vkGetDeviceGroupPeerMemoryFeatures = vkGetDeviceGroupPeerMemoryFeaturesKHR;
		vkCmdSetDeviceMaskKHR = PFN_vkCmdSetDeviceMaskKHR(vkGetDeviceProcAddr(device, "vkCmdSetDeviceMaskKHR"));
		if(!vkCmdSetDeviceMask)
			vkCmdSetDeviceMask = vkCmdSetDeviceMaskKHR;
		vkCmdDispatchBaseKHR = PFN_vkCmdDispatchBaseKHR(vkGetDeviceProcAddr(device, "vkCmdDispatchBaseKHR"));
		if(!vkCmdDispatchBase)
			vkCmdDispatchBase = vkCmdDispatchBaseKHR;
		vkGetDeviceGroupPresentCapabilitiesKHR =
		    PFN_vkGetDeviceGroupPresentCapabilitiesKHR(vkGetDeviceProcAddr(device, "vkGetDeviceGroupPresentCapabilitiesKHR"));
		vkGetDeviceGroupSurfacePresentModesKHR =
		    PFN_vkGetDeviceGroupSurfacePresentModesKHR(vkGetDeviceProcAddr(device, "vkGetDeviceGroupSurfacePresentModesKHR"));
		vkAcquireNextImage2KHR = PFN_vkAcquireNextImage2KHR(vkGetDeviceProcAddr(device, "vkAcquireNextImage2KHR"));

		//=== VK_KHR_display_swapchain ===
		vkCreateSharedSwapchainsKHR = PFN_vkCreateSharedSwapchainsKHR(vkGetDeviceProcAddr(device, "vkCreateSharedSwapchainsKHR"));

		//=== VK_KHR_draw_indirect_count ===
		vkCmdDrawIndirectCountKHR = PFN_vkCmdDrawIndirectCountKHR(vkGetDeviceProcAddr(device, "vkCmdDrawIndirectCountKHR"));
		if(!vkCmdDrawIndirectCount)
			vkCmdDrawIndirectCount = vkCmdDrawIndirectCountKHR;
		vkCmdDrawIndexedIndirectCountKHR = PFN_vkCmdDrawIndexedIndirectCountKHR(vkGetDeviceProcAddr(device, "vkCmdDrawIndexedIndirectCountKHR"));
		if(!vkCmdDrawIndexedIndirectCount)
			vkCmdDrawIndexedIndirectCount = vkCmdDrawIndexedIndirectCountKHR;

		//=== VK_KHR_dynamic_rendering ===
		vkCmdBeginRenderingKHR = PFN_vkCmdBeginRenderingKHR(vkGetDeviceProcAddr(device, "vkCmdBeginRenderingKHR"));
		if(!vkCmdBeginRendering)
			vkCmdBeginRendering = vkCmdBeginRenderingKHR;
		vkCmdEndRenderingKHR = PFN_vkCmdEndRenderingKHR(vkGetDeviceProcAddr(device, "vkCmdEndRenderingKHR"));
		if(!vkCmdEndRendering)
			vkCmdEndRendering = vkCmdEndRenderingKHR;

		//=== VK_KHR_external_fence_fd ===
		vkImportFenceFdKHR = PFN_vkImportFenceFdKHR(vkGetDeviceProcAddr(device, "vkImportFenceFdKHR"));
		vkGetFenceFdKHR = PFN_vkGetFenceFdKHR(vkGetDeviceProcAddr(device, "vkGetFenceFdKHR"));

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
		//=== VK_KHR_external_fence_win32 ===
		vkImportFenceWin32HandleKHR = PFN_vkImportFenceWin32HandleKHR(vkGetDeviceProcAddr(device, "vkImportFenceWin32HandleKHR"));
		vkGetFenceWin32HandleKHR = PFN_vkGetFenceWin32HandleKHR(vkGetDeviceProcAddr(device, "vkGetFenceWin32HandleKHR"));
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

		//=== VK_KHR_external_memory_fd ===
		vkGetMemoryFdKHR = PFN_vkGetMemoryFdKHR(vkGetDeviceProcAddr(device, "vkGetMemoryFdKHR"));
		vkGetMemoryFdPropertiesKHR = PFN_vkGetMemoryFdPropertiesKHR(vkGetDeviceProcAddr(device, "vkGetMemoryFdPropertiesKHR"));

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
		//=== VK_KHR_external_memory_win32 ===
		vkGetMemoryWin32HandleKHR = PFN_vkGetMemoryWin32HandleKHR(vkGetDeviceProcAddr(device, "vkGetMemoryWin32HandleKHR"));
		vkGetMemoryWin32HandlePropertiesKHR = PFN_vkGetMemoryWin32HandlePropertiesKHR(vkGetDeviceProcAddr(device, "vkGetMemoryWin32HandlePropertiesKHR"));
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

		//=== VK_KHR_external_semaphore_fd ===
		vkImportSemaphoreFdKHR = PFN_vkImportSemaphoreFdKHR(vkGetDeviceProcAddr(device, "vkImportSemaphoreFdKHR"));
		vkGetSemaphoreFdKHR = PFN_vkGetSemaphoreFdKHR(vkGetDeviceProcAddr(device, "vkGetSemaphoreFdKHR"));

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
		//=== VK_KHR_external_semaphore_win32 ===
		vkImportSemaphoreWin32HandleKHR = PFN_vkImportSemaphoreWin32HandleKHR(vkGetDeviceProcAddr(device, "vkImportSemaphoreWin32HandleKHR"));
		vkGetSemaphoreWin32HandleKHR = PFN_vkGetSemaphoreWin32HandleKHR(vkGetDeviceProcAddr(device, "vkGetSemaphoreWin32HandleKHR"));
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

		//=== VK_KHR_fragment_shading_rate ===
		vkCmdSetFragmentShadingRateKHR = PFN_vkCmdSetFragmentShadingRateKHR(vkGetDeviceProcAddr(device, "vkCmdSetFragmentShadingRateKHR"));

		//=== VK_KHR_get_memory_requirements2 ===
		vkGetImageMemoryRequirements2KHR = PFN_vkGetImageMemoryRequirements2KHR(vkGetDeviceProcAddr(device, "vkGetImageMemoryRequirements2KHR"));
		if(!vkGetImageMemoryRequirements2)
			vkGetImageMemoryRequirements2 = vkGetImageMemoryRequirements2KHR;
		vkGetBufferMemoryRequirements2KHR = PFN_vkGetBufferMemoryRequirements2KHR(vkGetDeviceProcAddr(device, "vkGetBufferMemoryRequirements2KHR"));
		if(!vkGetBufferMemoryRequirements2)
			vkGetBufferMemoryRequirements2 = vkGetBufferMemoryRequirements2KHR;
		vkGetImageSparseMemoryRequirements2KHR =
		    PFN_vkGetImageSparseMemoryRequirements2KHR(vkGetDeviceProcAddr(device, "vkGetImageSparseMemoryRequirements2KHR"));
		if(!vkGetImageSparseMemoryRequirements2)
			vkGetImageSparseMemoryRequirements2 = vkGetImageSparseMemoryRequirements2KHR;

		//=== VK_KHR_maintenance1 ===
		vkTrimCommandPoolKHR = PFN_vkTrimCommandPoolKHR(vkGetDeviceProcAddr(device, "vkTrimCommandPoolKHR"));
		if(!vkTrimCommandPool)
			vkTrimCommandPool = vkTrimCommandPoolKHR;

		//=== VK_KHR_maintenance3 ===
		vkGetDescriptorSetLayoutSupportKHR = PFN_vkGetDescriptorSetLayoutSupportKHR(vkGetDeviceProcAddr(device, "vkGetDescriptorSetLayoutSupportKHR"));
		if(!vkGetDescriptorSetLayoutSupport)
			vkGetDescriptorSetLayoutSupport = vkGetDescriptorSetLayoutSupportKHR;

		//=== VK_KHR_maintenance4 ===
		vkGetDeviceBufferMemoryRequirementsKHR =
		    PFN_vkGetDeviceBufferMemoryRequirementsKHR(vkGetDeviceProcAddr(device, "vkGetDeviceBufferMemoryRequirementsKHR"));
		if(!vkGetDeviceBufferMemoryRequirements)
			vkGetDeviceBufferMemoryRequirements = vkGetDeviceBufferMemoryRequirementsKHR;
		vkGetDeviceImageMemoryRequirementsKHR =
		    PFN_vkGetDeviceImageMemoryRequirementsKHR(vkGetDeviceProcAddr(device, "vkGetDeviceImageMemoryRequirementsKHR"));
		if(!vkGetDeviceImageMemoryRequirements)
			vkGetDeviceImageMemoryRequirements = vkGetDeviceImageMemoryRequirementsKHR;
		vkGetDeviceImageSparseMemoryRequirementsKHR =
		    PFN_vkGetDeviceImageSparseMemoryRequirementsKHR(vkGetDeviceProcAddr(device, "vkGetDeviceImageSparseMemoryRequirementsKHR"));
		if(!vkGetDeviceImageSparseMemoryRequirements)
			vkGetDeviceImageSparseMemoryRequirements = vkGetDeviceImageSparseMemoryRequirementsKHR;

		//=== VK_KHR_performance_query ===
		vkAcquireProfilingLockKHR = PFN_vkAcquireProfilingLockKHR(vkGetDeviceProcAddr(device, "vkAcquireProfilingLockKHR"));
		vkReleaseProfilingLockKHR = PFN_vkReleaseProfilingLockKHR(vkGetDeviceProcAddr(device, "vkReleaseProfilingLockKHR"));

		//=== VK_KHR_pipeline_executable_properties ===
		vkGetPipelineExecutablePropertiesKHR =
		    PFN_vkGetPipelineExecutablePropertiesKHR(vkGetDeviceProcAddr(device, "vkGetPipelineExecutablePropertiesKHR"));
		vkGetPipelineExecutableStatisticsKHR =
		    PFN_vkGetPipelineExecutableStatisticsKHR(vkGetDeviceProcAddr(device, "vkGetPipelineExecutableStatisticsKHR"));
		vkGetPipelineExecutableInternalRepresentationsKHR =
		    PFN_vkGetPipelineExecutableInternalRepresentationsKHR(vkGetDeviceProcAddr(device, "vkGetPipelineExecutableInternalRepresentationsKHR"));

		//=== VK_KHR_present_wait ===
		vkWaitForPresentKHR = PFN_vkWaitForPresentKHR(vkGetDeviceProcAddr(device, "vkWaitForPresentKHR"));

		//=== VK_KHR_push_descriptor ===
		vkCmdPushDescriptorSetKHR = PFN_vkCmdPushDescriptorSetKHR(vkGetDeviceProcAddr(device, "vkCmdPushDescriptorSetKHR"));

		//=== VK_KHR_ray_tracing_pipeline ===
		vkCmdTraceRaysKHR = PFN_vkCmdTraceRaysKHR(vkGetDeviceProcAddr(device, "vkCmdTraceRaysKHR"));
		vkCreateRayTracingPipelinesKHR = PFN_vkCreateRayTracingPipelinesKHR(vkGetDeviceProcAddr(device, "vkCreateRayTracingPipelinesKHR"));
		vkGetRayTracingShaderGroupHandlesKHR =
		    PFN_vkGetRayTracingShaderGroupHandlesKHR(vkGetDeviceProcAddr(device, "vkGetRayTracingShaderGroupHandlesKHR"));
		vkGetRayTracingCaptureReplayShaderGroupHandlesKHR =
		    PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(vkGetDeviceProcAddr(device, "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR"));
		vkCmdTraceRaysIndirectKHR = PFN_vkCmdTraceRaysIndirectKHR(vkGetDeviceProcAddr(device, "vkCmdTraceRaysIndirectKHR"));
		vkGetRayTracingShaderGroupStackSizeKHR =
		    PFN_vkGetRayTracingShaderGroupStackSizeKHR(vkGetDeviceProcAddr(device, "vkGetRayTracingShaderGroupStackSizeKHR"));
		vkCmdSetRayTracingPipelineStackSizeKHR =
		    PFN_vkCmdSetRayTracingPipelineStackSizeKHR(vkGetDeviceProcAddr(device, "vkCmdSetRayTracingPipelineStackSizeKHR"));

		//=== VK_KHR_sampler_ycbcr_conversion ===
		vkCreateSamplerYcbcrConversionKHR = PFN_vkCreateSamplerYcbcrConversionKHR(vkGetDeviceProcAddr(device, "vkCreateSamplerYcbcrConversionKHR"));
		if(!vkCreateSamplerYcbcrConversion)
			vkCreateSamplerYcbcrConversion = vkCreateSamplerYcbcrConversionKHR;
		vkDestroySamplerYcbcrConversionKHR = PFN_vkDestroySamplerYcbcrConversionKHR(vkGetDeviceProcAddr(device, "vkDestroySamplerYcbcrConversionKHR"));
		if(!vkDestroySamplerYcbcrConversion)
			vkDestroySamplerYcbcrConversion = vkDestroySamplerYcbcrConversionKHR;

		//=== VK_KHR_shared_presentable_image ===
		vkGetSwapchainStatusKHR = PFN_vkGetSwapchainStatusKHR(vkGetDeviceProcAddr(device, "vkGetSwapchainStatusKHR"));

		//=== VK_KHR_swapchain ===
		vkCreateSwapchainKHR = PFN_vkCreateSwapchainKHR(vkGetDeviceProcAddr(device, "vkCreateSwapchainKHR"));
		vkDestroySwapchainKHR = PFN_vkDestroySwapchainKHR(vkGetDeviceProcAddr(device, "vkDestroySwapchainKHR"));
		vkGetSwapchainImagesKHR = PFN_vkGetSwapchainImagesKHR(vkGetDeviceProcAddr(device, "vkGetSwapchainImagesKHR"));
		vkAcquireNextImageKHR = PFN_vkAcquireNextImageKHR(vkGetDeviceProcAddr(device, "vkAcquireNextImageKHR"));
		vkQueuePresentKHR = PFN_vkQueuePresentKHR(vkGetDeviceProcAddr(device, "vkQueuePresentKHR"));

		//=== VK_KHR_synchronization2 ===
		vkCmdSetEvent2KHR = PFN_vkCmdSetEvent2KHR(vkGetDeviceProcAddr(device, "vkCmdSetEvent2KHR"));
		if(!vkCmdSetEvent2)
			vkCmdSetEvent2 = vkCmdSetEvent2KHR;
		vkCmdResetEvent2KHR = PFN_vkCmdResetEvent2KHR(vkGetDeviceProcAddr(device, "vkCmdResetEvent2KHR"));
		if(!vkCmdResetEvent2)
			vkCmdResetEvent2 = vkCmdResetEvent2KHR;
		vkCmdWaitEvents2KHR = PFN_vkCmdWaitEvents2KHR(vkGetDeviceProcAddr(device, "vkCmdWaitEvents2KHR"));
		if(!vkCmdWaitEvents2)
			vkCmdWaitEvents2 = vkCmdWaitEvents2KHR;
		vkCmdPipelineBarrier2KHR = PFN_vkCmdPipelineBarrier2KHR(vkGetDeviceProcAddr(device, "vkCmdPipelineBarrier2KHR"));
		if(!vkCmdPipelineBarrier2)
			vkCmdPipelineBarrier2 = vkCmdPipelineBarrier2KHR;
		vkCmdWriteTimestamp2KHR = PFN_vkCmdWriteTimestamp2KHR(vkGetDeviceProcAddr(device, "vkCmdWriteTimestamp2KHR"));
		if(!vkCmdWriteTimestamp2)
			vkCmdWriteTimestamp2 = vkCmdWriteTimestamp2KHR;
		vkQueueSubmit2KHR = PFN_vkQueueSubmit2KHR(vkGetDeviceProcAddr(device, "vkQueueSubmit2KHR"));
		if(!vkQueueSubmit2)
			vkQueueSubmit2 = vkQueueSubmit2KHR;
		vkCmdWriteBufferMarker2AMD = PFN_vkCmdWriteBufferMarker2AMD(vkGetDeviceProcAddr(device, "vkCmdWriteBufferMarker2AMD"));
		vkGetQueueCheckpointData2NV = PFN_vkGetQueueCheckpointData2NV(vkGetDeviceProcAddr(device, "vkGetQueueCheckpointData2NV"));

		//=== VK_KHR_timeline_semaphore ===
		vkGetSemaphoreCounterValueKHR = PFN_vkGetSemaphoreCounterValueKHR(vkGetDeviceProcAddr(device, "vkGetSemaphoreCounterValueKHR"));
		if(!vkGetSemaphoreCounterValue)
			vkGetSemaphoreCounterValue = vkGetSemaphoreCounterValueKHR;
		vkWaitSemaphoresKHR = PFN_vkWaitSemaphoresKHR(vkGetDeviceProcAddr(device, "vkWaitSemaphoresKHR"));
		if(!vkWaitSemaphores)
			vkWaitSemaphores = vkWaitSemaphoresKHR;
		vkSignalSemaphoreKHR = PFN_vkSignalSemaphoreKHR(vkGetDeviceProcAddr(device, "vkSignalSemaphoreKHR"));
		if(!vkSignalSemaphore)
			vkSignalSemaphore = vkSignalSemaphoreKHR;

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
		//=== VK_KHR_video_decode_queue ===
		vkCmdDecodeVideoKHR = PFN_vkCmdDecodeVideoKHR(vkGetDeviceProcAddr(device, "vkCmdDecodeVideoKHR"));
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
		//=== VK_KHR_video_encode_queue ===
		vkCmdEncodeVideoKHR = PFN_vkCmdEncodeVideoKHR(vkGetDeviceProcAddr(device, "vkCmdEncodeVideoKHR"));
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
		//=== VK_KHR_video_queue ===
		vkCreateVideoSessionKHR = PFN_vkCreateVideoSessionKHR(vkGetDeviceProcAddr(device, "vkCreateVideoSessionKHR"));
		vkDestroyVideoSessionKHR = PFN_vkDestroyVideoSessionKHR(vkGetDeviceProcAddr(device, "vkDestroyVideoSessionKHR"));
		vkGetVideoSessionMemoryRequirementsKHR =
		    PFN_vkGetVideoSessionMemoryRequirementsKHR(vkGetDeviceProcAddr(device, "vkGetVideoSessionMemoryRequirementsKHR"));
		vkBindVideoSessionMemoryKHR = PFN_vkBindVideoSessionMemoryKHR(vkGetDeviceProcAddr(device, "vkBindVideoSessionMemoryKHR"));
		vkCreateVideoSessionParametersKHR = PFN_vkCreateVideoSessionParametersKHR(vkGetDeviceProcAddr(device, "vkCreateVideoSessionParametersKHR"));
		vkUpdateVideoSessionParametersKHR = PFN_vkUpdateVideoSessionParametersKHR(vkGetDeviceProcAddr(device, "vkUpdateVideoSessionParametersKHR"));
		vkDestroyVideoSessionParametersKHR = PFN_vkDestroyVideoSessionParametersKHR(vkGetDeviceProcAddr(device, "vkDestroyVideoSessionParametersKHR"));
		vkCmdBeginVideoCodingKHR = PFN_vkCmdBeginVideoCodingKHR(vkGetDeviceProcAddr(device, "vkCmdBeginVideoCodingKHR"));
		vkCmdEndVideoCodingKHR = PFN_vkCmdEndVideoCodingKHR(vkGetDeviceProcAddr(device, "vkCmdEndVideoCodingKHR"));
		vkCmdControlVideoCodingKHR = PFN_vkCmdControlVideoCodingKHR(vkGetDeviceProcAddr(device, "vkCmdControlVideoCodingKHR"));
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

		//=== VK_NVX_binary_import ===
		vkCreateCuModuleNVX = PFN_vkCreateCuModuleNVX(vkGetDeviceProcAddr(device, "vkCreateCuModuleNVX"));
		vkCreateCuFunctionNVX = PFN_vkCreateCuFunctionNVX(vkGetDeviceProcAddr(device, "vkCreateCuFunctionNVX"));
		vkDestroyCuModuleNVX = PFN_vkDestroyCuModuleNVX(vkGetDeviceProcAddr(device, "vkDestroyCuModuleNVX"));
		vkDestroyCuFunctionNVX = PFN_vkDestroyCuFunctionNVX(vkGetDeviceProcAddr(device, "vkDestroyCuFunctionNVX"));
		vkCmdCuLaunchKernelNVX = PFN_vkCmdCuLaunchKernelNVX(vkGetDeviceProcAddr(device, "vkCmdCuLaunchKernelNVX"));

		//=== VK_NVX_image_view_handle ===
		vkGetImageViewHandleNVX = PFN_vkGetImageViewHandleNVX(vkGetDeviceProcAddr(device, "vkGetImageViewHandleNVX"));
		vkGetImageViewAddressNVX = PFN_vkGetImageViewAddressNVX(vkGetDeviceProcAddr(device, "vkGetImageViewAddressNVX"));

		//=== VK_NV_clip_space_w_scaling ===
		vkCmdSetViewportWScalingNV = PFN_vkCmdSetViewportWScalingNV(vkGetDeviceProcAddr(device, "vkCmdSetViewportWScalingNV"));

		//=== VK_NV_device_diagnostic_checkpoints ===
		vkCmdSetCheckpointNV = PFN_vkCmdSetCheckpointNV(vkGetDeviceProcAddr(device, "vkCmdSetCheckpointNV"));
		vkGetQueueCheckpointDataNV = PFN_vkGetQueueCheckpointDataNV(vkGetDeviceProcAddr(device, "vkGetQueueCheckpointDataNV"));

		//=== VK_NV_device_generated_commands ===
		vkGetGeneratedCommandsMemoryRequirementsNV =
		    PFN_vkGetGeneratedCommandsMemoryRequirementsNV(vkGetDeviceProcAddr(device, "vkGetGeneratedCommandsMemoryRequirementsNV"));
		vkCmdPreprocessGeneratedCommandsNV = PFN_vkCmdPreprocessGeneratedCommandsNV(vkGetDeviceProcAddr(device, "vkCmdPreprocessGeneratedCommandsNV"));
		vkCmdExecuteGeneratedCommandsNV = PFN_vkCmdExecuteGeneratedCommandsNV(vkGetDeviceProcAddr(device, "vkCmdExecuteGeneratedCommandsNV"));
		vkCmdBindPipelineShaderGroupNV = PFN_vkCmdBindPipelineShaderGroupNV(vkGetDeviceProcAddr(device, "vkCmdBindPipelineShaderGroupNV"));
		vkCreateIndirectCommandsLayoutNV = PFN_vkCreateIndirectCommandsLayoutNV(vkGetDeviceProcAddr(device, "vkCreateIndirectCommandsLayoutNV"));
		vkDestroyIndirectCommandsLayoutNV = PFN_vkDestroyIndirectCommandsLayoutNV(vkGetDeviceProcAddr(device, "vkDestroyIndirectCommandsLayoutNV"));

		//=== VK_NV_external_memory_rdma ===
		vkGetMemoryRemoteAddressNV = PFN_vkGetMemoryRemoteAddressNV(vkGetDeviceProcAddr(device, "vkGetMemoryRemoteAddressNV"));

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
		//=== VK_NV_external_memory_win32 ===
		vkGetMemoryWin32HandleNV = PFN_vkGetMemoryWin32HandleNV(vkGetDeviceProcAddr(device, "vkGetMemoryWin32HandleNV"));
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

		//=== VK_NV_fragment_shading_rate_enums ===
		vkCmdSetFragmentShadingRateEnumNV = PFN_vkCmdSetFragmentShadingRateEnumNV(vkGetDeviceProcAddr(device, "vkCmdSetFragmentShadingRateEnumNV"));

		//=== VK_NV_mesh_shader ===
		vkCmdDrawMeshTasksNV = PFN_vkCmdDrawMeshTasksNV(vkGetDeviceProcAddr(device, "vkCmdDrawMeshTasksNV"));
		vkCmdDrawMeshTasksIndirectNV = PFN_vkCmdDrawMeshTasksIndirectNV(vkGetDeviceProcAddr(device, "vkCmdDrawMeshTasksIndirectNV"));
		vkCmdDrawMeshTasksIndirectCountNV = PFN_vkCmdDrawMeshTasksIndirectCountNV(vkGetDeviceProcAddr(device, "vkCmdDrawMeshTasksIndirectCountNV"));

		//=== VK_NV_ray_tracing ===
		vkCreateAccelerationStructureNV = PFN_vkCreateAccelerationStructureNV(vkGetDeviceProcAddr(device, "vkCreateAccelerationStructureNV"));
		vkDestroyAccelerationStructureNV = PFN_vkDestroyAccelerationStructureNV(vkGetDeviceProcAddr(device, "vkDestroyAccelerationStructureNV"));
		vkGetAccelerationStructureMemoryRequirementsNV =
		    PFN_vkGetAccelerationStructureMemoryRequirementsNV(vkGetDeviceProcAddr(device, "vkGetAccelerationStructureMemoryRequirementsNV"));
		vkBindAccelerationStructureMemoryNV = PFN_vkBindAccelerationStructureMemoryNV(vkGetDeviceProcAddr(device, "vkBindAccelerationStructureMemoryNV"));
		vkCmdBuildAccelerationStructureNV = PFN_vkCmdBuildAccelerationStructureNV(vkGetDeviceProcAddr(device, "vkCmdBuildAccelerationStructureNV"));
		vkCmdCopyAccelerationStructureNV = PFN_vkCmdCopyAccelerationStructureNV(vkGetDeviceProcAddr(device, "vkCmdCopyAccelerationStructureNV"));
		vkCmdTraceRaysNV = PFN_vkCmdTraceRaysNV(vkGetDeviceProcAddr(device, "vkCmdTraceRaysNV"));
		vkCreateRayTracingPipelinesNV = PFN_vkCreateRayTracingPipelinesNV(vkGetDeviceProcAddr(device, "vkCreateRayTracingPipelinesNV"));
		vkGetRayTracingShaderGroupHandlesNV = PFN_vkGetRayTracingShaderGroupHandlesNV(vkGetDeviceProcAddr(device, "vkGetRayTracingShaderGroupHandlesNV"));
		if(!vkGetRayTracingShaderGroupHandlesKHR)
			vkGetRayTracingShaderGroupHandlesKHR = vkGetRayTracingShaderGroupHandlesNV;
		vkGetAccelerationStructureHandleNV = PFN_vkGetAccelerationStructureHandleNV(vkGetDeviceProcAddr(device, "vkGetAccelerationStructureHandleNV"));
		vkCmdWriteAccelerationStructuresPropertiesNV =
		    PFN_vkCmdWriteAccelerationStructuresPropertiesNV(vkGetDeviceProcAddr(device, "vkCmdWriteAccelerationStructuresPropertiesNV"));
		vkCompileDeferredNV = PFN_vkCompileDeferredNV(vkGetDeviceProcAddr(device, "vkCompileDeferredNV"));

		//=== VK_NV_scissor_exclusive ===
		vkCmdSetExclusiveScissorNV = PFN_vkCmdSetExclusiveScissorNV(vkGetDeviceProcAddr(device, "vkCmdSetExclusiveScissorNV"));

		//=== VK_NV_shading_rate_image ===
		vkCmdBindShadingRateImageNV = PFN_vkCmdBindShadingRateImageNV(vkGetDeviceProcAddr(device, "vkCmdBindShadingRateImageNV"));
		vkCmdSetViewportShadingRatePaletteNV =
		    PFN_vkCmdSetViewportShadingRatePaletteNV(vkGetDeviceProcAddr(device, "vkCmdSetViewportShadingRatePaletteNV"));
		vkCmdSetCoarseSampleOrderNV = PFN_vkCmdSetCoarseSampleOrderNV(vkGetDeviceProcAddr(device, "vkCmdSetCoarseSampleOrderNV"));

		//=== VK_VALVE_descriptor_set_host_mapping ===
		vkGetDescriptorSetLayoutHostMappingInfoVALVE =
		    PFN_vkGetDescriptorSetLayoutHostMappingInfoVALVE(vkGetDeviceProcAddr(device, "vkGetDescriptorSetLayoutHostMappingInfoVALVE"));
		vkGetDescriptorSetHostMappingVALVE = PFN_vkGetDescriptorSetHostMappingVALVE(vkGetDeviceProcAddr(device, "vkGetDescriptorSetHostMappingVALVE"));
	}

public:
	//=== VK_VERSION_1_0 ===
	PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr = 0;
	PFN_vkDestroyDevice vkDestroyDevice = 0;
	PFN_vkGetDeviceQueue vkGetDeviceQueue = 0;
	PFN_vkQueueSubmit vkQueueSubmit = 0;
	PFN_vkQueueWaitIdle vkQueueWaitIdle = 0;
	PFN_vkDeviceWaitIdle vkDeviceWaitIdle = 0;
	PFN_vkAllocateMemory vkAllocateMemory = 0;
	PFN_vkFreeMemory vkFreeMemory = 0;
	PFN_vkMapMemory vkMapMemory = 0;
	PFN_vkUnmapMemory vkUnmapMemory = 0;
	PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges = 0;
	PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges = 0;
	PFN_vkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitment = 0;
	PFN_vkBindBufferMemory vkBindBufferMemory = 0;
	PFN_vkBindImageMemory vkBindImageMemory = 0;
	PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements = 0;
	PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements = 0;
	PFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements = 0;
	PFN_vkQueueBindSparse vkQueueBindSparse = 0;
	PFN_vkCreateFence vkCreateFence = 0;
	PFN_vkDestroyFence vkDestroyFence = 0;
	PFN_vkResetFences vkResetFences = 0;
	PFN_vkGetFenceStatus vkGetFenceStatus = 0;
	PFN_vkWaitForFences vkWaitForFences = 0;
	PFN_vkCreateSemaphore vkCreateSemaphore = 0;
	PFN_vkDestroySemaphore vkDestroySemaphore = 0;
	PFN_vkCreateEvent vkCreateEvent = 0;
	PFN_vkDestroyEvent vkDestroyEvent = 0;
	PFN_vkGetEventStatus vkGetEventStatus = 0;
	PFN_vkSetEvent vkSetEvent = 0;
	PFN_vkResetEvent vkResetEvent = 0;
	PFN_vkCreateQueryPool vkCreateQueryPool = 0;
	PFN_vkDestroyQueryPool vkDestroyQueryPool = 0;
	PFN_vkGetQueryPoolResults vkGetQueryPoolResults = 0;
	PFN_vkCreateBuffer vkCreateBuffer = 0;
	PFN_vkDestroyBuffer vkDestroyBuffer = 0;
	PFN_vkCreateBufferView vkCreateBufferView = 0;
	PFN_vkDestroyBufferView vkDestroyBufferView = 0;
	PFN_vkCreateImage vkCreateImage = 0;
	PFN_vkDestroyImage vkDestroyImage = 0;
	PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout = 0;
	PFN_vkCreateImageView vkCreateImageView = 0;
	PFN_vkDestroyImageView vkDestroyImageView = 0;
	PFN_vkCreateShaderModule vkCreateShaderModule = 0;
	PFN_vkDestroyShaderModule vkDestroyShaderModule = 0;
	PFN_vkCreatePipelineCache vkCreatePipelineCache = 0;
	PFN_vkDestroyPipelineCache vkDestroyPipelineCache = 0;
	PFN_vkGetPipelineCacheData vkGetPipelineCacheData = 0;
	PFN_vkMergePipelineCaches vkMergePipelineCaches = 0;
	PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines = 0;
	PFN_vkCreateComputePipelines vkCreateComputePipelines = 0;
	PFN_vkDestroyPipeline vkDestroyPipeline = 0;
	PFN_vkCreatePipelineLayout vkCreatePipelineLayout = 0;
	PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout = 0;
	PFN_vkCreateSampler vkCreateSampler = 0;
	PFN_vkDestroySampler vkDestroySampler = 0;
	PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout = 0;
	PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout = 0;
	PFN_vkCreateDescriptorPool vkCreateDescriptorPool = 0;
	PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool = 0;
	PFN_vkResetDescriptorPool vkResetDescriptorPool = 0;
	PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets = 0;
	PFN_vkFreeDescriptorSets vkFreeDescriptorSets = 0;
	PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets = 0;
	PFN_vkCreateFramebuffer vkCreateFramebuffer = 0;
	PFN_vkDestroyFramebuffer vkDestroyFramebuffer = 0;
	PFN_vkCreateRenderPass vkCreateRenderPass = 0;
	PFN_vkDestroyRenderPass vkDestroyRenderPass = 0;
	PFN_vkGetRenderAreaGranularity vkGetRenderAreaGranularity = 0;
	PFN_vkCreateCommandPool vkCreateCommandPool = 0;
	PFN_vkDestroyCommandPool vkDestroyCommandPool = 0;
	PFN_vkResetCommandPool vkResetCommandPool = 0;
	PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers = 0;
	PFN_vkFreeCommandBuffers vkFreeCommandBuffers = 0;
	PFN_vkBeginCommandBuffer vkBeginCommandBuffer = 0;
	PFN_vkEndCommandBuffer vkEndCommandBuffer = 0;
	PFN_vkResetCommandBuffer vkResetCommandBuffer = 0;
	PFN_vkCmdBindPipeline vkCmdBindPipeline = 0;
	PFN_vkCmdSetViewport vkCmdSetViewport = 0;
	PFN_vkCmdSetScissor vkCmdSetScissor = 0;
	PFN_vkCmdSetLineWidth vkCmdSetLineWidth = 0;
	PFN_vkCmdSetDepthBias vkCmdSetDepthBias = 0;
	PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants = 0;
	PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds = 0;
	PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask = 0;
	PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask = 0;
	PFN_vkCmdSetStencilReference vkCmdSetStencilReference = 0;
	PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets = 0;
	PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer = 0;
	PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers = 0;
	PFN_vkCmdDraw vkCmdDraw = 0;
	PFN_vkCmdDrawIndexed vkCmdDrawIndexed = 0;
	PFN_vkCmdDrawIndirect vkCmdDrawIndirect = 0;
	PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect = 0;
	PFN_vkCmdDispatch vkCmdDispatch = 0;
	PFN_vkCmdDispatchIndirect vkCmdDispatchIndirect = 0;
	PFN_vkCmdCopyBuffer vkCmdCopyBuffer = 0;
	PFN_vkCmdCopyImage vkCmdCopyImage = 0;
	PFN_vkCmdBlitImage vkCmdBlitImage = 0;
	PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage = 0;
	PFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer = 0;
	PFN_vkCmdUpdateBuffer vkCmdUpdateBuffer = 0;
	PFN_vkCmdFillBuffer vkCmdFillBuffer = 0;
	PFN_vkCmdClearColorImage vkCmdClearColorImage = 0;
	PFN_vkCmdClearDepthStencilImage vkCmdClearDepthStencilImage = 0;
	PFN_vkCmdClearAttachments vkCmdClearAttachments = 0;
	PFN_vkCmdResolveImage vkCmdResolveImage = 0;
	PFN_vkCmdSetEvent vkCmdSetEvent = 0;
	PFN_vkCmdResetEvent vkCmdResetEvent = 0;
	PFN_vkCmdWaitEvents vkCmdWaitEvents = 0;
	PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier = 0;
	PFN_vkCmdBeginQuery vkCmdBeginQuery = 0;
	PFN_vkCmdEndQuery vkCmdEndQuery = 0;
	PFN_vkCmdResetQueryPool vkCmdResetQueryPool = 0;
	PFN_vkCmdWriteTimestamp vkCmdWriteTimestamp = 0;
	PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults = 0;
	PFN_vkCmdPushConstants vkCmdPushConstants = 0;
	PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass = 0;
	PFN_vkCmdNextSubpass vkCmdNextSubpass = 0;
	PFN_vkCmdEndRenderPass vkCmdEndRenderPass = 0;
	PFN_vkCmdExecuteCommands vkCmdExecuteCommands = 0;

	//=== VK_VERSION_1_1 ===
	PFN_vkBindBufferMemory2 vkBindBufferMemory2 = 0;
	PFN_vkBindImageMemory2 vkBindImageMemory2 = 0;
	PFN_vkGetDeviceGroupPeerMemoryFeatures vkGetDeviceGroupPeerMemoryFeatures = 0;
	PFN_vkCmdSetDeviceMask vkCmdSetDeviceMask = 0;
	PFN_vkCmdDispatchBase vkCmdDispatchBase = 0;
	PFN_vkGetImageMemoryRequirements2 vkGetImageMemoryRequirements2 = 0;
	PFN_vkGetBufferMemoryRequirements2 vkGetBufferMemoryRequirements2 = 0;
	PFN_vkGetImageSparseMemoryRequirements2 vkGetImageSparseMemoryRequirements2 = 0;
	PFN_vkTrimCommandPool vkTrimCommandPool = 0;
	PFN_vkGetDeviceQueue2 vkGetDeviceQueue2 = 0;
	PFN_vkCreateSamplerYcbcrConversion vkCreateSamplerYcbcrConversion = 0;
	PFN_vkDestroySamplerYcbcrConversion vkDestroySamplerYcbcrConversion = 0;
	PFN_vkCreateDescriptorUpdateTemplate vkCreateDescriptorUpdateTemplate = 0;
	PFN_vkDestroyDescriptorUpdateTemplate vkDestroyDescriptorUpdateTemplate = 0;
	PFN_vkUpdateDescriptorSetWithTemplate vkUpdateDescriptorSetWithTemplate = 0;
	PFN_vkGetDescriptorSetLayoutSupport vkGetDescriptorSetLayoutSupport = 0;

	//=== VK_VERSION_1_2 ===
	PFN_vkCmdDrawIndirectCount vkCmdDrawIndirectCount = 0;
	PFN_vkCmdDrawIndexedIndirectCount vkCmdDrawIndexedIndirectCount = 0;
	PFN_vkCreateRenderPass2 vkCreateRenderPass2 = 0;
	PFN_vkCmdBeginRenderPass2 vkCmdBeginRenderPass2 = 0;
	PFN_vkCmdNextSubpass2 vkCmdNextSubpass2 = 0;
	PFN_vkCmdEndRenderPass2 vkCmdEndRenderPass2 = 0;
	PFN_vkResetQueryPool vkResetQueryPool = 0;
	PFN_vkGetSemaphoreCounterValue vkGetSemaphoreCounterValue = 0;
	PFN_vkWaitSemaphores vkWaitSemaphores = 0;
	PFN_vkSignalSemaphore vkSignalSemaphore = 0;
	PFN_vkGetBufferDeviceAddress vkGetBufferDeviceAddress = 0;
	PFN_vkGetBufferOpaqueCaptureAddress vkGetBufferOpaqueCaptureAddress = 0;
	PFN_vkGetDeviceMemoryOpaqueCaptureAddress vkGetDeviceMemoryOpaqueCaptureAddress = 0;

	//=== VK_VERSION_1_3 ===
	PFN_vkCreatePrivateDataSlot vkCreatePrivateDataSlot = 0;
	PFN_vkDestroyPrivateDataSlot vkDestroyPrivateDataSlot = 0;
	PFN_vkSetPrivateData vkSetPrivateData = 0;
	PFN_vkGetPrivateData vkGetPrivateData = 0;
	PFN_vkCmdSetEvent2 vkCmdSetEvent2 = 0;
	PFN_vkCmdResetEvent2 vkCmdResetEvent2 = 0;
	PFN_vkCmdWaitEvents2 vkCmdWaitEvents2 = 0;
	PFN_vkCmdPipelineBarrier2 vkCmdPipelineBarrier2 = 0;
	PFN_vkCmdWriteTimestamp2 vkCmdWriteTimestamp2 = 0;
	PFN_vkQueueSubmit2 vkQueueSubmit2 = 0;
	PFN_vkCmdCopyBuffer2 vkCmdCopyBuffer2 = 0;
	PFN_vkCmdCopyImage2 vkCmdCopyImage2 = 0;
	PFN_vkCmdCopyBufferToImage2 vkCmdCopyBufferToImage2 = 0;
	PFN_vkCmdCopyImageToBuffer2 vkCmdCopyImageToBuffer2 = 0;
	PFN_vkCmdBlitImage2 vkCmdBlitImage2 = 0;
	PFN_vkCmdResolveImage2 vkCmdResolveImage2 = 0;
	PFN_vkCmdBeginRendering vkCmdBeginRendering = 0;
	PFN_vkCmdEndRendering vkCmdEndRendering = 0;
	PFN_vkCmdSetCullMode vkCmdSetCullMode = 0;
	PFN_vkCmdSetFrontFace vkCmdSetFrontFace = 0;
	PFN_vkCmdSetPrimitiveTopology vkCmdSetPrimitiveTopology = 0;
	PFN_vkCmdSetViewportWithCount vkCmdSetViewportWithCount = 0;
	PFN_vkCmdSetScissorWithCount vkCmdSetScissorWithCount = 0;
	PFN_vkCmdBindVertexBuffers2 vkCmdBindVertexBuffers2 = 0;
	PFN_vkCmdSetDepthTestEnable vkCmdSetDepthTestEnable = 0;
	PFN_vkCmdSetDepthWriteEnable vkCmdSetDepthWriteEnable = 0;
	PFN_vkCmdSetDepthCompareOp vkCmdSetDepthCompareOp = 0;
	PFN_vkCmdSetDepthBoundsTestEnable vkCmdSetDepthBoundsTestEnable = 0;
	PFN_vkCmdSetStencilTestEnable vkCmdSetStencilTestEnable = 0;
	PFN_vkCmdSetStencilOp vkCmdSetStencilOp = 0;
	PFN_vkCmdSetRasterizerDiscardEnable vkCmdSetRasterizerDiscardEnable = 0;
	PFN_vkCmdSetDepthBiasEnable vkCmdSetDepthBiasEnable = 0;
	PFN_vkCmdSetPrimitiveRestartEnable vkCmdSetPrimitiveRestartEnable = 0;
	PFN_vkGetDeviceBufferMemoryRequirements vkGetDeviceBufferMemoryRequirements = 0;
	PFN_vkGetDeviceImageMemoryRequirements vkGetDeviceImageMemoryRequirements = 0;
	PFN_vkGetDeviceImageSparseMemoryRequirements vkGetDeviceImageSparseMemoryRequirements = 0;

	//=== VK_AMD_buffer_marker ===
	PFN_vkCmdWriteBufferMarkerAMD vkCmdWriteBufferMarkerAMD = 0;

	//=== VK_AMD_display_native_hdr ===
	PFN_vkSetLocalDimmingAMD vkSetLocalDimmingAMD = 0;

	//=== VK_AMD_draw_indirect_count ===
	PFN_vkCmdDrawIndirectCountAMD vkCmdDrawIndirectCountAMD = 0;
	PFN_vkCmdDrawIndexedIndirectCountAMD vkCmdDrawIndexedIndirectCountAMD = 0;

	//=== VK_AMD_shader_info ===
	PFN_vkGetShaderInfoAMD vkGetShaderInfoAMD = 0;

#	if defined(VK_USE_PLATFORM_ANDROID_KHR)
	//=== VK_ANDROID_external_memory_android_hardware_buffer ===
	PFN_vkGetAndroidHardwareBufferPropertiesANDROID vkGetAndroidHardwareBufferPropertiesANDROID = 0;
	PFN_vkGetMemoryAndroidHardwareBufferANDROID vkGetMemoryAndroidHardwareBufferANDROID = 0;
#	else
	PFN_dummy vkGetAndroidHardwareBufferPropertiesANDROID_placeholder = 0;
	PFN_dummy vkGetMemoryAndroidHardwareBufferANDROID_placeholder = 0;
#	endif /*VK_USE_PLATFORM_ANDROID_KHR*/

	//=== VK_EXT_buffer_device_address ===
	PFN_vkGetBufferDeviceAddressEXT vkGetBufferDeviceAddressEXT = 0;

	//=== VK_EXT_calibrated_timestamps ===
	PFN_vkGetCalibratedTimestampsEXT vkGetCalibratedTimestampsEXT = 0;

	//=== VK_EXT_color_write_enable ===
	PFN_vkCmdSetColorWriteEnableEXT vkCmdSetColorWriteEnableEXT = 0;

	//=== VK_EXT_conditional_rendering ===
	PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT = 0;
	PFN_vkCmdEndConditionalRenderingEXT vkCmdEndConditionalRenderingEXT = 0;

	//=== VK_EXT_debug_marker ===
	PFN_vkDebugMarkerSetObjectTagEXT vkDebugMarkerSetObjectTagEXT = 0;
	PFN_vkDebugMarkerSetObjectNameEXT vkDebugMarkerSetObjectNameEXT = 0;
	PFN_vkCmdDebugMarkerBeginEXT vkCmdDebugMarkerBeginEXT = 0;
	PFN_vkCmdDebugMarkerEndEXT vkCmdDebugMarkerEndEXT = 0;
	PFN_vkCmdDebugMarkerInsertEXT vkCmdDebugMarkerInsertEXT = 0;

	//=== VK_EXT_debug_utils ===
	PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectNameEXT = 0;
	PFN_vkSetDebugUtilsObjectTagEXT vkSetDebugUtilsObjectTagEXT = 0;
	PFN_vkQueueBeginDebugUtilsLabelEXT vkQueueBeginDebugUtilsLabelEXT = 0;
	PFN_vkQueueEndDebugUtilsLabelEXT vkQueueEndDebugUtilsLabelEXT = 0;
	PFN_vkQueueInsertDebugUtilsLabelEXT vkQueueInsertDebugUtilsLabelEXT = 0;
	PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT = 0;
	PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT = 0;
	PFN_vkCmdInsertDebugUtilsLabelEXT vkCmdInsertDebugUtilsLabelEXT = 0;

	//=== VK_EXT_discard_rectangles ===
	PFN_vkCmdSetDiscardRectangleEXT vkCmdSetDiscardRectangleEXT = 0;

	//=== VK_EXT_display_control ===
	PFN_vkDisplayPowerControlEXT vkDisplayPowerControlEXT = 0;
	PFN_vkRegisterDeviceEventEXT vkRegisterDeviceEventEXT = 0;
	PFN_vkRegisterDisplayEventEXT vkRegisterDisplayEventEXT = 0;
	PFN_vkGetSwapchainCounterEXT vkGetSwapchainCounterEXT = 0;

	//=== VK_EXT_extended_dynamic_state ===
	PFN_vkCmdSetCullModeEXT vkCmdSetCullModeEXT = 0;
	PFN_vkCmdSetFrontFaceEXT vkCmdSetFrontFaceEXT = 0;
	PFN_vkCmdSetPrimitiveTopologyEXT vkCmdSetPrimitiveTopologyEXT = 0;
	PFN_vkCmdSetViewportWithCountEXT vkCmdSetViewportWithCountEXT = 0;
	PFN_vkCmdSetScissorWithCountEXT vkCmdSetScissorWithCountEXT = 0;
	PFN_vkCmdBindVertexBuffers2EXT vkCmdBindVertexBuffers2EXT = 0;
	PFN_vkCmdSetDepthTestEnableEXT vkCmdSetDepthTestEnableEXT = 0;
	PFN_vkCmdSetDepthWriteEnableEXT vkCmdSetDepthWriteEnableEXT = 0;
	PFN_vkCmdSetDepthCompareOpEXT vkCmdSetDepthCompareOpEXT = 0;
	PFN_vkCmdSetDepthBoundsTestEnableEXT vkCmdSetDepthBoundsTestEnableEXT = 0;
	PFN_vkCmdSetStencilTestEnableEXT vkCmdSetStencilTestEnableEXT = 0;
	PFN_vkCmdSetStencilOpEXT vkCmdSetStencilOpEXT = 0;

	//=== VK_EXT_extended_dynamic_state2 ===
	PFN_vkCmdSetPatchControlPointsEXT vkCmdSetPatchControlPointsEXT = 0;
	PFN_vkCmdSetRasterizerDiscardEnableEXT vkCmdSetRasterizerDiscardEnableEXT = 0;
	PFN_vkCmdSetDepthBiasEnableEXT vkCmdSetDepthBiasEnableEXT = 0;
	PFN_vkCmdSetLogicOpEXT vkCmdSetLogicOpEXT = 0;
	PFN_vkCmdSetPrimitiveRestartEnableEXT vkCmdSetPrimitiveRestartEnableEXT = 0;

	//=== VK_EXT_external_memory_host ===
	PFN_vkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXT = 0;

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
	//=== VK_EXT_full_screen_exclusive ===
	PFN_vkAcquireFullScreenExclusiveModeEXT vkAcquireFullScreenExclusiveModeEXT = 0;
	PFN_vkReleaseFullScreenExclusiveModeEXT vkReleaseFullScreenExclusiveModeEXT = 0;
	PFN_vkGetDeviceGroupSurfacePresentModes2EXT vkGetDeviceGroupSurfacePresentModes2EXT = 0;
#	else
	PFN_dummy vkAcquireFullScreenExclusiveModeEXT_placeholder = 0;
	PFN_dummy vkReleaseFullScreenExclusiveModeEXT_placeholder = 0;
	PFN_dummy vkGetDeviceGroupSurfacePresentModes2EXT_placeholder = 0;
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

	//=== VK_EXT_hdr_metadata ===
	PFN_vkSetHdrMetadataEXT vkSetHdrMetadataEXT = 0;

	//=== VK_EXT_host_query_reset ===
	PFN_vkResetQueryPoolEXT vkResetQueryPoolEXT = 0;

	//=== VK_EXT_image_drm_format_modifier ===
	PFN_vkGetImageDrmFormatModifierPropertiesEXT vkGetImageDrmFormatModifierPropertiesEXT = 0;

	//=== VK_EXT_line_rasterization ===
	PFN_vkCmdSetLineStippleEXT vkCmdSetLineStippleEXT = 0;

	//=== VK_EXT_multi_draw ===
	PFN_vkCmdDrawMultiEXT vkCmdDrawMultiEXT = 0;
	PFN_vkCmdDrawMultiIndexedEXT vkCmdDrawMultiIndexedEXT = 0;

	//=== VK_EXT_pageable_device_local_memory ===
	PFN_vkSetDeviceMemoryPriorityEXT vkSetDeviceMemoryPriorityEXT = 0;

	//=== VK_EXT_private_data ===
	PFN_vkCreatePrivateDataSlotEXT vkCreatePrivateDataSlotEXT = 0;
	PFN_vkDestroyPrivateDataSlotEXT vkDestroyPrivateDataSlotEXT = 0;
	PFN_vkSetPrivateDataEXT vkSetPrivateDataEXT = 0;
	PFN_vkGetPrivateDataEXT vkGetPrivateDataEXT = 0;

	//=== VK_EXT_sample_locations ===
	PFN_vkCmdSetSampleLocationsEXT vkCmdSetSampleLocationsEXT = 0;

	//=== VK_EXT_transform_feedback ===
	PFN_vkCmdBindTransformFeedbackBuffersEXT vkCmdBindTransformFeedbackBuffersEXT = 0;
	PFN_vkCmdBeginTransformFeedbackEXT vkCmdBeginTransformFeedbackEXT = 0;
	PFN_vkCmdEndTransformFeedbackEXT vkCmdEndTransformFeedbackEXT = 0;
	PFN_vkCmdBeginQueryIndexedEXT vkCmdBeginQueryIndexedEXT = 0;
	PFN_vkCmdEndQueryIndexedEXT vkCmdEndQueryIndexedEXT = 0;
	PFN_vkCmdDrawIndirectByteCountEXT vkCmdDrawIndirectByteCountEXT = 0;

	//=== VK_EXT_validation_cache ===
	PFN_vkCreateValidationCacheEXT vkCreateValidationCacheEXT = 0;
	PFN_vkDestroyValidationCacheEXT vkDestroyValidationCacheEXT = 0;
	PFN_vkMergeValidationCachesEXT vkMergeValidationCachesEXT = 0;
	PFN_vkGetValidationCacheDataEXT vkGetValidationCacheDataEXT = 0;

	//=== VK_EXT_vertex_input_dynamic_state ===
	PFN_vkCmdSetVertexInputEXT vkCmdSetVertexInputEXT = 0;

#	if defined(VK_USE_PLATFORM_FUCHSIA)
	//=== VK_FUCHSIA_buffer_collection ===
	PFN_vkCreateBufferCollectionFUCHSIA vkCreateBufferCollectionFUCHSIA = 0;
	PFN_vkSetBufferCollectionImageConstraintsFUCHSIA vkSetBufferCollectionImageConstraintsFUCHSIA = 0;
	PFN_vkSetBufferCollectionBufferConstraintsFUCHSIA vkSetBufferCollectionBufferConstraintsFUCHSIA = 0;
	PFN_vkDestroyBufferCollectionFUCHSIA vkDestroyBufferCollectionFUCHSIA = 0;
	PFN_vkGetBufferCollectionPropertiesFUCHSIA vkGetBufferCollectionPropertiesFUCHSIA = 0;
#	else
	PFN_dummy vkCreateBufferCollectionFUCHSIA_placeholder = 0;
	PFN_dummy vkSetBufferCollectionImageConstraintsFUCHSIA_placeholder = 0;
	PFN_dummy vkSetBufferCollectionBufferConstraintsFUCHSIA_placeholder = 0;
	PFN_dummy vkDestroyBufferCollectionFUCHSIA_placeholder = 0;
	PFN_dummy vkGetBufferCollectionPropertiesFUCHSIA_placeholder = 0;
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

#	if defined(VK_USE_PLATFORM_FUCHSIA)
	//=== VK_FUCHSIA_external_memory ===
	PFN_vkGetMemoryZirconHandleFUCHSIA vkGetMemoryZirconHandleFUCHSIA = 0;
	PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA vkGetMemoryZirconHandlePropertiesFUCHSIA = 0;
#	else
	PFN_dummy vkGetMemoryZirconHandleFUCHSIA_placeholder = 0;
	PFN_dummy vkGetMemoryZirconHandlePropertiesFUCHSIA_placeholder = 0;
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

#	if defined(VK_USE_PLATFORM_FUCHSIA)
	//=== VK_FUCHSIA_external_semaphore ===
	PFN_vkImportSemaphoreZirconHandleFUCHSIA vkImportSemaphoreZirconHandleFUCHSIA = 0;
	PFN_vkGetSemaphoreZirconHandleFUCHSIA vkGetSemaphoreZirconHandleFUCHSIA = 0;
#	else
	PFN_dummy vkImportSemaphoreZirconHandleFUCHSIA_placeholder = 0;
	PFN_dummy vkGetSemaphoreZirconHandleFUCHSIA_placeholder = 0;
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

	//=== VK_GOOGLE_display_timing ===
	PFN_vkGetRefreshCycleDurationGOOGLE vkGetRefreshCycleDurationGOOGLE = 0;
	PFN_vkGetPastPresentationTimingGOOGLE vkGetPastPresentationTimingGOOGLE = 0;

	//=== VK_HUAWEI_invocation_mask ===
	PFN_vkCmdBindInvocationMaskHUAWEI vkCmdBindInvocationMaskHUAWEI = 0;

	//=== VK_HUAWEI_subpass_shading ===
	PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = 0;
	PFN_vkCmdSubpassShadingHUAWEI vkCmdSubpassShadingHUAWEI = 0;

	//=== VK_INTEL_performance_query ===
	PFN_vkInitializePerformanceApiINTEL vkInitializePerformanceApiINTEL = 0;
	PFN_vkUninitializePerformanceApiINTEL vkUninitializePerformanceApiINTEL = 0;
	PFN_vkCmdSetPerformanceMarkerINTEL vkCmdSetPerformanceMarkerINTEL = 0;
	PFN_vkCmdSetPerformanceStreamMarkerINTEL vkCmdSetPerformanceStreamMarkerINTEL = 0;
	PFN_vkCmdSetPerformanceOverrideINTEL vkCmdSetPerformanceOverrideINTEL = 0;
	PFN_vkAcquirePerformanceConfigurationINTEL vkAcquirePerformanceConfigurationINTEL = 0;
	PFN_vkReleasePerformanceConfigurationINTEL vkReleasePerformanceConfigurationINTEL = 0;
	PFN_vkQueueSetPerformanceConfigurationINTEL vkQueueSetPerformanceConfigurationINTEL = 0;
	PFN_vkGetPerformanceParameterINTEL vkGetPerformanceParameterINTEL = 0;

	//=== VK_KHR_acceleration_structure ===
	PFN_vkCreateAccelerationStructureKHR vkCreateAccelerationStructureKHR = 0;
	PFN_vkDestroyAccelerationStructureKHR vkDestroyAccelerationStructureKHR = 0;
	PFN_vkCmdBuildAccelerationStructuresKHR vkCmdBuildAccelerationStructuresKHR = 0;
	PFN_vkCmdBuildAccelerationStructuresIndirectKHR vkCmdBuildAccelerationStructuresIndirectKHR = 0;
	PFN_vkBuildAccelerationStructuresKHR vkBuildAccelerationStructuresKHR = 0;
	PFN_vkCopyAccelerationStructureKHR vkCopyAccelerationStructureKHR = 0;
	PFN_vkCopyAccelerationStructureToMemoryKHR vkCopyAccelerationStructureToMemoryKHR = 0;
	PFN_vkCopyMemoryToAccelerationStructureKHR vkCopyMemoryToAccelerationStructureKHR = 0;
	PFN_vkWriteAccelerationStructuresPropertiesKHR vkWriteAccelerationStructuresPropertiesKHR = 0;
	PFN_vkCmdCopyAccelerationStructureKHR vkCmdCopyAccelerationStructureKHR = 0;
	PFN_vkCmdCopyAccelerationStructureToMemoryKHR vkCmdCopyAccelerationStructureToMemoryKHR = 0;
	PFN_vkCmdCopyMemoryToAccelerationStructureKHR vkCmdCopyMemoryToAccelerationStructureKHR = 0;
	PFN_vkGetAccelerationStructureDeviceAddressKHR vkGetAccelerationStructureDeviceAddressKHR = 0;
	PFN_vkCmdWriteAccelerationStructuresPropertiesKHR vkCmdWriteAccelerationStructuresPropertiesKHR = 0;
	PFN_vkGetDeviceAccelerationStructureCompatibilityKHR vkGetDeviceAccelerationStructureCompatibilityKHR = 0;
	PFN_vkGetAccelerationStructureBuildSizesKHR vkGetAccelerationStructureBuildSizesKHR = 0;

	//=== VK_KHR_bind_memory2 ===
	PFN_vkBindBufferMemory2KHR vkBindBufferMemory2KHR = 0;
	PFN_vkBindImageMemory2KHR vkBindImageMemory2KHR = 0;

	//=== VK_KHR_buffer_device_address ===
	PFN_vkGetBufferDeviceAddressKHR vkGetBufferDeviceAddressKHR = 0;
	PFN_vkGetBufferOpaqueCaptureAddressKHR vkGetBufferOpaqueCaptureAddressKHR = 0;
	PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR vkGetDeviceMemoryOpaqueCaptureAddressKHR = 0;

	//=== VK_KHR_copy_commands2 ===
	PFN_vkCmdCopyBuffer2KHR vkCmdCopyBuffer2KHR = 0;
	PFN_vkCmdCopyImage2KHR vkCmdCopyImage2KHR = 0;
	PFN_vkCmdCopyBufferToImage2KHR vkCmdCopyBufferToImage2KHR = 0;
	PFN_vkCmdCopyImageToBuffer2KHR vkCmdCopyImageToBuffer2KHR = 0;
	PFN_vkCmdBlitImage2KHR vkCmdBlitImage2KHR = 0;
	PFN_vkCmdResolveImage2KHR vkCmdResolveImage2KHR = 0;

	//=== VK_KHR_create_renderpass2 ===
	PFN_vkCreateRenderPass2KHR vkCreateRenderPass2KHR = 0;
	PFN_vkCmdBeginRenderPass2KHR vkCmdBeginRenderPass2KHR = 0;
	PFN_vkCmdNextSubpass2KHR vkCmdNextSubpass2KHR = 0;
	PFN_vkCmdEndRenderPass2KHR vkCmdEndRenderPass2KHR = 0;

	//=== VK_KHR_deferred_host_operations ===
	PFN_vkCreateDeferredOperationKHR vkCreateDeferredOperationKHR = 0;
	PFN_vkDestroyDeferredOperationKHR vkDestroyDeferredOperationKHR = 0;
	PFN_vkGetDeferredOperationMaxConcurrencyKHR vkGetDeferredOperationMaxConcurrencyKHR = 0;
	PFN_vkGetDeferredOperationResultKHR vkGetDeferredOperationResultKHR = 0;
	PFN_vkDeferredOperationJoinKHR vkDeferredOperationJoinKHR = 0;

	//=== VK_KHR_descriptor_update_template ===
	PFN_vkCreateDescriptorUpdateTemplateKHR vkCreateDescriptorUpdateTemplateKHR = 0;
	PFN_vkDestroyDescriptorUpdateTemplateKHR vkDestroyDescriptorUpdateTemplateKHR = 0;
	PFN_vkUpdateDescriptorSetWithTemplateKHR vkUpdateDescriptorSetWithTemplateKHR = 0;
	PFN_vkCmdPushDescriptorSetWithTemplateKHR vkCmdPushDescriptorSetWithTemplateKHR = 0;

	//=== VK_KHR_device_group ===
	PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR vkGetDeviceGroupPeerMemoryFeaturesKHR = 0;
	PFN_vkCmdSetDeviceMaskKHR vkCmdSetDeviceMaskKHR = 0;
	PFN_vkCmdDispatchBaseKHR vkCmdDispatchBaseKHR = 0;
	PFN_vkGetDeviceGroupPresentCapabilitiesKHR vkGetDeviceGroupPresentCapabilitiesKHR = 0;
	PFN_vkGetDeviceGroupSurfacePresentModesKHR vkGetDeviceGroupSurfacePresentModesKHR = 0;
	PFN_vkAcquireNextImage2KHR vkAcquireNextImage2KHR = 0;

	//=== VK_KHR_display_swapchain ===
	PFN_vkCreateSharedSwapchainsKHR vkCreateSharedSwapchainsKHR = 0;

	//=== VK_KHR_draw_indirect_count ===
	PFN_vkCmdDrawIndirectCountKHR vkCmdDrawIndirectCountKHR = 0;
	PFN_vkCmdDrawIndexedIndirectCountKHR vkCmdDrawIndexedIndirectCountKHR = 0;

	//=== VK_KHR_dynamic_rendering ===
	PFN_vkCmdBeginRenderingKHR vkCmdBeginRenderingKHR = 0;
	PFN_vkCmdEndRenderingKHR vkCmdEndRenderingKHR = 0;

	//=== VK_KHR_external_fence_fd ===
	PFN_vkImportFenceFdKHR vkImportFenceFdKHR = 0;
	PFN_vkGetFenceFdKHR vkGetFenceFdKHR = 0;

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
	//=== VK_KHR_external_fence_win32 ===
	PFN_vkImportFenceWin32HandleKHR vkImportFenceWin32HandleKHR = 0;
	PFN_vkGetFenceWin32HandleKHR vkGetFenceWin32HandleKHR = 0;
#	else
	PFN_dummy vkImportFenceWin32HandleKHR_placeholder = 0;
	PFN_dummy vkGetFenceWin32HandleKHR_placeholder = 0;
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

	//=== VK_KHR_external_memory_fd ===
	PFN_vkGetMemoryFdKHR vkGetMemoryFdKHR = 0;
	PFN_vkGetMemoryFdPropertiesKHR vkGetMemoryFdPropertiesKHR = 0;

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
	//=== VK_KHR_external_memory_win32 ===
	PFN_vkGetMemoryWin32HandleKHR vkGetMemoryWin32HandleKHR = 0;
	PFN_vkGetMemoryWin32HandlePropertiesKHR vkGetMemoryWin32HandlePropertiesKHR = 0;
#	else
	PFN_dummy vkGetMemoryWin32HandleKHR_placeholder = 0;
	PFN_dummy vkGetMemoryWin32HandlePropertiesKHR_placeholder = 0;
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

	//=== VK_KHR_external_semaphore_fd ===
	PFN_vkImportSemaphoreFdKHR vkImportSemaphoreFdKHR = 0;
	PFN_vkGetSemaphoreFdKHR vkGetSemaphoreFdKHR = 0;

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
	//=== VK_KHR_external_semaphore_win32 ===
	PFN_vkImportSemaphoreWin32HandleKHR vkImportSemaphoreWin32HandleKHR = 0;
	PFN_vkGetSemaphoreWin32HandleKHR vkGetSemaphoreWin32HandleKHR = 0;
#	else
	PFN_dummy vkImportSemaphoreWin32HandleKHR_placeholder = 0;
	PFN_dummy vkGetSemaphoreWin32HandleKHR_placeholder = 0;
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

	//=== VK_KHR_fragment_shading_rate ===
	PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR = 0;

	//=== VK_KHR_get_memory_requirements2 ===
	PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR = 0;
	PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR = 0;
	PFN_vkGetImageSparseMemoryRequirements2KHR vkGetImageSparseMemoryRequirements2KHR = 0;

	//=== VK_KHR_maintenance1 ===
	PFN_vkTrimCommandPoolKHR vkTrimCommandPoolKHR = 0;

	//=== VK_KHR_maintenance3 ===
	PFN_vkGetDescriptorSetLayoutSupportKHR vkGetDescriptorSetLayoutSupportKHR = 0;

	//=== VK_KHR_maintenance4 ===
	PFN_vkGetDeviceBufferMemoryRequirementsKHR vkGetDeviceBufferMemoryRequirementsKHR = 0;
	PFN_vkGetDeviceImageMemoryRequirementsKHR vkGetDeviceImageMemoryRequirementsKHR = 0;
	PFN_vkGetDeviceImageSparseMemoryRequirementsKHR vkGetDeviceImageSparseMemoryRequirementsKHR = 0;

	//=== VK_KHR_performance_query ===
	PFN_vkAcquireProfilingLockKHR vkAcquireProfilingLockKHR = 0;
	PFN_vkReleaseProfilingLockKHR vkReleaseProfilingLockKHR = 0;

	//=== VK_KHR_pipeline_executable_properties ===
	PFN_vkGetPipelineExecutablePropertiesKHR vkGetPipelineExecutablePropertiesKHR = 0;
	PFN_vkGetPipelineExecutableStatisticsKHR vkGetPipelineExecutableStatisticsKHR = 0;
	PFN_vkGetPipelineExecutableInternalRepresentationsKHR vkGetPipelineExecutableInternalRepresentationsKHR = 0;

	//=== VK_KHR_present_wait ===
	PFN_vkWaitForPresentKHR vkWaitForPresentKHR = 0;

	//=== VK_KHR_push_descriptor ===
	PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR = 0;

	//=== VK_KHR_ray_tracing_pipeline ===
	PFN_vkCmdTraceRaysKHR vkCmdTraceRaysKHR = 0;
	PFN_vkCreateRayTracingPipelinesKHR vkCreateRayTracingPipelinesKHR = 0;
	PFN_vkGetRayTracingShaderGroupHandlesKHR vkGetRayTracingShaderGroupHandlesKHR = 0;
	PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR vkGetRayTracingCaptureReplayShaderGroupHandlesKHR = 0;
	PFN_vkCmdTraceRaysIndirectKHR vkCmdTraceRaysIndirectKHR = 0;
	PFN_vkGetRayTracingShaderGroupStackSizeKHR vkGetRayTracingShaderGroupStackSizeKHR = 0;
	PFN_vkCmdSetRayTracingPipelineStackSizeKHR vkCmdSetRayTracingPipelineStackSizeKHR = 0;

	//=== VK_KHR_sampler_ycbcr_conversion ===
	PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionKHR = 0;
	PFN_vkDestroySamplerYcbcrConversionKHR vkDestroySamplerYcbcrConversionKHR = 0;

	//=== VK_KHR_shared_presentable_image ===
	PFN_vkGetSwapchainStatusKHR vkGetSwapchainStatusKHR = 0;

	//=== VK_KHR_swapchain ===
	PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR = 0;
	PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR = 0;
	PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR = 0;
	PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR = 0;
	PFN_vkQueuePresentKHR vkQueuePresentKHR = 0;

	//=== VK_KHR_synchronization2 ===
	PFN_vkCmdSetEvent2KHR vkCmdSetEvent2KHR = 0;
	PFN_vkCmdResetEvent2KHR vkCmdResetEvent2KHR = 0;
	PFN_vkCmdWaitEvents2KHR vkCmdWaitEvents2KHR = 0;
	PFN_vkCmdPipelineBarrier2KHR vkCmdPipelineBarrier2KHR = 0;
	PFN_vkCmdWriteTimestamp2KHR vkCmdWriteTimestamp2KHR = 0;
	PFN_vkQueueSubmit2KHR vkQueueSubmit2KHR = 0;
	PFN_vkCmdWriteBufferMarker2AMD vkCmdWriteBufferMarker2AMD = 0;
	PFN_vkGetQueueCheckpointData2NV vkGetQueueCheckpointData2NV = 0;

	//=== VK_KHR_timeline_semaphore ===
	PFN_vkGetSemaphoreCounterValueKHR vkGetSemaphoreCounterValueKHR = 0;
	PFN_vkWaitSemaphoresKHR vkWaitSemaphoresKHR = 0;
	PFN_vkSignalSemaphoreKHR vkSignalSemaphoreKHR = 0;

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
	//=== VK_KHR_video_decode_queue ===
	PFN_vkCmdDecodeVideoKHR vkCmdDecodeVideoKHR = 0;
#	else
	PFN_dummy vkCmdDecodeVideoKHR_placeholder = 0;
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
	//=== VK_KHR_video_encode_queue ===
	PFN_vkCmdEncodeVideoKHR vkCmdEncodeVideoKHR = 0;
#	else
	PFN_dummy vkCmdEncodeVideoKHR_placeholder = 0;
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
	//=== VK_KHR_video_queue ===
	PFN_vkCreateVideoSessionKHR vkCreateVideoSessionKHR = 0;
	PFN_vkDestroyVideoSessionKHR vkDestroyVideoSessionKHR = 0;
	PFN_vkGetVideoSessionMemoryRequirementsKHR vkGetVideoSessionMemoryRequirementsKHR = 0;
	PFN_vkBindVideoSessionMemoryKHR vkBindVideoSessionMemoryKHR = 0;
	PFN_vkCreateVideoSessionParametersKHR vkCreateVideoSessionParametersKHR = 0;
	PFN_vkUpdateVideoSessionParametersKHR vkUpdateVideoSessionParametersKHR = 0;
	PFN_vkDestroyVideoSessionParametersKHR vkDestroyVideoSessionParametersKHR = 0;
	PFN_vkCmdBeginVideoCodingKHR vkCmdBeginVideoCodingKHR = 0;
	PFN_vkCmdEndVideoCodingKHR vkCmdEndVideoCodingKHR = 0;
	PFN_vkCmdControlVideoCodingKHR vkCmdControlVideoCodingKHR = 0;
#	else
	PFN_dummy vkCreateVideoSessionKHR_placeholder = 0;
	PFN_dummy vkDestroyVideoSessionKHR_placeholder = 0;
	PFN_dummy vkGetVideoSessionMemoryRequirementsKHR_placeholder = 0;
	PFN_dummy vkBindVideoSessionMemoryKHR_placeholder = 0;
	PFN_dummy vkCreateVideoSessionParametersKHR_placeholder = 0;
	PFN_dummy vkUpdateVideoSessionParametersKHR_placeholder = 0;
	PFN_dummy vkDestroyVideoSessionParametersKHR_placeholder = 0;
	PFN_dummy vkCmdBeginVideoCodingKHR_placeholder = 0;
	PFN_dummy vkCmdEndVideoCodingKHR_placeholder = 0;
	PFN_dummy vkCmdControlVideoCodingKHR_placeholder = 0;
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

	//=== VK_NVX_binary_import ===
	PFN_vkCreateCuModuleNVX vkCreateCuModuleNVX = 0;
	PFN_vkCreateCuFunctionNVX vkCreateCuFunctionNVX = 0;
	PFN_vkDestroyCuModuleNVX vkDestroyCuModuleNVX = 0;
	PFN_vkDestroyCuFunctionNVX vkDestroyCuFunctionNVX = 0;
	PFN_vkCmdCuLaunchKernelNVX vkCmdCuLaunchKernelNVX = 0;

	//=== VK_NVX_image_view_handle ===
	PFN_vkGetImageViewHandleNVX vkGetImageViewHandleNVX = 0;
	PFN_vkGetImageViewAddressNVX vkGetImageViewAddressNVX = 0;

	//=== VK_NV_clip_space_w_scaling ===
	PFN_vkCmdSetViewportWScalingNV vkCmdSetViewportWScalingNV = 0;

	//=== VK_NV_device_diagnostic_checkpoints ===
	PFN_vkCmdSetCheckpointNV vkCmdSetCheckpointNV = 0;
	PFN_vkGetQueueCheckpointDataNV vkGetQueueCheckpointDataNV = 0;

	//=== VK_NV_device_generated_commands ===
	PFN_vkGetGeneratedCommandsMemoryRequirementsNV vkGetGeneratedCommandsMemoryRequirementsNV = 0;
	PFN_vkCmdPreprocessGeneratedCommandsNV vkCmdPreprocessGeneratedCommandsNV = 0;
	PFN_vkCmdExecuteGeneratedCommandsNV vkCmdExecuteGeneratedCommandsNV = 0;
	PFN_vkCmdBindPipelineShaderGroupNV vkCmdBindPipelineShaderGroupNV = 0;
	PFN_vkCreateIndirectCommandsLayoutNV vkCreateIndirectCommandsLayoutNV = 0;
	PFN_vkDestroyIndirectCommandsLayoutNV vkDestroyIndirectCommandsLayoutNV = 0;

	//=== VK_NV_external_memory_rdma ===
	PFN_vkGetMemoryRemoteAddressNV vkGetMemoryRemoteAddressNV = 0;

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
	//=== VK_NV_external_memory_win32 ===
	PFN_vkGetMemoryWin32HandleNV vkGetMemoryWin32HandleNV = 0;
#	else
	PFN_dummy vkGetMemoryWin32HandleNV_placeholder = 0;
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

	//=== VK_NV_fragment_shading_rate_enums ===
	PFN_vkCmdSetFragmentShadingRateEnumNV vkCmdSetFragmentShadingRateEnumNV = 0;

	//=== VK_NV_mesh_shader ===
	PFN_vkCmdDrawMeshTasksNV vkCmdDrawMeshTasksNV = 0;
	PFN_vkCmdDrawMeshTasksIndirectNV vkCmdDrawMeshTasksIndirectNV = 0;
	PFN_vkCmdDrawMeshTasksIndirectCountNV vkCmdDrawMeshTasksIndirectCountNV = 0;

	//=== VK_NV_ray_tracing ===
	PFN_vkCreateAccelerationStructureNV vkCreateAccelerationStructureNV = 0;
	PFN_vkDestroyAccelerationStructureNV vkDestroyAccelerationStructureNV = 0;
	PFN_vkGetAccelerationStructureMemoryRequirementsNV vkGetAccelerationStructureMemoryRequirementsNV = 0;
	PFN_vkBindAccelerationStructureMemoryNV vkBindAccelerationStructureMemoryNV = 0;
	PFN_vkCmdBuildAccelerationStructureNV vkCmdBuildAccelerationStructureNV = 0;
	PFN_vkCmdCopyAccelerationStructureNV vkCmdCopyAccelerationStructureNV = 0;
	PFN_vkCmdTraceRaysNV vkCmdTraceRaysNV = 0;
	PFN_vkCreateRayTracingPipelinesNV vkCreateRayTracingPipelinesNV = 0;
	PFN_vkGetRayTracingShaderGroupHandlesNV vkGetRayTracingShaderGroupHandlesNV = 0;
	PFN_vkGetAccelerationStructureHandleNV vkGetAccelerationStructureHandleNV = 0;
	PFN_vkCmdWriteAccelerationStructuresPropertiesNV vkCmdWriteAccelerationStructuresPropertiesNV = 0;
	PFN_vkCompileDeferredNV vkCompileDeferredNV = 0;

	//=== VK_NV_scissor_exclusive ===
	PFN_vkCmdSetExclusiveScissorNV vkCmdSetExclusiveScissorNV = 0;

	//=== VK_NV_shading_rate_image ===
	PFN_vkCmdBindShadingRateImageNV vkCmdBindShadingRateImageNV = 0;
	PFN_vkCmdSetViewportShadingRatePaletteNV vkCmdSetViewportShadingRatePaletteNV = 0;
	PFN_vkCmdSetCoarseSampleOrderNV vkCmdSetCoarseSampleOrderNV = 0;

	//=== VK_VALVE_descriptor_set_host_mapping ===
	PFN_vkGetDescriptorSetLayoutHostMappingInfoVALVE vkGetDescriptorSetLayoutHostMappingInfoVALVE = 0;
	PFN_vkGetDescriptorSetHostMappingVALVE vkGetDescriptorSetHostMappingVALVE = 0;
};

//========================================
//=== RAII HANDLE forward declarations ===
//========================================

//=== VK_VERSION_1_0 ===
class Instance;
class PhysicalDevice;
class Device;
class Queue;
class DeviceMemory;
class Fence;
class Semaphore;
class Event;
class QueryPool;
class Buffer;
class BufferView;
class Image;
class ImageView;
class ShaderModule;
class PipelineCache;
class Pipeline;
class PipelineLayout;
class Sampler;
class DescriptorPool;
class DescriptorSet;
class DescriptorSetLayout;
class Framebuffer;
class RenderPass;
class CommandPool;
class CommandBuffer;

//=== VK_VERSION_1_1 ===
class SamplerYcbcrConversion;
class DescriptorUpdateTemplate;

//=== VK_VERSION_1_3 ===
class PrivateDataSlot;

//=== VK_KHR_surface ===
class SurfaceKHR;

//=== VK_KHR_swapchain ===
class SwapchainKHR;

//=== VK_KHR_display ===
class DisplayKHR;
class DisplayModeKHR;

//=== VK_EXT_debug_report ===
class DebugReportCallbackEXT;

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
//=== VK_KHR_video_queue ===
class VideoSessionKHR;
class VideoSessionParametersKHR;
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

//=== VK_NVX_binary_import ===
class CuModuleNVX;
class CuFunctionNVX;

//=== VK_EXT_debug_utils ===
class DebugUtilsMessengerEXT;

//=== VK_KHR_acceleration_structure ===
class AccelerationStructureKHR;

//=== VK_EXT_validation_cache ===
class ValidationCacheEXT;

//=== VK_NV_ray_tracing ===
class AccelerationStructureNV;

//=== VK_INTEL_performance_query ===
class PerformanceConfigurationINTEL;

//=== VK_KHR_deferred_host_operations ===
class DeferredOperationKHR;

//=== VK_NV_device_generated_commands ===
class IndirectCommandsLayoutNV;

#	if defined(VK_USE_PLATFORM_FUCHSIA)
//=== VK_FUCHSIA_buffer_collection ===
class BufferCollectionFUCHSIA;
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

//====================
//=== RAII HANDLES ===
//====================

class Context
{
public:
#	if VULKAN_HPP_ENABLE_DYNAMIC_LOADER_TOOL
	Context()
	    : m_dispatcher(new VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ContextDispatcher(
	          m_dynamicLoader.getProcAddress<PFN_vkGetInstanceProcAddr>("vkGetInstanceProcAddr")))
#	else
	Context(PFN_vkGetInstanceProcAddr getInstanceProcAddr)
	    : m_dispatcher(new VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ContextDispatcher(getInstanceProcAddr))
#	endif
	{
	}

	~Context() = default;

	Context(Context const &) = delete;
	Context(Context &&rhs) VULKAN_HPP_NOEXCEPT
#	if VULKAN_HPP_ENABLE_DYNAMIC_LOADER_TOOL
	    : m_dynamicLoader(std::move(rhs.m_dynamicLoader)),
	      m_dispatcher(rhs.m_dispatcher.release())
#	else
	    : m_dispatcher(rhs.m_dispatcher.release())
#	endif
	{
	}
	Context &operator=(Context const &) = delete;
	Context &operator=(Context &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
#	if VULKAN_HPP_ENABLE_DYNAMIC_LOADER_TOOL
			m_dynamicLoader = std::move(rhs.m_dynamicLoader);
#	endif
			m_dispatcher.reset(rhs.m_dispatcher.release());
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ContextDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return &*m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Context &rhs)
	{
#	if VULKAN_HPP_ENABLE_DYNAMIC_LOADER_TOOL
		std::swap(m_dynamicLoader, rhs.m_dynamicLoader);
#	endif
		m_dispatcher.swap(rhs.m_dispatcher);
	}

	//=== VK_VERSION_1_0 ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::Instance
	createInstance(VULKAN_HPP_NAMESPACE::InstanceCreateInfo const &createInfo,
	               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::ExtensionProperties>
	enumerateInstanceExtensionProperties(Optional<const std::string> layerName VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT) const;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::LayerProperties> enumerateInstanceLayerProperties() const;

	//=== VK_VERSION_1_1 ===

	VULKAN_HPP_NODISCARD uint32_t enumerateInstanceVersion() const;

private:
#	if VULKAN_HPP_ENABLE_DYNAMIC_LOADER_TOOL
	VULKAN_HPP_NAMESPACE::DynamicLoader m_dynamicLoader;
#	endif
	std::unique_ptr<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ContextDispatcher> m_dispatcher;
};

class Instance
{
public:
	using CType = VkInstance;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eInstance;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eInstance;

public:
	Instance(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Context const &context,
	         VULKAN_HPP_NAMESPACE::InstanceCreateInfo const &createInfo,
	         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	{
		VULKAN_HPP_NAMESPACE::Result result =
		    static_cast<VULKAN_HPP_NAMESPACE::Result>(context.getDispatcher()->vkCreateInstance(reinterpret_cast<const VkInstanceCreateInfo *>(&createInfo),
		                                                                                        reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                                                        reinterpret_cast<VkInstance *>(&m_instance)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateInstance");
		}
		m_dispatcher.reset(new VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher(context.getDispatcher()->vkGetInstanceProcAddr,
		                                                                                           static_cast<VkInstance>(m_instance)));
	}

	Instance(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Context const &context,
	         VkInstance instance,
	         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_instance(instance)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	{
		m_dispatcher.reset(new VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher(context.getDispatcher()->vkGetInstanceProcAddr,
		                                                                                           static_cast<VkInstance>(m_instance)));
	}

	Instance(std::nullptr_t) {}

	~Instance()
	{
		clear();
	}

	Instance() = delete;
	Instance(Instance const &) = delete;
	Instance(Instance &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_instance(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_instance, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(rhs.m_dispatcher.release())
	{
	}
	Instance &operator=(Instance const &) = delete;
	Instance &operator=(Instance &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_instance = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_instance, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher.reset(rhs.m_dispatcher.release());
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::Instance const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_instance;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_instance)
		{
			getDispatcher()->vkDestroyInstance(static_cast<VkInstance>(m_instance), reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_instance = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return &*m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_instance, rhs.m_instance);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_VERSION_1_0 ===

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice> enumeratePhysicalDevices() const;

	VULKAN_HPP_NODISCARD PFN_vkVoidFunction getProcAddr(const std::string &name) const VULKAN_HPP_NOEXCEPT;

	//=== VK_VERSION_1_1 ===

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties> enumeratePhysicalDeviceGroups() const;

	//=== VK_KHR_display ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
	createDisplayPlaneSurfaceKHR(VULKAN_HPP_NAMESPACE::DisplaySurfaceCreateInfoKHR const &createInfo,
	                             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

#	if defined(VK_USE_PLATFORM_XLIB_KHR)
	//=== VK_KHR_xlib_surface ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
	createXlibSurfaceKHR(VULKAN_HPP_NAMESPACE::XlibSurfaceCreateInfoKHR const &createInfo,
	                     VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;
#	endif /*VK_USE_PLATFORM_XLIB_KHR*/

#	if defined(VK_USE_PLATFORM_XCB_KHR)
	//=== VK_KHR_xcb_surface ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
	createXcbSurfaceKHR(VULKAN_HPP_NAMESPACE::XcbSurfaceCreateInfoKHR const &createInfo,
	                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;
#	endif /*VK_USE_PLATFORM_XCB_KHR*/

#	if defined(VK_USE_PLATFORM_WAYLAND_KHR)
	//=== VK_KHR_wayland_surface ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
	createWaylandSurfaceKHR(VULKAN_HPP_NAMESPACE::WaylandSurfaceCreateInfoKHR const &createInfo,
	                        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;
#	endif /*VK_USE_PLATFORM_WAYLAND_KHR*/

#	if defined(VK_USE_PLATFORM_ANDROID_KHR)
	//=== VK_KHR_android_surface ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
	createAndroidSurfaceKHR(VULKAN_HPP_NAMESPACE::AndroidSurfaceCreateInfoKHR const &createInfo,
	                        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;
#	endif /*VK_USE_PLATFORM_ANDROID_KHR*/

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
	//=== VK_KHR_win32_surface ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
	createWin32SurfaceKHR(VULKAN_HPP_NAMESPACE::Win32SurfaceCreateInfoKHR const &createInfo,
	                      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

	//=== VK_EXT_debug_report ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::DebugReportCallbackEXT
	createDebugReportCallbackEXT(VULKAN_HPP_NAMESPACE::DebugReportCallbackCreateInfoEXT const &createInfo,
	                             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	void debugReportMessageEXT(VULKAN_HPP_NAMESPACE::DebugReportFlagsEXT flags,
	                           VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT objectType_,
	                           uint64_t object,
	                           size_t location,
	                           int32_t messageCode,
	                           const std::string &layerPrefix,
	                           const std::string &message) const VULKAN_HPP_NOEXCEPT;

#	if defined(VK_USE_PLATFORM_GGP)
	//=== VK_GGP_stream_descriptor_surface ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
	createStreamDescriptorSurfaceGGP(VULKAN_HPP_NAMESPACE::StreamDescriptorSurfaceCreateInfoGGP const &createInfo,
	                                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;
#	endif /*VK_USE_PLATFORM_GGP*/

#	if defined(VK_USE_PLATFORM_VI_NN)
	//=== VK_NN_vi_surface ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
	createViSurfaceNN(VULKAN_HPP_NAMESPACE::ViSurfaceCreateInfoNN const &createInfo,
	                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;
#	endif /*VK_USE_PLATFORM_VI_NN*/

	//=== VK_KHR_device_group_creation ===

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties> enumeratePhysicalDeviceGroupsKHR() const;

#	if defined(VK_USE_PLATFORM_IOS_MVK)
	//=== VK_MVK_ios_surface ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
	createIOSSurfaceMVK(VULKAN_HPP_NAMESPACE::IOSSurfaceCreateInfoMVK const &createInfo,
	                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;
#	endif /*VK_USE_PLATFORM_IOS_MVK*/

#	if defined(VK_USE_PLATFORM_MACOS_MVK)
	//=== VK_MVK_macos_surface ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
	createMacOSSurfaceMVK(VULKAN_HPP_NAMESPACE::MacOSSurfaceCreateInfoMVK const &createInfo,
	                      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;
#	endif /*VK_USE_PLATFORM_MACOS_MVK*/

	//=== VK_EXT_debug_utils ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::DebugUtilsMessengerEXT
	createDebugUtilsMessengerEXT(VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateInfoEXT const &createInfo,
	                             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	void submitDebugUtilsMessageEXT(VULKAN_HPP_NAMESPACE::DebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
	                                VULKAN_HPP_NAMESPACE::DebugUtilsMessageTypeFlagsEXT messageTypes,
	                                const VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCallbackDataEXT &callbackData) const VULKAN_HPP_NOEXCEPT;

#	if defined(VK_USE_PLATFORM_FUCHSIA)
	//=== VK_FUCHSIA_imagepipe_surface ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
	createImagePipeSurfaceFUCHSIA(VULKAN_HPP_NAMESPACE::ImagePipeSurfaceCreateInfoFUCHSIA const &createInfo,
	                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

#	if defined(VK_USE_PLATFORM_METAL_EXT)
	//=== VK_EXT_metal_surface ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
	createMetalSurfaceEXT(VULKAN_HPP_NAMESPACE::MetalSurfaceCreateInfoEXT const &createInfo,
	                      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;
#	endif /*VK_USE_PLATFORM_METAL_EXT*/

	//=== VK_EXT_headless_surface ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
	createHeadlessSurfaceEXT(VULKAN_HPP_NAMESPACE::HeadlessSurfaceCreateInfoEXT const &createInfo,
	                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

#	if defined(VK_USE_PLATFORM_DIRECTFB_EXT)
	//=== VK_EXT_directfb_surface ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
	createDirectFBSurfaceEXT(VULKAN_HPP_NAMESPACE::DirectFBSurfaceCreateInfoEXT const &createInfo,
	                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;
#	endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/

#	if defined(VK_USE_PLATFORM_SCREEN_QNX)
	//=== VK_QNX_screen_surface ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
	createScreenSurfaceQNX(VULKAN_HPP_NAMESPACE::ScreenSurfaceCreateInfoQNX const &createInfo,
	                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;
#	endif /*VK_USE_PLATFORM_SCREEN_QNX*/

private:
	VULKAN_HPP_NAMESPACE::Instance m_instance = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	std::unique_ptr<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher> m_dispatcher;
};

class PhysicalDevice
{
public:
	using CType = VkPhysicalDevice;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::ePhysicalDevice;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::ePhysicalDevice;

public:
	PhysicalDevice(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &instance, VkPhysicalDevice physicalDevice)
	    : m_physicalDevice(physicalDevice)
	    , m_dispatcher(instance.getDispatcher())
	{
	}

	PhysicalDevice(std::nullptr_t) {}

	~PhysicalDevice()
	{
		clear();
	}

	PhysicalDevice() = delete;
	PhysicalDevice(PhysicalDevice const &rhs)
	    : m_physicalDevice(rhs.m_physicalDevice)
	    , m_dispatcher(rhs.m_dispatcher)
	{}
	PhysicalDevice(PhysicalDevice &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_physicalDevice(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_physicalDevice, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	PhysicalDevice &operator=(PhysicalDevice const &rhs)
	{
		m_physicalDevice = rhs.m_physicalDevice;
		m_dispatcher = rhs.m_dispatcher;
		return *this;
	}
	PhysicalDevice &operator=(PhysicalDevice &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			m_physicalDevice = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_physicalDevice, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::PhysicalDevice const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_physicalDevice;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		m_physicalDevice = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_physicalDevice, rhs.m_physicalDevice);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_VERSION_1_0 ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures getFeatures() const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::FormatProperties getFormatProperties(VULKAN_HPP_NAMESPACE::Format format) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ImageFormatProperties
	getImageFormatProperties(VULKAN_HPP_NAMESPACE::Format format,
	                         VULKAN_HPP_NAMESPACE::ImageType type,
	                         VULKAN_HPP_NAMESPACE::ImageTiling tiling,
	                         VULKAN_HPP_NAMESPACE::ImageUsageFlags usage,
	                         VULKAN_HPP_NAMESPACE::ImageCreateFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties getProperties() const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties> getQueueFamilyProperties() const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties getMemoryProperties() const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::Device
	createDevice(VULKAN_HPP_NAMESPACE::DeviceCreateInfo const &createInfo,
	             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::ExtensionProperties>
	enumerateDeviceExtensionProperties(Optional<const std::string> layerName VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT) const;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::LayerProperties> enumerateDeviceLayerProperties() const;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties>
	getSparseImageFormatProperties(VULKAN_HPP_NAMESPACE::Format format,
	                               VULKAN_HPP_NAMESPACE::ImageType type,
	                               VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples,
	                               VULKAN_HPP_NAMESPACE::ImageUsageFlags usage,
	                               VULKAN_HPP_NAMESPACE::ImageTiling tiling) const VULKAN_HPP_NOEXCEPT;

	//=== VK_VERSION_1_1 ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 getFeatures2() const VULKAN_HPP_NOEXCEPT;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...> getFeatures2() const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 getProperties2() const VULKAN_HPP_NOEXCEPT;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...> getProperties2() const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::FormatProperties2 getFormatProperties2(VULKAN_HPP_NAMESPACE::Format format) const VULKAN_HPP_NOEXCEPT;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...> getFormatProperties2(VULKAN_HPP_NAMESPACE::Format format) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ImageFormatProperties2
	getImageFormatProperties2(const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 &imageFormatInfo) const;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...>
	getImageFormatProperties2(const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 &imageFormatInfo) const;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2> getQueueFamilyProperties2() const VULKAN_HPP_NOEXCEPT;

	template<typename StructureChain>
	VULKAN_HPP_NODISCARD std::vector<StructureChain> getQueueFamilyProperties2() const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 getMemoryProperties2() const VULKAN_HPP_NOEXCEPT;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...> getMemoryProperties2() const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2>
	getSparseImageFormatProperties2(const VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2 &formatInfo) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ExternalBufferProperties
	getExternalBufferProperties(const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalBufferInfo &externalBufferInfo) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ExternalFenceProperties
	getExternalFenceProperties(const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFenceInfo &externalFenceInfo) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties
	getExternalSemaphoreProperties(const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalSemaphoreInfo &externalSemaphoreInfo) const VULKAN_HPP_NOEXCEPT;

	//=== VK_VERSION_1_3 ===

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties> getToolProperties() const;

	//=== VK_KHR_surface ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Bool32 getSurfaceSupportKHR(uint32_t queueFamilyIndex, VULKAN_HPP_NAMESPACE::SurfaceKHR surface) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR getSurfaceCapabilitiesKHR(VULKAN_HPP_NAMESPACE::SurfaceKHR surface) const;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormatKHR>
	getSurfaceFormatsKHR(VULKAN_HPP_NAMESPACE::SurfaceKHR surface VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::PresentModeKHR>
	getSurfacePresentModesKHR(VULKAN_HPP_NAMESPACE::SurfaceKHR surface VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const;

	//=== VK_KHR_swapchain ===

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::Rect2D> getPresentRectanglesKHR(VULKAN_HPP_NAMESPACE::SurfaceKHR surface) const;

	//=== VK_KHR_display ===

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR> getDisplayPropertiesKHR() const;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR> getDisplayPlanePropertiesKHR() const;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_RAII_NAMESPACE::DisplayKHR> getDisplayPlaneSupportedDisplaysKHR(uint32_t planeIndex) const;

#	if defined(VK_USE_PLATFORM_XLIB_KHR)
	//=== VK_KHR_xlib_surface ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Bool32
	getXlibPresentationSupportKHR(uint32_t queueFamilyIndex, Display &dpy, VisualID visualID) const VULKAN_HPP_NOEXCEPT;
#	endif /*VK_USE_PLATFORM_XLIB_KHR*/

#	if defined(VK_USE_PLATFORM_XCB_KHR)
	//=== VK_KHR_xcb_surface ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Bool32
	getXcbPresentationSupportKHR(uint32_t queueFamilyIndex, xcb_connection_t &connection, xcb_visualid_t visual_id) const VULKAN_HPP_NOEXCEPT;
#	endif /*VK_USE_PLATFORM_XCB_KHR*/

#	if defined(VK_USE_PLATFORM_WAYLAND_KHR)
	//=== VK_KHR_wayland_surface ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Bool32 getWaylandPresentationSupportKHR(uint32_t queueFamilyIndex,
	                                                                                   struct wl_display &display) const VULKAN_HPP_NOEXCEPT;
#	endif /*VK_USE_PLATFORM_WAYLAND_KHR*/

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
	//=== VK_KHR_win32_surface ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Bool32 getWin32PresentationSupportKHR(uint32_t queueFamilyIndex) const VULKAN_HPP_NOEXCEPT;
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
	//=== VK_KHR_video_queue ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR
	getVideoCapabilitiesKHR(const VULKAN_HPP_NAMESPACE::VideoProfileKHR &videoProfile) const;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...> getVideoCapabilitiesKHR(const VULKAN_HPP_NAMESPACE::VideoProfileKHR &videoProfile) const;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR>
	getVideoFormatPropertiesKHR(const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoFormatInfoKHR &videoFormatInfo) const;
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

	//=== VK_NV_external_memory_capabilities ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ExternalImageFormatPropertiesNV getExternalImageFormatPropertiesNV(
	    VULKAN_HPP_NAMESPACE::Format format,
	    VULKAN_HPP_NAMESPACE::ImageType type,
	    VULKAN_HPP_NAMESPACE::ImageTiling tiling,
	    VULKAN_HPP_NAMESPACE::ImageUsageFlags usage,
	    VULKAN_HPP_NAMESPACE::ImageCreateFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,
	    VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV externalHandleType VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const;

	//=== VK_KHR_get_physical_device_properties2 ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 getFeatures2KHR() const VULKAN_HPP_NOEXCEPT;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...> getFeatures2KHR() const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 getProperties2KHR() const VULKAN_HPP_NOEXCEPT;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...> getProperties2KHR() const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::FormatProperties2 getFormatProperties2KHR(VULKAN_HPP_NAMESPACE::Format format) const VULKAN_HPP_NOEXCEPT;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...> getFormatProperties2KHR(VULKAN_HPP_NAMESPACE::Format format) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ImageFormatProperties2
	getImageFormatProperties2KHR(const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 &imageFormatInfo) const;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...>
	getImageFormatProperties2KHR(const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 &imageFormatInfo) const;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2> getQueueFamilyProperties2KHR() const VULKAN_HPP_NOEXCEPT;

	template<typename StructureChain>
	VULKAN_HPP_NODISCARD std::vector<StructureChain> getQueueFamilyProperties2KHR() const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 getMemoryProperties2KHR() const VULKAN_HPP_NOEXCEPT;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...> getMemoryProperties2KHR() const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2>
	getSparseImageFormatProperties2KHR(const VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2 &formatInfo) const VULKAN_HPP_NOEXCEPT;

	//=== VK_KHR_external_memory_capabilities ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ExternalBufferProperties
	getExternalBufferPropertiesKHR(const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalBufferInfo &externalBufferInfo) const VULKAN_HPP_NOEXCEPT;

	//=== VK_KHR_external_semaphore_capabilities ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties
	getExternalSemaphorePropertiesKHR(const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalSemaphoreInfo &externalSemaphoreInfo) const VULKAN_HPP_NOEXCEPT;

#	if defined(VK_USE_PLATFORM_XLIB_XRANDR_EXT)
	//=== VK_EXT_acquire_xlib_display ===

	void acquireXlibDisplayEXT(Display &dpy, VULKAN_HPP_NAMESPACE::DisplayKHR display) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::DisplayKHR getRandROutputDisplayEXT(Display &dpy, RROutput rrOutput) const;
#	endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/

	//=== VK_EXT_display_surface_counter ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::SurfaceCapabilities2EXT getSurfaceCapabilities2EXT(VULKAN_HPP_NAMESPACE::SurfaceKHR surface) const;

	//=== VK_KHR_external_fence_capabilities ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ExternalFenceProperties
	getExternalFencePropertiesKHR(const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFenceInfo &externalFenceInfo) const VULKAN_HPP_NOEXCEPT;

	//=== VK_KHR_performance_query ===

	VULKAN_HPP_NODISCARD std::pair<std::vector<PerformanceCounterKHR>, std::vector<PerformanceCounterDescriptionKHR>>
	enumerateQueueFamilyPerformanceQueryCountersKHR(uint32_t queueFamilyIndex) const;

	VULKAN_HPP_NODISCARD uint32_t getQueueFamilyPerformanceQueryPassesKHR(
	    const VULKAN_HPP_NAMESPACE::QueryPoolPerformanceCreateInfoKHR &performanceQueryCreateInfo) const VULKAN_HPP_NOEXCEPT;

	//=== VK_KHR_get_surface_capabilities2 ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR
	getSurfaceCapabilities2KHR(const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR &surfaceInfo) const;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...>
	getSurfaceCapabilities2KHR(const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR &surfaceInfo) const;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR>
	getSurfaceFormats2KHR(const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR &surfaceInfo) const;

	//=== VK_KHR_get_display_properties2 ===

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::DisplayProperties2KHR> getDisplayProperties2KHR() const;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR> getDisplayPlaneProperties2KHR() const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilities2KHR
	getDisplayPlaneCapabilities2KHR(const VULKAN_HPP_NAMESPACE::DisplayPlaneInfo2KHR &displayPlaneInfo) const;

	//=== VK_EXT_sample_locations ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MultisamplePropertiesEXT
	getMultisamplePropertiesEXT(VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples) const VULKAN_HPP_NOEXCEPT;

	//=== VK_EXT_calibrated_timestamps ===

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::TimeDomainEXT> getCalibrateableTimeDomainsEXT() const;

	//=== VK_KHR_fragment_shading_rate ===

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR> getFragmentShadingRatesKHR() const;

	//=== VK_EXT_tooling_info ===

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties> getToolPropertiesEXT() const;

	//=== VK_NV_cooperative_matrix ===

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV> getCooperativeMatrixPropertiesNV() const;

	//=== VK_NV_coverage_reduction_mode ===

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV> getSupportedFramebufferMixedSamplesCombinationsNV() const;

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
	//=== VK_EXT_full_screen_exclusive ===

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::PresentModeKHR>
	getSurfacePresentModes2EXT(const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR &surfaceInfo) const;
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

	//=== VK_EXT_acquire_drm_display ===

	void acquireDrmDisplayEXT(int32_t drmFd, VULKAN_HPP_NAMESPACE::DisplayKHR display) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::DisplayKHR getDrmDisplayEXT(int32_t drmFd, uint32_t connectorId) const;

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
	//=== VK_NV_acquire_winrt_display ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::DisplayKHR getWinrtDisplayNV(uint32_t deviceRelativeId) const;
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

#	if defined(VK_USE_PLATFORM_DIRECTFB_EXT)
	//=== VK_EXT_directfb_surface ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Bool32 getDirectFBPresentationSupportEXT(uint32_t queueFamilyIndex,
	                                                                                    IDirectFB &dfb) const VULKAN_HPP_NOEXCEPT;
#	endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/

#	if defined(VK_USE_PLATFORM_SCREEN_QNX)
	//=== VK_QNX_screen_surface ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Bool32 getScreenPresentationSupportQNX(uint32_t queueFamilyIndex,
	                                                                                  struct _screen_window &window) const VULKAN_HPP_NOEXCEPT;
#	endif /*VK_USE_PLATFORM_SCREEN_QNX*/

private:
	VULKAN_HPP_NAMESPACE::PhysicalDevice m_physicalDevice = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher const *m_dispatcher = nullptr;
};

class PhysicalDevices : public std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice>
{
public:
	PhysicalDevices(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &instance)
	{
		VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher const *dispatcher = instance.getDispatcher();
		std::vector<VkPhysicalDevice> physicalDevices;
		uint32_t physicalDeviceCount;
		VULKAN_HPP_NAMESPACE::Result result;
		do
		{
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
			    dispatcher->vkEnumeratePhysicalDevices(static_cast<VkInstance>(*instance), &physicalDeviceCount, nullptr));
			if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && physicalDeviceCount)
			{
				physicalDevices.resize(physicalDeviceCount);
				result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
				    dispatcher->vkEnumeratePhysicalDevices(static_cast<VkInstance>(*instance), &physicalDeviceCount, physicalDevices.data()));
			}
		} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
		if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			VULKAN_HPP_ASSERT(physicalDeviceCount <= physicalDevices.size());
			this->reserve(physicalDeviceCount);
			for(auto const &physicalDevice : physicalDevices)
			{
				this->emplace_back(instance, physicalDevice);
			}
		}
		else
		{
			throwResultException(result, "vkEnumeratePhysicalDevices");
		}
	}

	PhysicalDevices(std::nullptr_t) {}

	PhysicalDevices() = delete;
	PhysicalDevices(PhysicalDevices const &) = delete;
	PhysicalDevices(PhysicalDevices &&rhs) = default;
	PhysicalDevices &operator=(PhysicalDevices const &) = delete;
	PhysicalDevices &operator=(PhysicalDevices &&rhs) = default;
};

class Device
{
public:
	using CType = VkDevice;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDevice;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDevice;

public:
	Device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice const &physicalDevice,
	       VULKAN_HPP_NAMESPACE::DeviceCreateInfo const &createInfo,
	       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    physicalDevice.getDispatcher()->vkCreateDevice(static_cast<VkPhysicalDevice>(*physicalDevice),
		                                                   reinterpret_cast<const VkDeviceCreateInfo *>(&createInfo),
		                                                   reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                   reinterpret_cast<VkDevice *>(&m_device)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateDevice");
		}
		m_dispatcher.reset(new VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher(physicalDevice.getDispatcher()->vkGetDeviceProcAddr,
		                                                                                         static_cast<VkDevice>(m_device)));
	}

	Device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice const &physicalDevice,
	       VkDevice device,
	       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	{
		m_dispatcher.reset(new VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher(physicalDevice.getDispatcher()->vkGetDeviceProcAddr,
		                                                                                         static_cast<VkDevice>(m_device)));
	}

	Device(std::nullptr_t) {}

	~Device()
	{
		clear();
	}

	Device() = delete;
	Device(Device const &) = delete;
	Device(Device &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(rhs.m_dispatcher.release())
	{
	}
	Device &operator=(Device const &) = delete;
	Device &operator=(Device &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher.reset(rhs.m_dispatcher.release());
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::Device const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_device;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_device)
		{
			getDispatcher()->vkDestroyDevice(static_cast<VkDevice>(m_device), reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return &*m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_VERSION_1_0 ===

	VULKAN_HPP_NODISCARD PFN_vkVoidFunction getProcAddr(const std::string &name) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::Queue getQueue(uint32_t queueFamilyIndex, uint32_t queueIndex) const;

	void waitIdle() const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::DeviceMemory
	allocateMemory(VULKAN_HPP_NAMESPACE::MemoryAllocateInfo const &allocateInfo,
	               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	void flushMappedMemoryRanges(ArrayProxy<const VULKAN_HPP_NAMESPACE::MappedMemoryRange> const &memoryRanges) const;

	void invalidateMappedMemoryRanges(ArrayProxy<const VULKAN_HPP_NAMESPACE::MappedMemoryRange> const &memoryRanges) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::Fence
	createFence(VULKAN_HPP_NAMESPACE::FenceCreateInfo const &createInfo,
	            VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	void resetFences(ArrayProxy<const VULKAN_HPP_NAMESPACE::Fence> const &fences) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result
	waitForFences(ArrayProxy<const VULKAN_HPP_NAMESPACE::Fence> const &fences, VULKAN_HPP_NAMESPACE::Bool32 waitAll, uint64_t timeout) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::Semaphore
	createSemaphore(VULKAN_HPP_NAMESPACE::SemaphoreCreateInfo const &createInfo,
	                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::Event
	createEvent(VULKAN_HPP_NAMESPACE::EventCreateInfo const &createInfo,
	            VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::QueryPool
	createQueryPool(VULKAN_HPP_NAMESPACE::QueryPoolCreateInfo const &createInfo,
	                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::Buffer
	createBuffer(VULKAN_HPP_NAMESPACE::BufferCreateInfo const &createInfo,
	             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::BufferView
	createBufferView(VULKAN_HPP_NAMESPACE::BufferViewCreateInfo const &createInfo,
	                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::Image
	createImage(VULKAN_HPP_NAMESPACE::ImageCreateInfo const &createInfo,
	            VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::ImageView
	createImageView(VULKAN_HPP_NAMESPACE::ImageViewCreateInfo const &createInfo,
	                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::ShaderModule
	createShaderModule(VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo const &createInfo,
	                   VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::PipelineCache
	createPipelineCache(VULKAN_HPP_NAMESPACE::PipelineCacheCreateInfo const &createInfo,
	                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_RAII_NAMESPACE::Pipeline>
	createGraphicsPipelines(VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &pipelineCache,
	                        VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo> const &createInfos,
	                        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::Pipeline
	createGraphicsPipeline(VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &pipelineCache,
	                       VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo const &createInfo,
	                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_RAII_NAMESPACE::Pipeline>
	createComputePipelines(VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &pipelineCache,
	                       VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo> const &createInfos,
	                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::Pipeline
	createComputePipeline(VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &pipelineCache,
	                      VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo const &createInfo,
	                      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::PipelineLayout
	createPipelineLayout(VULKAN_HPP_NAMESPACE::PipelineLayoutCreateInfo const &createInfo,
	                     VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::Sampler
	createSampler(VULKAN_HPP_NAMESPACE::SamplerCreateInfo const &createInfo,
	              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::DescriptorSetLayout
	createDescriptorSetLayout(VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo const &createInfo,
	                          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::DescriptorPool
	createDescriptorPool(VULKAN_HPP_NAMESPACE::DescriptorPoolCreateInfo const &createInfo,
	                     VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_RAII_NAMESPACE::DescriptorSet>
	allocateDescriptorSets(VULKAN_HPP_NAMESPACE::DescriptorSetAllocateInfo const &allocateInfo) const;

	void updateDescriptorSets(ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteDescriptorSet> const &descriptorWrites,
	                          ArrayProxy<const VULKAN_HPP_NAMESPACE::CopyDescriptorSet> const &descriptorCopies) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::Framebuffer
	createFramebuffer(VULKAN_HPP_NAMESPACE::FramebufferCreateInfo const &createInfo,
	                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::RenderPass
	createRenderPass(VULKAN_HPP_NAMESPACE::RenderPassCreateInfo const &createInfo,
	                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::CommandPool
	createCommandPool(VULKAN_HPP_NAMESPACE::CommandPoolCreateInfo const &createInfo,
	                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_RAII_NAMESPACE::CommandBuffer>
	allocateCommandBuffers(VULKAN_HPP_NAMESPACE::CommandBufferAllocateInfo const &allocateInfo) const;

	//=== VK_VERSION_1_1 ===

	void bindBufferMemory2(ArrayProxy<const VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo> const &bindInfos) const;

	void bindImageMemory2(ArrayProxy<const VULKAN_HPP_NAMESPACE::BindImageMemoryInfo> const &bindInfos) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags
	getGroupPeerMemoryFeatures(uint32_t heapIndex, uint32_t localDeviceIndex, uint32_t remoteDeviceIndex) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2
	getImageMemoryRequirements2(const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 &info) const VULKAN_HPP_NOEXCEPT;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...>
	getImageMemoryRequirements2(const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 &info) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2
	getBufferMemoryRequirements2(const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 &info) const VULKAN_HPP_NOEXCEPT;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...>
	getBufferMemoryRequirements2(const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 &info) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>
	getImageSparseMemoryRequirements2(const VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2 &info) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::Queue getQueue2(VULKAN_HPP_NAMESPACE::DeviceQueueInfo2 const &queueInfo) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::SamplerYcbcrConversion
	createSamplerYcbcrConversion(VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo const &createInfo,
	                             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::DescriptorUpdateTemplate
	createDescriptorUpdateTemplate(VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo const &createInfo,
	                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport
	getDescriptorSetLayoutSupport(const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo &createInfo) const VULKAN_HPP_NOEXCEPT;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...>
	getDescriptorSetLayoutSupport(const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo &createInfo) const VULKAN_HPP_NOEXCEPT;

	//=== VK_VERSION_1_2 ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::RenderPass
	createRenderPass2(VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 const &createInfo,
	                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result waitSemaphores(const VULKAN_HPP_NAMESPACE::SemaphoreWaitInfo &waitInfo, uint64_t timeout) const;

	void signalSemaphore(const VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo &signalInfo) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DeviceAddress
	getBufferAddress(const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo &info) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD uint64_t getBufferOpaqueCaptureAddress(const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo &info) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD uint64_t
	getMemoryOpaqueCaptureAddress(const VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo &info) const VULKAN_HPP_NOEXCEPT;

	//=== VK_VERSION_1_3 ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::PrivateDataSlot
	createPrivateDataSlot(VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo const &createInfo,
	                      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	void setPrivateData(VULKAN_HPP_NAMESPACE::ObjectType objectType_,
	                    uint64_t objectHandle,
	                    VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,
	                    uint64_t data) const;

	VULKAN_HPP_NODISCARD uint64_t getPrivateData(VULKAN_HPP_NAMESPACE::ObjectType objectType_,
	                                             uint64_t objectHandle,
	                                             VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2
	getBufferMemoryRequirements(const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements &info) const VULKAN_HPP_NOEXCEPT;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...>
	getBufferMemoryRequirements(const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements &info) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2
	getImageMemoryRequirements(const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements &info) const VULKAN_HPP_NOEXCEPT;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...>
	getImageMemoryRequirements(const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements &info) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>
	getImageSparseMemoryRequirements(const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements &info) const VULKAN_HPP_NOEXCEPT;

	//=== VK_KHR_swapchain ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::SwapchainKHR
	createSwapchainKHR(VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR const &createInfo,
	                   VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DeviceGroupPresentCapabilitiesKHR getGroupPresentCapabilitiesKHR() const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR
	getGroupSurfacePresentModesKHR(VULKAN_HPP_NAMESPACE::SurfaceKHR surface) const;

	VULKAN_HPP_NODISCARD std::pair<VULKAN_HPP_NAMESPACE::Result, uint32_t>
	acquireNextImage2KHR(const VULKAN_HPP_NAMESPACE::AcquireNextImageInfoKHR &acquireInfo) const;

	//=== VK_KHR_display_swapchain ===

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_RAII_NAMESPACE::SwapchainKHR>
	createSharedSwapchainsKHR(VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR> const &createInfos,
	                          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::SwapchainKHR
	createSharedSwapchainKHR(VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR const &createInfo,
	                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	//=== VK_EXT_debug_marker ===

	void debugMarkerSetObjectTagEXT(const VULKAN_HPP_NAMESPACE::DebugMarkerObjectTagInfoEXT &tagInfo) const;

	void debugMarkerSetObjectNameEXT(const VULKAN_HPP_NAMESPACE::DebugMarkerObjectNameInfoEXT &nameInfo) const;

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
	//=== VK_KHR_video_queue ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::VideoSessionKHR
	createVideoSessionKHR(VULKAN_HPP_NAMESPACE::VideoSessionCreateInfoKHR const &createInfo,
	                      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::VideoSessionParametersKHR
	createVideoSessionParametersKHR(VULKAN_HPP_NAMESPACE::VideoSessionParametersCreateInfoKHR const &createInfo,
	                                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

	//=== VK_NVX_binary_import ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::CuModuleNVX
	createCuModuleNVX(VULKAN_HPP_NAMESPACE::CuModuleCreateInfoNVX const &createInfo,
	                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::CuFunctionNVX
	createCuFunctionNVX(VULKAN_HPP_NAMESPACE::CuFunctionCreateInfoNVX const &createInfo,
	                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	//=== VK_NVX_image_view_handle ===

	VULKAN_HPP_NODISCARD uint32_t getImageViewHandleNVX(const VULKAN_HPP_NAMESPACE::ImageViewHandleInfoNVX &info) const VULKAN_HPP_NOEXCEPT;

	//=== VK_KHR_device_group ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags
	getGroupPeerMemoryFeaturesKHR(uint32_t heapIndex, uint32_t localDeviceIndex, uint32_t remoteDeviceIndex) const VULKAN_HPP_NOEXCEPT;

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
	//=== VK_KHR_external_memory_win32 ===

	VULKAN_HPP_NODISCARD HANDLE getMemoryWin32HandleKHR(const VULKAN_HPP_NAMESPACE::MemoryGetWin32HandleInfoKHR &getWin32HandleInfo) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryWin32HandlePropertiesKHR
	getMemoryWin32HandlePropertiesKHR(VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType, HANDLE handle) const;
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

	//=== VK_KHR_external_memory_fd ===

	VULKAN_HPP_NODISCARD int getMemoryFdKHR(const VULKAN_HPP_NAMESPACE::MemoryGetFdInfoKHR &getFdInfo) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryFdPropertiesKHR
	getMemoryFdPropertiesKHR(VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType, int fd) const;

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
	//=== VK_KHR_external_semaphore_win32 ===

	void importSemaphoreWin32HandleKHR(const VULKAN_HPP_NAMESPACE::ImportSemaphoreWin32HandleInfoKHR &importSemaphoreWin32HandleInfo) const;

	VULKAN_HPP_NODISCARD HANDLE getSemaphoreWin32HandleKHR(const VULKAN_HPP_NAMESPACE::SemaphoreGetWin32HandleInfoKHR &getWin32HandleInfo) const;
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

	//=== VK_KHR_external_semaphore_fd ===

	void importSemaphoreFdKHR(const VULKAN_HPP_NAMESPACE::ImportSemaphoreFdInfoKHR &importSemaphoreFdInfo) const;

	VULKAN_HPP_NODISCARD int getSemaphoreFdKHR(const VULKAN_HPP_NAMESPACE::SemaphoreGetFdInfoKHR &getFdInfo) const;

	//=== VK_KHR_descriptor_update_template ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::DescriptorUpdateTemplate
	createDescriptorUpdateTemplateKHR(VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo const &createInfo,
	                                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	void destroyDescriptorUpdateTemplateKHR(VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,
	                                        Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator
	                                            VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT;

	//=== VK_EXT_display_control ===

	void displayPowerControlEXT(VULKAN_HPP_NAMESPACE::DisplayKHR display, const VULKAN_HPP_NAMESPACE::DisplayPowerInfoEXT &displayPowerInfo) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::Fence
	registerEventEXT(VULKAN_HPP_NAMESPACE::DeviceEventInfoEXT const &deviceEventInfo,
	                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::Fence
	registerDisplayEventEXT(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR const &display,
	                        VULKAN_HPP_NAMESPACE::DisplayEventInfoEXT const &displayEventInfo,
	                        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	//=== VK_EXT_hdr_metadata ===

	void setHdrMetadataEXT(ArrayProxy<const VULKAN_HPP_NAMESPACE::SwapchainKHR> const &swapchains,
	                       ArrayProxy<const VULKAN_HPP_NAMESPACE::HdrMetadataEXT> const &metadata) const;

	//=== VK_KHR_create_renderpass2 ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::RenderPass
	createRenderPass2KHR(VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 const &createInfo,
	                     VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
	//=== VK_KHR_external_fence_win32 ===

	void importFenceWin32HandleKHR(const VULKAN_HPP_NAMESPACE::ImportFenceWin32HandleInfoKHR &importFenceWin32HandleInfo) const;

	VULKAN_HPP_NODISCARD HANDLE getFenceWin32HandleKHR(const VULKAN_HPP_NAMESPACE::FenceGetWin32HandleInfoKHR &getWin32HandleInfo) const;
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

	//=== VK_KHR_external_fence_fd ===

	void importFenceFdKHR(const VULKAN_HPP_NAMESPACE::ImportFenceFdInfoKHR &importFenceFdInfo) const;

	VULKAN_HPP_NODISCARD int getFenceFdKHR(const VULKAN_HPP_NAMESPACE::FenceGetFdInfoKHR &getFdInfo) const;

	//=== VK_KHR_performance_query ===

	void acquireProfilingLockKHR(const VULKAN_HPP_NAMESPACE::AcquireProfilingLockInfoKHR &info) const;

	void releaseProfilingLockKHR() const VULKAN_HPP_NOEXCEPT;

	//=== VK_EXT_debug_utils ===

	void setDebugUtilsObjectNameEXT(const VULKAN_HPP_NAMESPACE::DebugUtilsObjectNameInfoEXT &nameInfo) const;

	void setDebugUtilsObjectTagEXT(const VULKAN_HPP_NAMESPACE::DebugUtilsObjectTagInfoEXT &tagInfo) const;

#	if defined(VK_USE_PLATFORM_ANDROID_KHR)
	//=== VK_ANDROID_external_memory_android_hardware_buffer ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID
	getAndroidHardwareBufferPropertiesANDROID(const struct AHardwareBuffer &buffer) const;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...> getAndroidHardwareBufferPropertiesANDROID(const struct AHardwareBuffer &buffer) const;

	VULKAN_HPP_NODISCARD struct AHardwareBuffer *
	getMemoryAndroidHardwareBufferANDROID(const VULKAN_HPP_NAMESPACE::MemoryGetAndroidHardwareBufferInfoANDROID &info) const;
#	endif /*VK_USE_PLATFORM_ANDROID_KHR*/

	//=== VK_KHR_get_memory_requirements2 ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2
	getImageMemoryRequirements2KHR(const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 &info) const VULKAN_HPP_NOEXCEPT;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...>
	getImageMemoryRequirements2KHR(const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 &info) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2
	getBufferMemoryRequirements2KHR(const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 &info) const VULKAN_HPP_NOEXCEPT;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...>
	getBufferMemoryRequirements2KHR(const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 &info) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>
	getImageSparseMemoryRequirements2KHR(const VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2 &info) const VULKAN_HPP_NOEXCEPT;

	//=== VK_KHR_acceleration_structure ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::AccelerationStructureKHR
	createAccelerationStructureKHR(VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoKHR const &createInfo,
	                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result
	buildAccelerationStructuresKHR(VULKAN_HPP_NAMESPACE::DeferredOperationKHR deferredOperation,
	                               ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR> const &infos,
	                               ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR *const> const &pBuildRangeInfos) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result
	copyAccelerationStructureKHR(VULKAN_HPP_NAMESPACE::DeferredOperationKHR deferredOperation,
	                             const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR &info) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result
	copyAccelerationStructureToMemoryKHR(VULKAN_HPP_NAMESPACE::DeferredOperationKHR deferredOperation,
	                                     const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureToMemoryInfoKHR &info) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result
	copyMemoryToAccelerationStructureKHR(VULKAN_HPP_NAMESPACE::DeferredOperationKHR deferredOperation,
	                                     const VULKAN_HPP_NAMESPACE::CopyMemoryToAccelerationStructureInfoKHR &info) const;

	template<typename DataType>
	VULKAN_HPP_NODISCARD std::vector<DataType>
	writeAccelerationStructuresPropertiesKHR(ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR> const &accelerationStructures,
	                                         VULKAN_HPP_NAMESPACE::QueryType queryType,
	                                         size_t dataSize,
	                                         size_t stride) const;

	template<typename DataType>
	VULKAN_HPP_NODISCARD DataType
	writeAccelerationStructuresPropertyKHR(ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR> const &accelerationStructures,
	                                       VULKAN_HPP_NAMESPACE::QueryType queryType,
	                                       size_t stride) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DeviceAddress
	getAccelerationStructureAddressKHR(const VULKAN_HPP_NAMESPACE::AccelerationStructureDeviceAddressInfoKHR &info) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::AccelerationStructureCompatibilityKHR
	getAccelerationStructureCompatibilityKHR(const VULKAN_HPP_NAMESPACE::AccelerationStructureVersionInfoKHR &versionInfo) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR
	getAccelerationStructureBuildSizesKHR(VULKAN_HPP_NAMESPACE::AccelerationStructureBuildTypeKHR buildType,
	                                      const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR &buildInfo,
	                                      ArrayProxy<const uint32_t> const &maxPrimitiveCounts VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT) const;

	//=== VK_KHR_sampler_ycbcr_conversion ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::SamplerYcbcrConversion
	createSamplerYcbcrConversionKHR(VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo const &createInfo,
	                                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	void destroySamplerYcbcrConversionKHR(VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion ycbcrConversion VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,
	                                      Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator
	                                          VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT;

	//=== VK_KHR_bind_memory2 ===

	void bindBufferMemory2KHR(ArrayProxy<const VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo> const &bindInfos) const;

	void bindImageMemory2KHR(ArrayProxy<const VULKAN_HPP_NAMESPACE::BindImageMemoryInfo> const &bindInfos) const;

	//=== VK_EXT_validation_cache ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::ValidationCacheEXT
	createValidationCacheEXT(VULKAN_HPP_NAMESPACE::ValidationCacheCreateInfoEXT const &createInfo,
	                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	//=== VK_NV_ray_tracing ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::AccelerationStructureNV
	createAccelerationStructureNV(VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoNV const &createInfo,
	                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2KHR getAccelerationStructureMemoryRequirementsNV(
	    const VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsInfoNV &info) const VULKAN_HPP_NOEXCEPT;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...> getAccelerationStructureMemoryRequirementsNV(
	    const VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsInfoNV &info) const VULKAN_HPP_NOEXCEPT;

	void bindAccelerationStructureMemoryNV(ArrayProxy<const VULKAN_HPP_NAMESPACE::BindAccelerationStructureMemoryInfoNV> const &bindInfos) const;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_RAII_NAMESPACE::Pipeline>
	createRayTracingPipelinesNV(VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &pipelineCache,
	                            VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV> const &createInfos,
	                            VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::Pipeline
	createRayTracingPipelineNV(VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &pipelineCache,
	                           VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV const &createInfo,
	                           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	//=== VK_KHR_maintenance3 ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport
	getDescriptorSetLayoutSupportKHR(const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo &createInfo) const VULKAN_HPP_NOEXCEPT;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...>
	getDescriptorSetLayoutSupportKHR(const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo &createInfo) const VULKAN_HPP_NOEXCEPT;

	//=== VK_EXT_external_memory_host ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryHostPointerPropertiesEXT
	getMemoryHostPointerPropertiesEXT(VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType, const void *pHostPointer) const;

	//=== VK_EXT_calibrated_timestamps ===

	VULKAN_HPP_NODISCARD std::pair<std::vector<uint64_t>, uint64_t>
	getCalibratedTimestampsEXT(ArrayProxy<const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoEXT> const &timestampInfos) const;

	VULKAN_HPP_NODISCARD std::pair<uint64_t, uint64_t>
	getCalibratedTimestampEXT(const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoEXT &timestampInfo) const;

	//=== VK_KHR_timeline_semaphore ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result waitSemaphoresKHR(const VULKAN_HPP_NAMESPACE::SemaphoreWaitInfo &waitInfo, uint64_t timeout) const;

	void signalSemaphoreKHR(const VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo &signalInfo) const;

	//=== VK_INTEL_performance_query ===

	void initializePerformanceApiINTEL(const VULKAN_HPP_NAMESPACE::InitializePerformanceApiInfoINTEL &initializeInfo) const;

	void uninitializePerformanceApiINTEL() const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::PerformanceConfigurationINTEL
	acquirePerformanceConfigurationINTEL(VULKAN_HPP_NAMESPACE::PerformanceConfigurationAcquireInfoINTEL const &acquireInfo) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::PerformanceValueINTEL
	getPerformanceParameterINTEL(VULKAN_HPP_NAMESPACE::PerformanceParameterTypeINTEL parameter) const;

	//=== VK_EXT_buffer_device_address ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DeviceAddress
	getBufferAddressEXT(const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo &info) const VULKAN_HPP_NOEXCEPT;

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
	//=== VK_EXT_full_screen_exclusive ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR
	getGroupSurfacePresentModes2EXT(const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR &surfaceInfo) const;
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

	//=== VK_KHR_buffer_device_address ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DeviceAddress
	getBufferAddressKHR(const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo &info) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD uint64_t getBufferOpaqueCaptureAddressKHR(const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo &info) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD uint64_t
	getMemoryOpaqueCaptureAddressKHR(const VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo &info) const VULKAN_HPP_NOEXCEPT;

	//=== VK_KHR_deferred_host_operations ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::DeferredOperationKHR
	createDeferredOperationKHR(VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	//=== VK_KHR_pipeline_executable_properties ===

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR>
	getPipelineExecutablePropertiesKHR(const VULKAN_HPP_NAMESPACE::PipelineInfoKHR &pipelineInfo) const;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR>
	getPipelineExecutableStatisticsKHR(const VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR &executableInfo) const;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR>
	getPipelineExecutableInternalRepresentationsKHR(const VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR &executableInfo) const;

	//=== VK_NV_device_generated_commands ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2
	getGeneratedCommandsMemoryRequirementsNV(const VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoNV &info) const VULKAN_HPP_NOEXCEPT;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...>
	getGeneratedCommandsMemoryRequirementsNV(const VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoNV &info) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::IndirectCommandsLayoutNV
	createIndirectCommandsLayoutNV(VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoNV const &createInfo,
	                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	//=== VK_EXT_private_data ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::PrivateDataSlot
	createPrivateDataSlotEXT(VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo const &createInfo,
	                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	void destroyPrivateDataSlotEXT(VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,
	                               Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator
	                                   VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT;

	void setPrivateDataEXT(VULKAN_HPP_NAMESPACE::ObjectType objectType_,
	                       uint64_t objectHandle,
	                       VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,
	                       uint64_t data) const;

	VULKAN_HPP_NODISCARD uint64_t getPrivateDataEXT(VULKAN_HPP_NAMESPACE::ObjectType objectType_,
	                                                uint64_t objectHandle,
	                                                VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot) const VULKAN_HPP_NOEXCEPT;

	//=== VK_KHR_ray_tracing_pipeline ===

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_RAII_NAMESPACE::Pipeline> createRayTracingPipelinesKHR(
	    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeferredOperationKHR> const &deferredOperation,
	    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &pipelineCache,
	    VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR> const &createInfos,
	    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::Pipeline createRayTracingPipelineKHR(
	    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeferredOperationKHR> const &deferredOperation,
	    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &pipelineCache,
	    VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR const &createInfo,
	    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

#	if defined(VK_USE_PLATFORM_FUCHSIA)
	//=== VK_FUCHSIA_external_memory ===

	VULKAN_HPP_NODISCARD zx_handle_t getMemoryZirconHandleFUCHSIA(const VULKAN_HPP_NAMESPACE::MemoryGetZirconHandleInfoFUCHSIA &getZirconHandleInfo) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryZirconHandlePropertiesFUCHSIA
	getMemoryZirconHandlePropertiesFUCHSIA(VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType, zx_handle_t zirconHandle) const;
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

#	if defined(VK_USE_PLATFORM_FUCHSIA)
	//=== VK_FUCHSIA_external_semaphore ===

	void importSemaphoreZirconHandleFUCHSIA(const VULKAN_HPP_NAMESPACE::ImportSemaphoreZirconHandleInfoFUCHSIA &importSemaphoreZirconHandleInfo) const;

	VULKAN_HPP_NODISCARD zx_handle_t
	getSemaphoreZirconHandleFUCHSIA(const VULKAN_HPP_NAMESPACE::SemaphoreGetZirconHandleInfoFUCHSIA &getZirconHandleInfo) const;
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

#	if defined(VK_USE_PLATFORM_FUCHSIA)
	//=== VK_FUCHSIA_buffer_collection ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::BufferCollectionFUCHSIA
	createBufferCollectionFUCHSIA(VULKAN_HPP_NAMESPACE::BufferCollectionCreateInfoFUCHSIA const &createInfo,
	                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

	//=== VK_NV_external_memory_rdma ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::RemoteAddressNV
	getMemoryRemoteAddressNV(const VULKAN_HPP_NAMESPACE::MemoryGetRemoteAddressInfoNV &memoryGetRemoteAddressInfo) const;

	//=== VK_KHR_maintenance4 ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2
	getBufferMemoryRequirementsKHR(const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements &info) const VULKAN_HPP_NOEXCEPT;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...>
	getBufferMemoryRequirementsKHR(const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements &info) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements2
	getImageMemoryRequirementsKHR(const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements &info) const VULKAN_HPP_NOEXCEPT;

	template<typename X, typename Y, typename... Z>
	VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...>
	getImageMemoryRequirementsKHR(const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements &info) const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>
	getImageSparseMemoryRequirementsKHR(const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements &info) const VULKAN_HPP_NOEXCEPT;

	//=== VK_VALVE_descriptor_set_host_mapping ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DescriptorSetLayoutHostMappingInfoVALVE getDescriptorSetLayoutHostMappingInfoVALVE(
	    const VULKAN_HPP_NAMESPACE::DescriptorSetBindingReferenceVALVE &bindingReference) const VULKAN_HPP_NOEXCEPT;

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	std::unique_ptr<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher> m_dispatcher;
};

class AccelerationStructureKHR
{
public:
	using CType = VkAccelerationStructureKHR;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eAccelerationStructureKHR;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eAccelerationStructureKHR;

public:
	AccelerationStructureKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                         VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoKHR const &createInfo,
	                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkCreateAccelerationStructureKHR(static_cast<VkDevice>(*device),
		                                                             reinterpret_cast<const VkAccelerationStructureCreateInfoKHR *>(&createInfo),
		                                                             reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                             reinterpret_cast<VkAccelerationStructureKHR *>(&m_accelerationStructure)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateAccelerationStructureKHR");
		}
	}

	AccelerationStructureKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                         VkAccelerationStructureKHR accelerationStructure,
	                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_accelerationStructure(accelerationStructure)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	AccelerationStructureKHR(std::nullptr_t) {}

	~AccelerationStructureKHR()
	{
		clear();
	}

	AccelerationStructureKHR() = delete;
	AccelerationStructureKHR(AccelerationStructureKHR const &) = delete;
	AccelerationStructureKHR(AccelerationStructureKHR &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_accelerationStructure(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_accelerationStructure, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	AccelerationStructureKHR &operator=(AccelerationStructureKHR const &) = delete;
	AccelerationStructureKHR &operator=(AccelerationStructureKHR &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_accelerationStructure = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_accelerationStructure, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::AccelerationStructureKHR const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_accelerationStructure;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_accelerationStructure)
		{
			getDispatcher()->vkDestroyAccelerationStructureKHR(static_cast<VkDevice>(m_device),
			                                                   static_cast<VkAccelerationStructureKHR>(m_accelerationStructure),
			                                                   reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_accelerationStructure = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::AccelerationStructureKHR &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_accelerationStructure, rhs.m_accelerationStructure);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::AccelerationStructureKHR m_accelerationStructure = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class AccelerationStructureNV
{
public:
	using CType = VkAccelerationStructureNV;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eAccelerationStructureNV;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eAccelerationStructureNV;

public:
	AccelerationStructureNV(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                        VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoNV const &createInfo,
	                        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkCreateAccelerationStructureNV(static_cast<VkDevice>(*device),
		                                                            reinterpret_cast<const VkAccelerationStructureCreateInfoNV *>(&createInfo),
		                                                            reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                            reinterpret_cast<VkAccelerationStructureNV *>(&m_accelerationStructure)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateAccelerationStructureNV");
		}
	}

	AccelerationStructureNV(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                        VkAccelerationStructureNV accelerationStructure,
	                        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_accelerationStructure(accelerationStructure)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	AccelerationStructureNV(std::nullptr_t) {}

	~AccelerationStructureNV()
	{
		clear();
	}

	AccelerationStructureNV() = delete;
	AccelerationStructureNV(AccelerationStructureNV const &) = delete;
	AccelerationStructureNV(AccelerationStructureNV &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_accelerationStructure(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_accelerationStructure, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	AccelerationStructureNV &operator=(AccelerationStructureNV const &) = delete;
	AccelerationStructureNV &operator=(AccelerationStructureNV &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_accelerationStructure = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_accelerationStructure, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::AccelerationStructureNV const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_accelerationStructure;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_accelerationStructure)
		{
			getDispatcher()->vkDestroyAccelerationStructureNV(static_cast<VkDevice>(m_device),
			                                                  static_cast<VkAccelerationStructureNV>(m_accelerationStructure),
			                                                  reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_accelerationStructure = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::AccelerationStructureNV &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_accelerationStructure, rhs.m_accelerationStructure);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_NV_ray_tracing ===

	template<typename DataType>
	VULKAN_HPP_NODISCARD std::vector<DataType> getHandle(size_t dataSize) const;

	template<typename DataType>
	VULKAN_HPP_NODISCARD DataType getHandle() const;

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::AccelerationStructureNV m_accelerationStructure = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class Buffer
{
public:
	using CType = VkBuffer;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eBuffer;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eBuffer;

public:
	Buffer(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	       VULKAN_HPP_NAMESPACE::BufferCreateInfo const &createInfo,
	       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result =
		    static_cast<VULKAN_HPP_NAMESPACE::Result>(device.getDispatcher()->vkCreateBuffer(static_cast<VkDevice>(*device),
		                                                                                     reinterpret_cast<const VkBufferCreateInfo *>(&createInfo),
		                                                                                     reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                                                     reinterpret_cast<VkBuffer *>(&m_buffer)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateBuffer");
		}
	}

	Buffer(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	       VkBuffer buffer,
	       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_buffer(buffer)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	Buffer(std::nullptr_t) {}

	~Buffer()
	{
		clear();
	}

	Buffer() = delete;
	Buffer(Buffer const &) = delete;
	Buffer(Buffer &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_buffer(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_buffer, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	Buffer &operator=(Buffer const &) = delete;
	Buffer &operator=(Buffer &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_buffer = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_buffer, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::Buffer const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_buffer;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_buffer)
		{
			getDispatcher()->vkDestroyBuffer(
			    static_cast<VkDevice>(m_device), static_cast<VkBuffer>(m_buffer), reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_buffer = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Buffer &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_buffer, rhs.m_buffer);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_VERSION_1_0 ===

	void bindMemory(VULKAN_HPP_NAMESPACE::DeviceMemory memory, VULKAN_HPP_NAMESPACE::DeviceSize memoryOffset) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements getMemoryRequirements() const VULKAN_HPP_NOEXCEPT;

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::Buffer m_buffer = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

#	if defined(VK_USE_PLATFORM_FUCHSIA)
class BufferCollectionFUCHSIA
{
public:
	using CType = VkBufferCollectionFUCHSIA;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eBufferCollectionFUCHSIA;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eBufferCollectionFUCHSIA;

public:
	BufferCollectionFUCHSIA(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                        VULKAN_HPP_NAMESPACE::BufferCollectionCreateInfoFUCHSIA const &createInfo,
	                        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkCreateBufferCollectionFUCHSIA(static_cast<VkDevice>(*device),
		                                                            reinterpret_cast<const VkBufferCollectionCreateInfoFUCHSIA *>(&createInfo),
		                                                            reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                            reinterpret_cast<VkBufferCollectionFUCHSIA *>(&m_collection)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateBufferCollectionFUCHSIA");
		}
	}

	BufferCollectionFUCHSIA(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                        VkBufferCollectionFUCHSIA collection,
	                        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_collection(collection)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	BufferCollectionFUCHSIA(std::nullptr_t) {}

	~BufferCollectionFUCHSIA()
	{
		clear();
	}

	BufferCollectionFUCHSIA() = delete;
	BufferCollectionFUCHSIA(BufferCollectionFUCHSIA const &) = delete;
	BufferCollectionFUCHSIA(BufferCollectionFUCHSIA &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_collection(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_collection, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	BufferCollectionFUCHSIA &operator=(BufferCollectionFUCHSIA const &) = delete;
	BufferCollectionFUCHSIA &operator=(BufferCollectionFUCHSIA &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_collection = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_collection, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_collection;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_collection)
		{
			getDispatcher()->vkDestroyBufferCollectionFUCHSIA(static_cast<VkDevice>(m_device),
			                                                  static_cast<VkBufferCollectionFUCHSIA>(m_collection),
			                                                  reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_collection = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::BufferCollectionFUCHSIA &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_collection, rhs.m_collection);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_FUCHSIA_buffer_collection ===

	void setImageConstraints(const VULKAN_HPP_NAMESPACE::ImageConstraintsInfoFUCHSIA &imageConstraintsInfo) const;

	void setBufferConstraints(const VULKAN_HPP_NAMESPACE::BufferConstraintsInfoFUCHSIA &bufferConstraintsInfo) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::BufferCollectionPropertiesFUCHSIA getProperties() const;

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA m_collection = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

class BufferView
{
public:
	using CType = VkBufferView;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eBufferView;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eBufferView;

public:
	BufferView(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	           VULKAN_HPP_NAMESPACE::BufferViewCreateInfo const &createInfo,
	           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkCreateBufferView(static_cast<VkDevice>(*device),
		                                               reinterpret_cast<const VkBufferViewCreateInfo *>(&createInfo),
		                                               reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                               reinterpret_cast<VkBufferView *>(&m_bufferView)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateBufferView");
		}
	}

	BufferView(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	           VkBufferView bufferView,
	           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_bufferView(bufferView)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	BufferView(std::nullptr_t) {}

	~BufferView()
	{
		clear();
	}

	BufferView() = delete;
	BufferView(BufferView const &) = delete;
	BufferView(BufferView &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_bufferView(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_bufferView, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	BufferView &operator=(BufferView const &) = delete;
	BufferView &operator=(BufferView &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_bufferView = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_bufferView, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::BufferView const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_bufferView;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_bufferView)
		{
			getDispatcher()->vkDestroyBufferView(
			    static_cast<VkDevice>(m_device), static_cast<VkBufferView>(m_bufferView), reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_bufferView = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::BufferView &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_bufferView, rhs.m_bufferView);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::BufferView m_bufferView = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class CommandPool
{
public:
	using CType = VkCommandPool;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eCommandPool;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCommandPool;

public:
	CommandPool(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	            VULKAN_HPP_NAMESPACE::CommandPoolCreateInfo const &createInfo,
	            VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkCreateCommandPool(static_cast<VkDevice>(*device),
		                                                reinterpret_cast<const VkCommandPoolCreateInfo *>(&createInfo),
		                                                reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                reinterpret_cast<VkCommandPool *>(&m_commandPool)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateCommandPool");
		}
	}

	CommandPool(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	            VkCommandPool commandPool,
	            VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_commandPool(commandPool)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	CommandPool(std::nullptr_t) {}

	~CommandPool()
	{
		clear();
	}

	CommandPool() = delete;
	CommandPool(CommandPool const &) = delete;
	CommandPool(CommandPool &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_commandPool(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_commandPool, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	CommandPool &operator=(CommandPool const &) = delete;
	CommandPool &operator=(CommandPool &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_commandPool = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_commandPool, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::CommandPool const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_commandPool;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_commandPool)
		{
			getDispatcher()->vkDestroyCommandPool(
			    static_cast<VkDevice>(m_device), static_cast<VkCommandPool>(m_commandPool), reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_commandPool = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CommandPool &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_commandPool, rhs.m_commandPool);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_VERSION_1_0 ===

	void reset(VULKAN_HPP_NAMESPACE::CommandPoolResetFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const;

	//=== VK_VERSION_1_1 ===

	void trim(VULKAN_HPP_NAMESPACE::CommandPoolTrimFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT;

	//=== VK_KHR_maintenance1 ===

	void trimKHR(VULKAN_HPP_NAMESPACE::CommandPoolTrimFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT;

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::CommandPool m_commandPool = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class CommandBuffer
{
public:
	using CType = VkCommandBuffer;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eCommandBuffer;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCommandBuffer;

public:
	CommandBuffer(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device, VkCommandBuffer commandBuffer, VkCommandPool commandPool)
	    : m_device(*device)
	    , m_commandPool(commandPool)
	    , m_commandBuffer(commandBuffer)
	    , m_dispatcher(device.getDispatcher())
	{
	}

	CommandBuffer(std::nullptr_t) {}

	~CommandBuffer()
	{
		clear();
	}

	CommandBuffer() = delete;
	CommandBuffer(CommandBuffer const &) = delete;
	CommandBuffer(CommandBuffer &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_commandPool(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_commandPool, {})),
	      m_commandBuffer(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_commandBuffer, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	CommandBuffer &operator=(CommandBuffer const &) = delete;
	CommandBuffer &operator=(CommandBuffer &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_commandPool = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_commandPool, {});
			m_commandBuffer = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_commandBuffer, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::CommandBuffer const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_commandBuffer;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_commandBuffer)
		{
			getDispatcher()->vkFreeCommandBuffers(
			    static_cast<VkDevice>(m_device), static_cast<VkCommandPool>(m_commandPool), 1, reinterpret_cast<VkCommandBuffer const *>(&m_commandBuffer));
		}
		m_device = nullptr;
		m_commandPool = nullptr;
		m_commandBuffer = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CommandBuffer &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_commandPool, rhs.m_commandPool);
		std::swap(m_commandBuffer, rhs.m_commandBuffer);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_VERSION_1_0 ===

	void begin(const VULKAN_HPP_NAMESPACE::CommandBufferBeginInfo &beginInfo) const;

	void end() const;

	void reset(VULKAN_HPP_NAMESPACE::CommandBufferResetFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const;

	void bindPipeline(VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint, VULKAN_HPP_NAMESPACE::Pipeline pipeline) const VULKAN_HPP_NOEXCEPT;

	void setViewport(uint32_t firstViewport, ArrayProxy<const VULKAN_HPP_NAMESPACE::Viewport> const &viewports) const VULKAN_HPP_NOEXCEPT;

	void setScissor(uint32_t firstScissor, ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const &scissors) const VULKAN_HPP_NOEXCEPT;

	void setLineWidth(float lineWidth) const VULKAN_HPP_NOEXCEPT;

	void setDepthBias(float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) const VULKAN_HPP_NOEXCEPT;

	void setBlendConstants(const float blendConstants[4]) const VULKAN_HPP_NOEXCEPT;

	void setDepthBounds(float minDepthBounds, float maxDepthBounds) const VULKAN_HPP_NOEXCEPT;

	void setStencilCompareMask(VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask, uint32_t compareMask) const VULKAN_HPP_NOEXCEPT;

	void setStencilWriteMask(VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask, uint32_t writeMask) const VULKAN_HPP_NOEXCEPT;

	void setStencilReference(VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask, uint32_t reference) const VULKAN_HPP_NOEXCEPT;

	void bindDescriptorSets(VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint,
	                        VULKAN_HPP_NAMESPACE::PipelineLayout layout,
	                        uint32_t firstSet,
	                        ArrayProxy<const VULKAN_HPP_NAMESPACE::DescriptorSet> const &descriptorSets,
	                        ArrayProxy<const uint32_t> const &dynamicOffsets) const VULKAN_HPP_NOEXCEPT;

	void bindIndexBuffer(VULKAN_HPP_NAMESPACE::Buffer buffer,
	                     VULKAN_HPP_NAMESPACE::DeviceSize offset,
	                     VULKAN_HPP_NAMESPACE::IndexType indexType) const VULKAN_HPP_NOEXCEPT;

	void bindVertexBuffers(uint32_t firstBinding,
	                       ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &buffers,
	                       ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &offsets) const;

	void draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) const VULKAN_HPP_NOEXCEPT;

	void
	drawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const VULKAN_HPP_NOEXCEPT;

	void drawIndirect(VULKAN_HPP_NAMESPACE::Buffer buffer,
	                  VULKAN_HPP_NAMESPACE::DeviceSize offset,
	                  uint32_t drawCount,
	                  uint32_t stride) const VULKAN_HPP_NOEXCEPT;

	void drawIndexedIndirect(VULKAN_HPP_NAMESPACE::Buffer buffer,
	                         VULKAN_HPP_NAMESPACE::DeviceSize offset,
	                         uint32_t drawCount,
	                         uint32_t stride) const VULKAN_HPP_NOEXCEPT;

	void dispatch(uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) const VULKAN_HPP_NOEXCEPT;

	void dispatchIndirect(VULKAN_HPP_NAMESPACE::Buffer buffer, VULKAN_HPP_NAMESPACE::DeviceSize offset) const VULKAN_HPP_NOEXCEPT;

	void copyBuffer(VULKAN_HPP_NAMESPACE::Buffer srcBuffer,
	                VULKAN_HPP_NAMESPACE::Buffer dstBuffer,
	                ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferCopy> const &regions) const VULKAN_HPP_NOEXCEPT;

	void copyImage(VULKAN_HPP_NAMESPACE::Image srcImage,
	               VULKAN_HPP_NAMESPACE::ImageLayout srcImageLayout,
	               VULKAN_HPP_NAMESPACE::Image dstImage,
	               VULKAN_HPP_NAMESPACE::ImageLayout dstImageLayout,
	               ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageCopy> const &regions) const VULKAN_HPP_NOEXCEPT;

	void blitImage(VULKAN_HPP_NAMESPACE::Image srcImage,
	               VULKAN_HPP_NAMESPACE::ImageLayout srcImageLayout,
	               VULKAN_HPP_NAMESPACE::Image dstImage,
	               VULKAN_HPP_NAMESPACE::ImageLayout dstImageLayout,
	               ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageBlit> const &regions,
	               VULKAN_HPP_NAMESPACE::Filter filter) const VULKAN_HPP_NOEXCEPT;

	void copyBufferToImage(VULKAN_HPP_NAMESPACE::Buffer srcBuffer,
	                       VULKAN_HPP_NAMESPACE::Image dstImage,
	                       VULKAN_HPP_NAMESPACE::ImageLayout dstImageLayout,
	                       ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferImageCopy> const &regions) const VULKAN_HPP_NOEXCEPT;

	void copyImageToBuffer(VULKAN_HPP_NAMESPACE::Image srcImage,
	                       VULKAN_HPP_NAMESPACE::ImageLayout srcImageLayout,
	                       VULKAN_HPP_NAMESPACE::Buffer dstBuffer,
	                       ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferImageCopy> const &regions) const VULKAN_HPP_NOEXCEPT;

	template<typename DataType>
	void updateBuffer(VULKAN_HPP_NAMESPACE::Buffer dstBuffer,
	                  VULKAN_HPP_NAMESPACE::DeviceSize dstOffset,
	                  ArrayProxy<const DataType> const &data) const VULKAN_HPP_NOEXCEPT;

	void fillBuffer(VULKAN_HPP_NAMESPACE::Buffer dstBuffer,
	                VULKAN_HPP_NAMESPACE::DeviceSize dstOffset,
	                VULKAN_HPP_NAMESPACE::DeviceSize size,
	                uint32_t data) const VULKAN_HPP_NOEXCEPT;

	void clearColorImage(VULKAN_HPP_NAMESPACE::Image image,
	                     VULKAN_HPP_NAMESPACE::ImageLayout imageLayout,
	                     const VULKAN_HPP_NAMESPACE::ClearColorValue &color,
	                     ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageSubresourceRange> const &ranges) const VULKAN_HPP_NOEXCEPT;

	void clearDepthStencilImage(VULKAN_HPP_NAMESPACE::Image image,
	                            VULKAN_HPP_NAMESPACE::ImageLayout imageLayout,
	                            const VULKAN_HPP_NAMESPACE::ClearDepthStencilValue &depthStencil,
	                            ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageSubresourceRange> const &ranges) const VULKAN_HPP_NOEXCEPT;

	void clearAttachments(ArrayProxy<const VULKAN_HPP_NAMESPACE::ClearAttachment> const &attachments,
	                      ArrayProxy<const VULKAN_HPP_NAMESPACE::ClearRect> const &rects) const VULKAN_HPP_NOEXCEPT;

	void resolveImage(VULKAN_HPP_NAMESPACE::Image srcImage,
	                  VULKAN_HPP_NAMESPACE::ImageLayout srcImageLayout,
	                  VULKAN_HPP_NAMESPACE::Image dstImage,
	                  VULKAN_HPP_NAMESPACE::ImageLayout dstImageLayout,
	                  ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageResolve> const &regions) const VULKAN_HPP_NOEXCEPT;

	void setEvent(VULKAN_HPP_NAMESPACE::Event event,
	              VULKAN_HPP_NAMESPACE::PipelineStageFlags stageMask VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT;

	void resetEvent(VULKAN_HPP_NAMESPACE::Event event,
	                VULKAN_HPP_NAMESPACE::PipelineStageFlags stageMask VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT;

	void waitEvents(ArrayProxy<const VULKAN_HPP_NAMESPACE::Event> const &events,
	                VULKAN_HPP_NAMESPACE::PipelineStageFlags srcStageMask,
	                VULKAN_HPP_NAMESPACE::PipelineStageFlags dstStageMask,
	                ArrayProxy<const VULKAN_HPP_NAMESPACE::MemoryBarrier> const &memoryBarriers,
	                ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferMemoryBarrier> const &bufferMemoryBarriers,
	                ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier> const &imageMemoryBarriers) const VULKAN_HPP_NOEXCEPT;

	void pipelineBarrier(VULKAN_HPP_NAMESPACE::PipelineStageFlags srcStageMask,
	                     VULKAN_HPP_NAMESPACE::PipelineStageFlags dstStageMask,
	                     VULKAN_HPP_NAMESPACE::DependencyFlags dependencyFlags,
	                     ArrayProxy<const VULKAN_HPP_NAMESPACE::MemoryBarrier> const &memoryBarriers,
	                     ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferMemoryBarrier> const &bufferMemoryBarriers,
	                     ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier> const &imageMemoryBarriers) const VULKAN_HPP_NOEXCEPT;

	void beginQuery(VULKAN_HPP_NAMESPACE::QueryPool queryPool,
	                uint32_t query,
	                VULKAN_HPP_NAMESPACE::QueryControlFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT;

	void endQuery(VULKAN_HPP_NAMESPACE::QueryPool queryPool, uint32_t query) const VULKAN_HPP_NOEXCEPT;

	void resetQueryPool(VULKAN_HPP_NAMESPACE::QueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) const VULKAN_HPP_NOEXCEPT;

	void writeTimestamp(VULKAN_HPP_NAMESPACE::PipelineStageFlagBits pipelineStage,
	                    VULKAN_HPP_NAMESPACE::QueryPool queryPool,
	                    uint32_t query) const VULKAN_HPP_NOEXCEPT;

	void copyQueryPoolResults(VULKAN_HPP_NAMESPACE::QueryPool queryPool,
	                          uint32_t firstQuery,
	                          uint32_t queryCount,
	                          VULKAN_HPP_NAMESPACE::Buffer dstBuffer,
	                          VULKAN_HPP_NAMESPACE::DeviceSize dstOffset,
	                          VULKAN_HPP_NAMESPACE::DeviceSize stride,
	                          VULKAN_HPP_NAMESPACE::QueryResultFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT;

	template<typename ValuesType>
	void pushConstants(VULKAN_HPP_NAMESPACE::PipelineLayout layout,
	                   VULKAN_HPP_NAMESPACE::ShaderStageFlags stageFlags,
	                   uint32_t offset,
	                   ArrayProxy<const ValuesType> const &values) const VULKAN_HPP_NOEXCEPT;

	void beginRenderPass(const VULKAN_HPP_NAMESPACE::RenderPassBeginInfo &renderPassBegin,
	                     VULKAN_HPP_NAMESPACE::SubpassContents contents) const VULKAN_HPP_NOEXCEPT;

	void nextSubpass(VULKAN_HPP_NAMESPACE::SubpassContents contents) const VULKAN_HPP_NOEXCEPT;

	void endRenderPass() const VULKAN_HPP_NOEXCEPT;

	void executeCommands(ArrayProxy<const VULKAN_HPP_NAMESPACE::CommandBuffer> const &commandBuffers) const VULKAN_HPP_NOEXCEPT;

	//=== VK_VERSION_1_1 ===

	void setDeviceMask(uint32_t deviceMask) const VULKAN_HPP_NOEXCEPT;

	void dispatchBase(uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) const
	    VULKAN_HPP_NOEXCEPT;

	//=== VK_VERSION_1_2 ===

	void drawIndirectCount(VULKAN_HPP_NAMESPACE::Buffer buffer,
	                       VULKAN_HPP_NAMESPACE::DeviceSize offset,
	                       VULKAN_HPP_NAMESPACE::Buffer countBuffer,
	                       VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,
	                       uint32_t maxDrawCount,
	                       uint32_t stride) const VULKAN_HPP_NOEXCEPT;

	void drawIndexedIndirectCount(VULKAN_HPP_NAMESPACE::Buffer buffer,
	                              VULKAN_HPP_NAMESPACE::DeviceSize offset,
	                              VULKAN_HPP_NAMESPACE::Buffer countBuffer,
	                              VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,
	                              uint32_t maxDrawCount,
	                              uint32_t stride) const VULKAN_HPP_NOEXCEPT;

	void beginRenderPass2(const VULKAN_HPP_NAMESPACE::RenderPassBeginInfo &renderPassBegin,
	                      const VULKAN_HPP_NAMESPACE::SubpassBeginInfo &subpassBeginInfo) const VULKAN_HPP_NOEXCEPT;

	void nextSubpass2(const VULKAN_HPP_NAMESPACE::SubpassBeginInfo &subpassBeginInfo,
	                  const VULKAN_HPP_NAMESPACE::SubpassEndInfo &subpassEndInfo) const VULKAN_HPP_NOEXCEPT;

	void endRenderPass2(const VULKAN_HPP_NAMESPACE::SubpassEndInfo &subpassEndInfo) const VULKAN_HPP_NOEXCEPT;

	//=== VK_VERSION_1_3 ===

	void setEvent2(VULKAN_HPP_NAMESPACE::Event event, const VULKAN_HPP_NAMESPACE::DependencyInfo &dependencyInfo) const VULKAN_HPP_NOEXCEPT;

	void resetEvent2(VULKAN_HPP_NAMESPACE::Event event,
	                 VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stageMask VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT;

	void waitEvents2(ArrayProxy<const VULKAN_HPP_NAMESPACE::Event> const &events,
	                 ArrayProxy<const VULKAN_HPP_NAMESPACE::DependencyInfo> const &dependencyInfos) const;

	void pipelineBarrier2(const VULKAN_HPP_NAMESPACE::DependencyInfo &dependencyInfo) const VULKAN_HPP_NOEXCEPT;

	void
	writeTimestamp2(VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stage, VULKAN_HPP_NAMESPACE::QueryPool queryPool, uint32_t query) const VULKAN_HPP_NOEXCEPT;

	void copyBuffer2(const VULKAN_HPP_NAMESPACE::CopyBufferInfo2 &copyBufferInfo) const VULKAN_HPP_NOEXCEPT;

	void copyImage2(const VULKAN_HPP_NAMESPACE::CopyImageInfo2 &copyImageInfo) const VULKAN_HPP_NOEXCEPT;

	void copyBufferToImage2(const VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2 &copyBufferToImageInfo) const VULKAN_HPP_NOEXCEPT;

	void copyImageToBuffer2(const VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2 &copyImageToBufferInfo) const VULKAN_HPP_NOEXCEPT;

	void blitImage2(const VULKAN_HPP_NAMESPACE::BlitImageInfo2 &blitImageInfo) const VULKAN_HPP_NOEXCEPT;

	void resolveImage2(const VULKAN_HPP_NAMESPACE::ResolveImageInfo2 &resolveImageInfo) const VULKAN_HPP_NOEXCEPT;

	void beginRendering(const VULKAN_HPP_NAMESPACE::RenderingInfo &renderingInfo) const VULKAN_HPP_NOEXCEPT;

	void endRendering() const VULKAN_HPP_NOEXCEPT;

	void setCullMode(VULKAN_HPP_NAMESPACE::CullModeFlags cullMode VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT;

	void setFrontFace(VULKAN_HPP_NAMESPACE::FrontFace frontFace) const VULKAN_HPP_NOEXCEPT;

	void setPrimitiveTopology(VULKAN_HPP_NAMESPACE::PrimitiveTopology primitiveTopology) const VULKAN_HPP_NOEXCEPT;

	void setViewportWithCount(ArrayProxy<const VULKAN_HPP_NAMESPACE::Viewport> const &viewports) const VULKAN_HPP_NOEXCEPT;

	void setScissorWithCount(ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const &scissors) const VULKAN_HPP_NOEXCEPT;

	void bindVertexBuffers2(uint32_t firstBinding,
	                        ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &buffers,
	                        ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &offsets,
	                        ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &sizes VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,
	                        ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &strides VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT) const;

	void setDepthTestEnable(VULKAN_HPP_NAMESPACE::Bool32 depthTestEnable) const VULKAN_HPP_NOEXCEPT;

	void setDepthWriteEnable(VULKAN_HPP_NAMESPACE::Bool32 depthWriteEnable) const VULKAN_HPP_NOEXCEPT;

	void setDepthCompareOp(VULKAN_HPP_NAMESPACE::CompareOp depthCompareOp) const VULKAN_HPP_NOEXCEPT;

	void setDepthBoundsTestEnable(VULKAN_HPP_NAMESPACE::Bool32 depthBoundsTestEnable) const VULKAN_HPP_NOEXCEPT;

	void setStencilTestEnable(VULKAN_HPP_NAMESPACE::Bool32 stencilTestEnable) const VULKAN_HPP_NOEXCEPT;

	void setStencilOp(VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask,
	                  VULKAN_HPP_NAMESPACE::StencilOp failOp,
	                  VULKAN_HPP_NAMESPACE::StencilOp passOp,
	                  VULKAN_HPP_NAMESPACE::StencilOp depthFailOp,
	                  VULKAN_HPP_NAMESPACE::CompareOp compareOp) const VULKAN_HPP_NOEXCEPT;

	void setRasterizerDiscardEnable(VULKAN_HPP_NAMESPACE::Bool32 rasterizerDiscardEnable) const VULKAN_HPP_NOEXCEPT;

	void setDepthBiasEnable(VULKAN_HPP_NAMESPACE::Bool32 depthBiasEnable) const VULKAN_HPP_NOEXCEPT;

	void setPrimitiveRestartEnable(VULKAN_HPP_NAMESPACE::Bool32 primitiveRestartEnable) const VULKAN_HPP_NOEXCEPT;

	//=== VK_EXT_debug_marker ===

	void debugMarkerBeginEXT(const VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT &markerInfo) const VULKAN_HPP_NOEXCEPT;

	void debugMarkerEndEXT() const VULKAN_HPP_NOEXCEPT;

	void debugMarkerInsertEXT(const VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT &markerInfo) const VULKAN_HPP_NOEXCEPT;

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
	//=== VK_KHR_video_queue ===

	void beginVideoCodingKHR(const VULKAN_HPP_NAMESPACE::VideoBeginCodingInfoKHR &beginInfo) const VULKAN_HPP_NOEXCEPT;

	void endVideoCodingKHR(const VULKAN_HPP_NAMESPACE::VideoEndCodingInfoKHR &endCodingInfo) const VULKAN_HPP_NOEXCEPT;

	void controlVideoCodingKHR(const VULKAN_HPP_NAMESPACE::VideoCodingControlInfoKHR &codingControlInfo) const VULKAN_HPP_NOEXCEPT;
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
	//=== VK_KHR_video_decode_queue ===

	void decodeVideoKHR(const VULKAN_HPP_NAMESPACE::VideoDecodeInfoKHR &frameInfo) const VULKAN_HPP_NOEXCEPT;
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

	//=== VK_EXT_transform_feedback ===

	void bindTransformFeedbackBuffersEXT(uint32_t firstBinding,
	                                     ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &buffers,
	                                     ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &offsets,
	                                     ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &sizes
	                                         VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT) const;

	void beginTransformFeedbackEXT(uint32_t firstCounterBuffer,
	                               ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &counterBuffers,
	                               ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &counterBufferOffsets
	                                   VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT) const;

	void endTransformFeedbackEXT(uint32_t firstCounterBuffer,
	                             ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &counterBuffers,
	                             ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &counterBufferOffsets
	                                 VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT) const;

	void beginQueryIndexedEXT(VULKAN_HPP_NAMESPACE::QueryPool queryPool,
	                          uint32_t query,
	                          VULKAN_HPP_NAMESPACE::QueryControlFlags flags,
	                          uint32_t index) const VULKAN_HPP_NOEXCEPT;

	void endQueryIndexedEXT(VULKAN_HPP_NAMESPACE::QueryPool queryPool, uint32_t query, uint32_t index) const VULKAN_HPP_NOEXCEPT;

	void drawIndirectByteCountEXT(uint32_t instanceCount,
	                              uint32_t firstInstance,
	                              VULKAN_HPP_NAMESPACE::Buffer counterBuffer,
	                              VULKAN_HPP_NAMESPACE::DeviceSize counterBufferOffset,
	                              uint32_t counterOffset,
	                              uint32_t vertexStride) const VULKAN_HPP_NOEXCEPT;

	//=== VK_NVX_binary_import ===

	void cuLaunchKernelNVX(const VULKAN_HPP_NAMESPACE::CuLaunchInfoNVX &launchInfo) const VULKAN_HPP_NOEXCEPT;

	//=== VK_AMD_draw_indirect_count ===

	void drawIndirectCountAMD(VULKAN_HPP_NAMESPACE::Buffer buffer,
	                          VULKAN_HPP_NAMESPACE::DeviceSize offset,
	                          VULKAN_HPP_NAMESPACE::Buffer countBuffer,
	                          VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,
	                          uint32_t maxDrawCount,
	                          uint32_t stride) const VULKAN_HPP_NOEXCEPT;

	void drawIndexedIndirectCountAMD(VULKAN_HPP_NAMESPACE::Buffer buffer,
	                                 VULKAN_HPP_NAMESPACE::DeviceSize offset,
	                                 VULKAN_HPP_NAMESPACE::Buffer countBuffer,
	                                 VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,
	                                 uint32_t maxDrawCount,
	                                 uint32_t stride) const VULKAN_HPP_NOEXCEPT;

	//=== VK_KHR_dynamic_rendering ===

	void beginRenderingKHR(const VULKAN_HPP_NAMESPACE::RenderingInfo &renderingInfo) const VULKAN_HPP_NOEXCEPT;

	void endRenderingKHR() const VULKAN_HPP_NOEXCEPT;

	//=== VK_KHR_device_group ===

	void setDeviceMaskKHR(uint32_t deviceMask) const VULKAN_HPP_NOEXCEPT;

	void dispatchBaseKHR(uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ)
	    const VULKAN_HPP_NOEXCEPT;

	//=== VK_KHR_push_descriptor ===

	void pushDescriptorSetKHR(VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint,
	                          VULKAN_HPP_NAMESPACE::PipelineLayout layout,
	                          uint32_t set,
	                          ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteDescriptorSet> const &descriptorWrites) const VULKAN_HPP_NOEXCEPT;

	template<typename DataType>
	void pushDescriptorSetWithTemplateKHR(VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,
	                                      VULKAN_HPP_NAMESPACE::PipelineLayout layout,
	                                      uint32_t set,
	                                      DataType const &data) const VULKAN_HPP_NOEXCEPT;

	//=== VK_EXT_conditional_rendering ===

	void beginConditionalRenderingEXT(const VULKAN_HPP_NAMESPACE::ConditionalRenderingBeginInfoEXT &conditionalRenderingBegin) const VULKAN_HPP_NOEXCEPT;

	void endConditionalRenderingEXT() const VULKAN_HPP_NOEXCEPT;

	//=== VK_NV_clip_space_w_scaling ===

	void setViewportWScalingNV(uint32_t firstViewport,
	                           ArrayProxy<const VULKAN_HPP_NAMESPACE::ViewportWScalingNV> const &viewportWScalings) const VULKAN_HPP_NOEXCEPT;

	//=== VK_EXT_discard_rectangles ===

	void setDiscardRectangleEXT(uint32_t firstDiscardRectangle,
	                            ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const &discardRectangles) const VULKAN_HPP_NOEXCEPT;

	//=== VK_KHR_create_renderpass2 ===

	void beginRenderPass2KHR(const VULKAN_HPP_NAMESPACE::RenderPassBeginInfo &renderPassBegin,
	                         const VULKAN_HPP_NAMESPACE::SubpassBeginInfo &subpassBeginInfo) const VULKAN_HPP_NOEXCEPT;

	void nextSubpass2KHR(const VULKAN_HPP_NAMESPACE::SubpassBeginInfo &subpassBeginInfo,
	                     const VULKAN_HPP_NAMESPACE::SubpassEndInfo &subpassEndInfo) const VULKAN_HPP_NOEXCEPT;

	void endRenderPass2KHR(const VULKAN_HPP_NAMESPACE::SubpassEndInfo &subpassEndInfo) const VULKAN_HPP_NOEXCEPT;

	//=== VK_EXT_debug_utils ===

	void beginDebugUtilsLabelEXT(const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT &labelInfo) const VULKAN_HPP_NOEXCEPT;

	void endDebugUtilsLabelEXT() const VULKAN_HPP_NOEXCEPT;

	void insertDebugUtilsLabelEXT(const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT &labelInfo) const VULKAN_HPP_NOEXCEPT;

	//=== VK_EXT_sample_locations ===

	void setSampleLocationsEXT(const VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT &sampleLocationsInfo) const VULKAN_HPP_NOEXCEPT;

	//=== VK_KHR_acceleration_structure ===

	void
	buildAccelerationStructuresKHR(ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR> const &infos,
	                               ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR *const> const &pBuildRangeInfos) const;

	void buildAccelerationStructuresIndirectKHR(ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR> const &infos,
	                                            ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceAddress> const &indirectDeviceAddresses,
	                                            ArrayProxy<const uint32_t> const &indirectStrides,
	                                            ArrayProxy<const uint32_t *const> const &pMaxPrimitiveCounts) const;

	void copyAccelerationStructureKHR(const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR &info) const VULKAN_HPP_NOEXCEPT;

	void copyAccelerationStructureToMemoryKHR(const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureToMemoryInfoKHR &info) const VULKAN_HPP_NOEXCEPT;

	void copyMemoryToAccelerationStructureKHR(const VULKAN_HPP_NAMESPACE::CopyMemoryToAccelerationStructureInfoKHR &info) const VULKAN_HPP_NOEXCEPT;

	void writeAccelerationStructuresPropertiesKHR(ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR> const &accelerationStructures,
	                                              VULKAN_HPP_NAMESPACE::QueryType queryType,
	                                              VULKAN_HPP_NAMESPACE::QueryPool queryPool,
	                                              uint32_t firstQuery) const VULKAN_HPP_NOEXCEPT;

	//=== VK_NV_shading_rate_image ===

	void bindShadingRateImageNV(VULKAN_HPP_NAMESPACE::ImageView imageView, VULKAN_HPP_NAMESPACE::ImageLayout imageLayout) const VULKAN_HPP_NOEXCEPT;

	void
	setViewportShadingRatePaletteNV(uint32_t firstViewport,
	                                ArrayProxy<const VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV> const &shadingRatePalettes) const VULKAN_HPP_NOEXCEPT;

	void setCoarseSampleOrderNV(VULKAN_HPP_NAMESPACE::CoarseSampleOrderTypeNV sampleOrderType,
	                            ArrayProxy<const VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV> const &customSampleOrders) const VULKAN_HPP_NOEXCEPT;

	//=== VK_NV_ray_tracing ===

	void buildAccelerationStructureNV(const VULKAN_HPP_NAMESPACE::AccelerationStructureInfoNV &info,
	                                  VULKAN_HPP_NAMESPACE::Buffer instanceData,
	                                  VULKAN_HPP_NAMESPACE::DeviceSize instanceOffset,
	                                  VULKAN_HPP_NAMESPACE::Bool32 update,
	                                  VULKAN_HPP_NAMESPACE::AccelerationStructureNV dst,
	                                  VULKAN_HPP_NAMESPACE::AccelerationStructureNV src,
	                                  VULKAN_HPP_NAMESPACE::Buffer scratch,
	                                  VULKAN_HPP_NAMESPACE::DeviceSize scratchOffset) const VULKAN_HPP_NOEXCEPT;

	void copyAccelerationStructureNV(VULKAN_HPP_NAMESPACE::AccelerationStructureNV dst,
	                                 VULKAN_HPP_NAMESPACE::AccelerationStructureNV src,
	                                 VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR mode) const VULKAN_HPP_NOEXCEPT;

	void traceRaysNV(VULKAN_HPP_NAMESPACE::Buffer raygenShaderBindingTableBuffer,
	                 VULKAN_HPP_NAMESPACE::DeviceSize raygenShaderBindingOffset,
	                 VULKAN_HPP_NAMESPACE::Buffer missShaderBindingTableBuffer,
	                 VULKAN_HPP_NAMESPACE::DeviceSize missShaderBindingOffset,
	                 VULKAN_HPP_NAMESPACE::DeviceSize missShaderBindingStride,
	                 VULKAN_HPP_NAMESPACE::Buffer hitShaderBindingTableBuffer,
	                 VULKAN_HPP_NAMESPACE::DeviceSize hitShaderBindingOffset,
	                 VULKAN_HPP_NAMESPACE::DeviceSize hitShaderBindingStride,
	                 VULKAN_HPP_NAMESPACE::Buffer callableShaderBindingTableBuffer,
	                 VULKAN_HPP_NAMESPACE::DeviceSize callableShaderBindingOffset,
	                 VULKAN_HPP_NAMESPACE::DeviceSize callableShaderBindingStride,
	                 uint32_t width,
	                 uint32_t height,
	                 uint32_t depth) const VULKAN_HPP_NOEXCEPT;

	void writeAccelerationStructuresPropertiesNV(ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureNV> const &accelerationStructures,
	                                             VULKAN_HPP_NAMESPACE::QueryType queryType,
	                                             VULKAN_HPP_NAMESPACE::QueryPool queryPool,
	                                             uint32_t firstQuery) const VULKAN_HPP_NOEXCEPT;

	//=== VK_KHR_draw_indirect_count ===

	void drawIndirectCountKHR(VULKAN_HPP_NAMESPACE::Buffer buffer,
	                          VULKAN_HPP_NAMESPACE::DeviceSize offset,
	                          VULKAN_HPP_NAMESPACE::Buffer countBuffer,
	                          VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,
	                          uint32_t maxDrawCount,
	                          uint32_t stride) const VULKAN_HPP_NOEXCEPT;

	void drawIndexedIndirectCountKHR(VULKAN_HPP_NAMESPACE::Buffer buffer,
	                                 VULKAN_HPP_NAMESPACE::DeviceSize offset,
	                                 VULKAN_HPP_NAMESPACE::Buffer countBuffer,
	                                 VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,
	                                 uint32_t maxDrawCount,
	                                 uint32_t stride) const VULKAN_HPP_NOEXCEPT;

	//=== VK_AMD_buffer_marker ===

	void writeBufferMarkerAMD(VULKAN_HPP_NAMESPACE::PipelineStageFlagBits pipelineStage,
	                          VULKAN_HPP_NAMESPACE::Buffer dstBuffer,
	                          VULKAN_HPP_NAMESPACE::DeviceSize dstOffset,
	                          uint32_t marker) const VULKAN_HPP_NOEXCEPT;

	//=== VK_NV_mesh_shader ===

	void drawMeshTasksNV(uint32_t taskCount, uint32_t firstTask) const VULKAN_HPP_NOEXCEPT;

	void drawMeshTasksIndirectNV(VULKAN_HPP_NAMESPACE::Buffer buffer,
	                             VULKAN_HPP_NAMESPACE::DeviceSize offset,
	                             uint32_t drawCount,
	                             uint32_t stride) const VULKAN_HPP_NOEXCEPT;

	void drawMeshTasksIndirectCountNV(VULKAN_HPP_NAMESPACE::Buffer buffer,
	                                  VULKAN_HPP_NAMESPACE::DeviceSize offset,
	                                  VULKAN_HPP_NAMESPACE::Buffer countBuffer,
	                                  VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,
	                                  uint32_t maxDrawCount,
	                                  uint32_t stride) const VULKAN_HPP_NOEXCEPT;

	//=== VK_NV_scissor_exclusive ===

	void setExclusiveScissorNV(uint32_t firstExclusiveScissor,
	                           ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const &exclusiveScissors) const VULKAN_HPP_NOEXCEPT;

	//=== VK_NV_device_diagnostic_checkpoints ===

	template<typename CheckpointMarkerType>
	void setCheckpointNV(CheckpointMarkerType const &checkpointMarker) const VULKAN_HPP_NOEXCEPT;

	//=== VK_INTEL_performance_query ===

	void setPerformanceMarkerINTEL(const VULKAN_HPP_NAMESPACE::PerformanceMarkerInfoINTEL &markerInfo) const;

	void setPerformanceStreamMarkerINTEL(const VULKAN_HPP_NAMESPACE::PerformanceStreamMarkerInfoINTEL &markerInfo) const;

	void setPerformanceOverrideINTEL(const VULKAN_HPP_NAMESPACE::PerformanceOverrideInfoINTEL &overrideInfo) const;

	//=== VK_KHR_fragment_shading_rate ===

	void setFragmentShadingRateKHR(const VULKAN_HPP_NAMESPACE::Extent2D &fragmentSize,
	                               const VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR combinerOps[2]) const VULKAN_HPP_NOEXCEPT;

	//=== VK_EXT_line_rasterization ===

	void setLineStippleEXT(uint32_t lineStippleFactor, uint16_t lineStipplePattern) const VULKAN_HPP_NOEXCEPT;

	//=== VK_EXT_extended_dynamic_state ===

	void setCullModeEXT(VULKAN_HPP_NAMESPACE::CullModeFlags cullMode VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT;

	void setFrontFaceEXT(VULKAN_HPP_NAMESPACE::FrontFace frontFace) const VULKAN_HPP_NOEXCEPT;

	void setPrimitiveTopologyEXT(VULKAN_HPP_NAMESPACE::PrimitiveTopology primitiveTopology) const VULKAN_HPP_NOEXCEPT;

	void setViewportWithCountEXT(ArrayProxy<const VULKAN_HPP_NAMESPACE::Viewport> const &viewports) const VULKAN_HPP_NOEXCEPT;

	void setScissorWithCountEXT(ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const &scissors) const VULKAN_HPP_NOEXCEPT;

	void bindVertexBuffers2EXT(uint32_t firstBinding,
	                           ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &buffers,
	                           ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &offsets,
	                           ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &sizes VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,
	                           ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &strides VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT) const;

	void setDepthTestEnableEXT(VULKAN_HPP_NAMESPACE::Bool32 depthTestEnable) const VULKAN_HPP_NOEXCEPT;

	void setDepthWriteEnableEXT(VULKAN_HPP_NAMESPACE::Bool32 depthWriteEnable) const VULKAN_HPP_NOEXCEPT;

	void setDepthCompareOpEXT(VULKAN_HPP_NAMESPACE::CompareOp depthCompareOp) const VULKAN_HPP_NOEXCEPT;

	void setDepthBoundsTestEnableEXT(VULKAN_HPP_NAMESPACE::Bool32 depthBoundsTestEnable) const VULKAN_HPP_NOEXCEPT;

	void setStencilTestEnableEXT(VULKAN_HPP_NAMESPACE::Bool32 stencilTestEnable) const VULKAN_HPP_NOEXCEPT;

	void setStencilOpEXT(VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask,
	                     VULKAN_HPP_NAMESPACE::StencilOp failOp,
	                     VULKAN_HPP_NAMESPACE::StencilOp passOp,
	                     VULKAN_HPP_NAMESPACE::StencilOp depthFailOp,
	                     VULKAN_HPP_NAMESPACE::CompareOp compareOp) const VULKAN_HPP_NOEXCEPT;

	//=== VK_NV_device_generated_commands ===

	void preprocessGeneratedCommandsNV(const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV &generatedCommandsInfo) const VULKAN_HPP_NOEXCEPT;

	void executeGeneratedCommandsNV(VULKAN_HPP_NAMESPACE::Bool32 isPreprocessed,
	                                const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV &generatedCommandsInfo) const VULKAN_HPP_NOEXCEPT;

	void bindPipelineShaderGroupNV(VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint,
	                               VULKAN_HPP_NAMESPACE::Pipeline pipeline,
	                               uint32_t groupIndex) const VULKAN_HPP_NOEXCEPT;

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
	//=== VK_KHR_video_encode_queue ===

	void encodeVideoKHR(const VULKAN_HPP_NAMESPACE::VideoEncodeInfoKHR &encodeInfo) const VULKAN_HPP_NOEXCEPT;
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

	//=== VK_KHR_synchronization2 ===

	void setEvent2KHR(VULKAN_HPP_NAMESPACE::Event event, const VULKAN_HPP_NAMESPACE::DependencyInfo &dependencyInfo) const VULKAN_HPP_NOEXCEPT;

	void resetEvent2KHR(VULKAN_HPP_NAMESPACE::Event event,
	                    VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stageMask VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT;

	void waitEvents2KHR(ArrayProxy<const VULKAN_HPP_NAMESPACE::Event> const &events,
	                    ArrayProxy<const VULKAN_HPP_NAMESPACE::DependencyInfo> const &dependencyInfos) const;

	void pipelineBarrier2KHR(const VULKAN_HPP_NAMESPACE::DependencyInfo &dependencyInfo) const VULKAN_HPP_NOEXCEPT;

	void writeTimestamp2KHR(VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stage,
	                        VULKAN_HPP_NAMESPACE::QueryPool queryPool,
	                        uint32_t query) const VULKAN_HPP_NOEXCEPT;

	void writeBufferMarker2AMD(VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stage,
	                           VULKAN_HPP_NAMESPACE::Buffer dstBuffer,
	                           VULKAN_HPP_NAMESPACE::DeviceSize dstOffset,
	                           uint32_t marker) const VULKAN_HPP_NOEXCEPT;

	//=== VK_NV_fragment_shading_rate_enums ===

	void setFragmentShadingRateEnumNV(VULKAN_HPP_NAMESPACE::FragmentShadingRateNV shadingRate,
	                                  const VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR combinerOps[2]) const VULKAN_HPP_NOEXCEPT;

	//=== VK_KHR_copy_commands2 ===

	void copyBuffer2KHR(const VULKAN_HPP_NAMESPACE::CopyBufferInfo2 &copyBufferInfo) const VULKAN_HPP_NOEXCEPT;

	void copyImage2KHR(const VULKAN_HPP_NAMESPACE::CopyImageInfo2 &copyImageInfo) const VULKAN_HPP_NOEXCEPT;

	void copyBufferToImage2KHR(const VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2 &copyBufferToImageInfo) const VULKAN_HPP_NOEXCEPT;

	void copyImageToBuffer2KHR(const VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2 &copyImageToBufferInfo) const VULKAN_HPP_NOEXCEPT;

	void blitImage2KHR(const VULKAN_HPP_NAMESPACE::BlitImageInfo2 &blitImageInfo) const VULKAN_HPP_NOEXCEPT;

	void resolveImage2KHR(const VULKAN_HPP_NAMESPACE::ResolveImageInfo2 &resolveImageInfo) const VULKAN_HPP_NOEXCEPT;

	//=== VK_KHR_ray_tracing_pipeline ===

	void traceRaysKHR(const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR &raygenShaderBindingTable,
	                  const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR &missShaderBindingTable,
	                  const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR &hitShaderBindingTable,
	                  const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR &callableShaderBindingTable,
	                  uint32_t width,
	                  uint32_t height,
	                  uint32_t depth) const VULKAN_HPP_NOEXCEPT;

	void traceRaysIndirectKHR(const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR &raygenShaderBindingTable,
	                          const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR &missShaderBindingTable,
	                          const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR &hitShaderBindingTable,
	                          const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR &callableShaderBindingTable,
	                          VULKAN_HPP_NAMESPACE::DeviceAddress indirectDeviceAddress) const VULKAN_HPP_NOEXCEPT;

	void setRayTracingPipelineStackSizeKHR(uint32_t pipelineStackSize) const VULKAN_HPP_NOEXCEPT;

	//=== VK_EXT_vertex_input_dynamic_state ===

	void setVertexInputEXT(ArrayProxy<const VULKAN_HPP_NAMESPACE::VertexInputBindingDescription2EXT> const &vertexBindingDescriptions,
	                       ArrayProxy<const VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription2EXT> const &vertexAttributeDescriptions) const
	    VULKAN_HPP_NOEXCEPT;

	//=== VK_HUAWEI_subpass_shading ===

	void subpassShadingHUAWEI() const VULKAN_HPP_NOEXCEPT;

	//=== VK_HUAWEI_invocation_mask ===

	void bindInvocationMaskHUAWEI(VULKAN_HPP_NAMESPACE::ImageView imageView, VULKAN_HPP_NAMESPACE::ImageLayout imageLayout) const VULKAN_HPP_NOEXCEPT;

	//=== VK_EXT_extended_dynamic_state2 ===

	void setPatchControlPointsEXT(uint32_t patchControlPoints) const VULKAN_HPP_NOEXCEPT;

	void setRasterizerDiscardEnableEXT(VULKAN_HPP_NAMESPACE::Bool32 rasterizerDiscardEnable) const VULKAN_HPP_NOEXCEPT;

	void setDepthBiasEnableEXT(VULKAN_HPP_NAMESPACE::Bool32 depthBiasEnable) const VULKAN_HPP_NOEXCEPT;

	void setLogicOpEXT(VULKAN_HPP_NAMESPACE::LogicOp logicOp) const VULKAN_HPP_NOEXCEPT;

	void setPrimitiveRestartEnableEXT(VULKAN_HPP_NAMESPACE::Bool32 primitiveRestartEnable) const VULKAN_HPP_NOEXCEPT;

	//=== VK_EXT_color_write_enable ===

	void setColorWriteEnableEXT(ArrayProxy<const VULKAN_HPP_NAMESPACE::Bool32> const &colorWriteEnables) const VULKAN_HPP_NOEXCEPT;

	//=== VK_EXT_multi_draw ===

	void drawMultiEXT(ArrayProxy<const VULKAN_HPP_NAMESPACE::MultiDrawInfoEXT> const &vertexInfo,
	                  uint32_t instanceCount,
	                  uint32_t firstInstance,
	                  uint32_t stride) const VULKAN_HPP_NOEXCEPT;

	void drawMultiIndexedEXT(ArrayProxy<const VULKAN_HPP_NAMESPACE::MultiDrawIndexedInfoEXT> const &indexInfo,
	                         uint32_t instanceCount,
	                         uint32_t firstInstance,
	                         uint32_t stride,
	                         Optional<const int32_t> vertexOffset VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT;

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::CommandPool m_commandPool = {};
	VULKAN_HPP_NAMESPACE::CommandBuffer m_commandBuffer = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class CommandBuffers : public std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CommandBuffer>
{
public:
	CommandBuffers(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	               VULKAN_HPP_NAMESPACE::CommandBufferAllocateInfo const &allocateInfo)
	{
		VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *dispatcher = device.getDispatcher();
		std::vector<VkCommandBuffer> commandBuffers(allocateInfo.commandBufferCount);
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(dispatcher->vkAllocateCommandBuffers(
		    static_cast<VkDevice>(*device), reinterpret_cast<const VkCommandBufferAllocateInfo *>(&allocateInfo), commandBuffers.data()));
		if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			this->reserve(allocateInfo.commandBufferCount);
			for(auto const &commandBuffer : commandBuffers)
			{
				this->emplace_back(device, commandBuffer, static_cast<VkCommandPool>(allocateInfo.commandPool));
			}
		}
		else
		{
			throwResultException(result, "vkAllocateCommandBuffers");
		}
	}

	CommandBuffers(std::nullptr_t) {}

	CommandBuffers() = delete;
	CommandBuffers(CommandBuffers const &) = delete;
	CommandBuffers(CommandBuffers &&rhs) = default;
	CommandBuffers &operator=(CommandBuffers const &) = delete;
	CommandBuffers &operator=(CommandBuffers &&rhs) = default;
};

class CuFunctionNVX
{
public:
	using CType = VkCuFunctionNVX;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eCuFunctionNVX;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCuFunctionNVX;

public:
	CuFunctionNVX(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	              VULKAN_HPP_NAMESPACE::CuFunctionCreateInfoNVX const &createInfo,
	              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkCreateCuFunctionNVX(static_cast<VkDevice>(*device),
		                                                  reinterpret_cast<const VkCuFunctionCreateInfoNVX *>(&createInfo),
		                                                  reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                  reinterpret_cast<VkCuFunctionNVX *>(&m_function)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateCuFunctionNVX");
		}
	}

	CuFunctionNVX(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	              VkCuFunctionNVX function,
	              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_function(function)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	CuFunctionNVX(std::nullptr_t) {}

	~CuFunctionNVX()
	{
		clear();
	}

	CuFunctionNVX() = delete;
	CuFunctionNVX(CuFunctionNVX const &) = delete;
	CuFunctionNVX(CuFunctionNVX &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_function(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_function, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	CuFunctionNVX &operator=(CuFunctionNVX const &) = delete;
	CuFunctionNVX &operator=(CuFunctionNVX &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_function = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_function, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::CuFunctionNVX const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_function;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_function)
		{
			getDispatcher()->vkDestroyCuFunctionNVX(
			    static_cast<VkDevice>(m_device), static_cast<VkCuFunctionNVX>(m_function), reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_function = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CuFunctionNVX &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_function, rhs.m_function);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::CuFunctionNVX m_function = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class CuModuleNVX
{
public:
	using CType = VkCuModuleNVX;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eCuModuleNVX;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eCuModuleNVX;

public:
	CuModuleNVX(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	            VULKAN_HPP_NAMESPACE::CuModuleCreateInfoNVX const &createInfo,
	            VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkCreateCuModuleNVX(static_cast<VkDevice>(*device),
		                                                reinterpret_cast<const VkCuModuleCreateInfoNVX *>(&createInfo),
		                                                reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                reinterpret_cast<VkCuModuleNVX *>(&m_module)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateCuModuleNVX");
		}
	}

	CuModuleNVX(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	            VkCuModuleNVX module,
	            VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_module(module)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	CuModuleNVX(std::nullptr_t) {}

	~CuModuleNVX()
	{
		clear();
	}

	CuModuleNVX() = delete;
	CuModuleNVX(CuModuleNVX const &) = delete;
	CuModuleNVX(CuModuleNVX &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_module(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_module, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	CuModuleNVX &operator=(CuModuleNVX const &) = delete;
	CuModuleNVX &operator=(CuModuleNVX &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_module = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_module, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::CuModuleNVX const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_module;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_module)
		{
			getDispatcher()->vkDestroyCuModuleNVX(
			    static_cast<VkDevice>(m_device), static_cast<VkCuModuleNVX>(m_module), reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_module = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::CuModuleNVX &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_module, rhs.m_module);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::CuModuleNVX m_module = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class DebugReportCallbackEXT
{
public:
	using CType = VkDebugReportCallbackEXT;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDebugReportCallbackEXT;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDebugReportCallbackEXT;

public:
	DebugReportCallbackEXT(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &instance,
	                       VULKAN_HPP_NAMESPACE::DebugReportCallbackCreateInfoEXT const &createInfo,
	                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_instance(*instance)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(instance.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    instance.getDispatcher()->vkCreateDebugReportCallbackEXT(static_cast<VkInstance>(*instance),
		                                                             reinterpret_cast<const VkDebugReportCallbackCreateInfoEXT *>(&createInfo),
		                                                             reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                             reinterpret_cast<VkDebugReportCallbackEXT *>(&m_callback)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateDebugReportCallbackEXT");
		}
	}

	DebugReportCallbackEXT(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &instance,
	                       VkDebugReportCallbackEXT callback,
	                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_instance(*instance)
	    , m_callback(callback)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(instance.getDispatcher())
	{
	}

	DebugReportCallbackEXT(std::nullptr_t) {}

	~DebugReportCallbackEXT()
	{
		clear();
	}

	DebugReportCallbackEXT() = delete;
	DebugReportCallbackEXT(DebugReportCallbackEXT const &) = delete;
	DebugReportCallbackEXT(DebugReportCallbackEXT &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_instance(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_instance, {})),
	      m_callback(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_callback, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	DebugReportCallbackEXT &operator=(DebugReportCallbackEXT const &) = delete;
	DebugReportCallbackEXT &operator=(DebugReportCallbackEXT &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_instance = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_instance, {});
			m_callback = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_callback, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_callback;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_callback)
		{
			getDispatcher()->vkDestroyDebugReportCallbackEXT(static_cast<VkInstance>(m_instance),
			                                                 static_cast<VkDebugReportCallbackEXT>(m_callback),
			                                                 reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_instance = nullptr;
		m_callback = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Instance getInstance() const
	{
		return m_instance;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DebugReportCallbackEXT &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_instance, rhs.m_instance);
		std::swap(m_callback, rhs.m_callback);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

private:
	VULKAN_HPP_NAMESPACE::Instance m_instance = {};
	VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT m_callback = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher const *m_dispatcher = nullptr;
};

class DebugUtilsMessengerEXT
{
public:
	using CType = VkDebugUtilsMessengerEXT;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDebugUtilsMessengerEXT;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;

public:
	DebugUtilsMessengerEXT(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &instance,
	                       VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateInfoEXT const &createInfo,
	                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_instance(*instance)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(instance.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    instance.getDispatcher()->vkCreateDebugUtilsMessengerEXT(static_cast<VkInstance>(*instance),
		                                                             reinterpret_cast<const VkDebugUtilsMessengerCreateInfoEXT *>(&createInfo),
		                                                             reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                             reinterpret_cast<VkDebugUtilsMessengerEXT *>(&m_messenger)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateDebugUtilsMessengerEXT");
		}
	}

	DebugUtilsMessengerEXT(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &instance,
	                       VkDebugUtilsMessengerEXT messenger,
	                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_instance(*instance)
	    , m_messenger(messenger)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(instance.getDispatcher())
	{
	}

	DebugUtilsMessengerEXT(std::nullptr_t) {}

	~DebugUtilsMessengerEXT()
	{
		clear();
	}

	DebugUtilsMessengerEXT() = delete;
	DebugUtilsMessengerEXT(DebugUtilsMessengerEXT const &) = delete;
	DebugUtilsMessengerEXT(DebugUtilsMessengerEXT &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_instance(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_instance, {})),
	      m_messenger(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_messenger, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	DebugUtilsMessengerEXT &operator=(DebugUtilsMessengerEXT const &) = delete;
	DebugUtilsMessengerEXT &operator=(DebugUtilsMessengerEXT &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_instance = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_instance, {});
			m_messenger = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_messenger, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_messenger;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_messenger)
		{
			getDispatcher()->vkDestroyDebugUtilsMessengerEXT(static_cast<VkInstance>(m_instance),
			                                                 static_cast<VkDebugUtilsMessengerEXT>(m_messenger),
			                                                 reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_instance = nullptr;
		m_messenger = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Instance getInstance() const
	{
		return m_instance;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DebugUtilsMessengerEXT &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_instance, rhs.m_instance);
		std::swap(m_messenger, rhs.m_messenger);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

private:
	VULKAN_HPP_NAMESPACE::Instance m_instance = {};
	VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT m_messenger = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher const *m_dispatcher = nullptr;
};

class DeferredOperationKHR
{
public:
	using CType = VkDeferredOperationKHR;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDeferredOperationKHR;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;

public:
	DeferredOperationKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                     VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkCreateDeferredOperationKHR(static_cast<VkDevice>(*device),
		                                                         reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                         reinterpret_cast<VkDeferredOperationKHR *>(&m_operation)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateDeferredOperationKHR");
		}
	}

	DeferredOperationKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                     VkDeferredOperationKHR operation,
	                     VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_operation(operation)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	DeferredOperationKHR(std::nullptr_t) {}

	~DeferredOperationKHR()
	{
		clear();
	}

	DeferredOperationKHR() = delete;
	DeferredOperationKHR(DeferredOperationKHR const &) = delete;
	DeferredOperationKHR(DeferredOperationKHR &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_operation(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_operation, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	DeferredOperationKHR &operator=(DeferredOperationKHR const &) = delete;
	DeferredOperationKHR &operator=(DeferredOperationKHR &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_operation = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_operation, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::DeferredOperationKHR const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_operation;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_operation)
		{
			getDispatcher()->vkDestroyDeferredOperationKHR(static_cast<VkDevice>(m_device),
			                                               static_cast<VkDeferredOperationKHR>(m_operation),
			                                               reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_operation = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeferredOperationKHR &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_operation, rhs.m_operation);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_KHR_deferred_host_operations ===

	VULKAN_HPP_NODISCARD uint32_t getMaxConcurrency() const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result getResult() const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result join() const;

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::DeferredOperationKHR m_operation = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class DescriptorPool
{
public:
	using CType = VkDescriptorPool;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDescriptorPool;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDescriptorPool;

public:
	DescriptorPool(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	               VULKAN_HPP_NAMESPACE::DescriptorPoolCreateInfo const &createInfo,
	               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkCreateDescriptorPool(static_cast<VkDevice>(*device),
		                                                   reinterpret_cast<const VkDescriptorPoolCreateInfo *>(&createInfo),
		                                                   reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                   reinterpret_cast<VkDescriptorPool *>(&m_descriptorPool)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateDescriptorPool");
		}
	}

	DescriptorPool(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	               VkDescriptorPool descriptorPool,
	               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_descriptorPool(descriptorPool)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	DescriptorPool(std::nullptr_t) {}

	~DescriptorPool()
	{
		clear();
	}

	DescriptorPool() = delete;
	DescriptorPool(DescriptorPool const &) = delete;
	DescriptorPool(DescriptorPool &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_descriptorPool(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_descriptorPool, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	DescriptorPool &operator=(DescriptorPool const &) = delete;
	DescriptorPool &operator=(DescriptorPool &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_descriptorPool = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_descriptorPool, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::DescriptorPool const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_descriptorPool;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_descriptorPool)
		{
			getDispatcher()->vkDestroyDescriptorPool(static_cast<VkDevice>(m_device),
			                                         static_cast<VkDescriptorPool>(m_descriptorPool),
			                                         reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_descriptorPool = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorPool &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_descriptorPool, rhs.m_descriptorPool);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_VERSION_1_0 ===

	void reset(VULKAN_HPP_NAMESPACE::DescriptorPoolResetFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT;

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::DescriptorPool m_descriptorPool = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class DescriptorSet
{
public:
	using CType = VkDescriptorSet;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDescriptorSet;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDescriptorSet;

public:
	DescriptorSet(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device, VkDescriptorSet descriptorSet, VkDescriptorPool descriptorPool)
	    : m_device(*device)
	    , m_descriptorPool(descriptorPool)
	    , m_descriptorSet(descriptorSet)
	    , m_dispatcher(device.getDispatcher())
	{
	}

	DescriptorSet(std::nullptr_t) {}

	~DescriptorSet()
	{
		clear();
	}

	DescriptorSet() = delete;
	DescriptorSet(DescriptorSet const &) = delete;
	DescriptorSet(DescriptorSet &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_descriptorPool(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_descriptorPool, {})),
	      m_descriptorSet(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_descriptorSet, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	DescriptorSet &operator=(DescriptorSet const &) = delete;
	DescriptorSet &operator=(DescriptorSet &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_descriptorPool = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_descriptorPool, {});
			m_descriptorSet = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_descriptorSet, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::DescriptorSet const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_descriptorSet;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_descriptorSet)
		{
			getDispatcher()->vkFreeDescriptorSets(static_cast<VkDevice>(m_device),
			                                      static_cast<VkDescriptorPool>(m_descriptorPool),
			                                      1,
			                                      reinterpret_cast<VkDescriptorSet const *>(&m_descriptorSet));
		}
		m_device = nullptr;
		m_descriptorPool = nullptr;
		m_descriptorSet = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorSet &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_descriptorPool, rhs.m_descriptorPool);
		std::swap(m_descriptorSet, rhs.m_descriptorSet);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_VERSION_1_1 ===

	template<typename DataType>
	void updateWithTemplate(VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate, DataType const &data) const VULKAN_HPP_NOEXCEPT;

	//=== VK_KHR_descriptor_update_template ===

	template<typename DataType>
	void updateWithTemplateKHR(VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate, DataType const &data) const VULKAN_HPP_NOEXCEPT;

	//=== VK_VALVE_descriptor_set_host_mapping ===

	VULKAN_HPP_NODISCARD void *getHostMappingVALVE() const VULKAN_HPP_NOEXCEPT;

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::DescriptorPool m_descriptorPool = {};
	VULKAN_HPP_NAMESPACE::DescriptorSet m_descriptorSet = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class DescriptorSets : public std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorSet>
{
public:
	DescriptorSets(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	               VULKAN_HPP_NAMESPACE::DescriptorSetAllocateInfo const &allocateInfo)
	{
		VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *dispatcher = device.getDispatcher();
		std::vector<VkDescriptorSet> descriptorSets(allocateInfo.descriptorSetCount);
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(dispatcher->vkAllocateDescriptorSets(
		    static_cast<VkDevice>(*device), reinterpret_cast<const VkDescriptorSetAllocateInfo *>(&allocateInfo), descriptorSets.data()));
		if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			this->reserve(allocateInfo.descriptorSetCount);
			for(auto const &descriptorSet : descriptorSets)
			{
				this->emplace_back(device, descriptorSet, static_cast<VkDescriptorPool>(allocateInfo.descriptorPool));
			}
		}
		else
		{
			throwResultException(result, "vkAllocateDescriptorSets");
		}
	}

	DescriptorSets(std::nullptr_t) {}

	DescriptorSets() = delete;
	DescriptorSets(DescriptorSets const &) = delete;
	DescriptorSets(DescriptorSets &&rhs) = default;
	DescriptorSets &operator=(DescriptorSets const &) = delete;
	DescriptorSets &operator=(DescriptorSets &&rhs) = default;
};

class DescriptorSetLayout
{
public:
	using CType = VkDescriptorSetLayout;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDescriptorSetLayout;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDescriptorSetLayout;

public:
	DescriptorSetLayout(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                    VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo const &createInfo,
	                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkCreateDescriptorSetLayout(static_cast<VkDevice>(*device),
		                                                        reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>(&createInfo),
		                                                        reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                        reinterpret_cast<VkDescriptorSetLayout *>(&m_descriptorSetLayout)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateDescriptorSetLayout");
		}
	}

	DescriptorSetLayout(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                    VkDescriptorSetLayout descriptorSetLayout,
	                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_descriptorSetLayout(descriptorSetLayout)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	DescriptorSetLayout(std::nullptr_t) {}

	~DescriptorSetLayout()
	{
		clear();
	}

	DescriptorSetLayout() = delete;
	DescriptorSetLayout(DescriptorSetLayout const &) = delete;
	DescriptorSetLayout(DescriptorSetLayout &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_descriptorSetLayout(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_descriptorSetLayout, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	DescriptorSetLayout &operator=(DescriptorSetLayout const &) = delete;
	DescriptorSetLayout &operator=(DescriptorSetLayout &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_descriptorSetLayout = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_descriptorSetLayout, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::DescriptorSetLayout const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_descriptorSetLayout;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_descriptorSetLayout)
		{
			getDispatcher()->vkDestroyDescriptorSetLayout(static_cast<VkDevice>(m_device),
			                                              static_cast<VkDescriptorSetLayout>(m_descriptorSetLayout),
			                                              reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_descriptorSetLayout = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorSetLayout &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_descriptorSetLayout, rhs.m_descriptorSetLayout);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::DescriptorSetLayout m_descriptorSetLayout = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class DescriptorUpdateTemplate
{
public:
	using CType = VkDescriptorUpdateTemplate;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDescriptorUpdateTemplate;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDescriptorUpdateTemplate;

public:
	DescriptorUpdateTemplate(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                         VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo const &createInfo,
	                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkCreateDescriptorUpdateTemplate(static_cast<VkDevice>(*device),
		                                                             reinterpret_cast<const VkDescriptorUpdateTemplateCreateInfo *>(&createInfo),
		                                                             reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                             reinterpret_cast<VkDescriptorUpdateTemplate *>(&m_descriptorUpdateTemplate)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateDescriptorUpdateTemplate");
		}
	}

	DescriptorUpdateTemplate(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                         VkDescriptorUpdateTemplate descriptorUpdateTemplate,
	                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_descriptorUpdateTemplate(descriptorUpdateTemplate)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	DescriptorUpdateTemplate(std::nullptr_t) {}

	~DescriptorUpdateTemplate()
	{
		clear();
	}

	DescriptorUpdateTemplate() = delete;
	DescriptorUpdateTemplate(DescriptorUpdateTemplate const &) = delete;
	DescriptorUpdateTemplate(DescriptorUpdateTemplate &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_descriptorUpdateTemplate(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_descriptorUpdateTemplate, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	DescriptorUpdateTemplate &operator=(DescriptorUpdateTemplate const &) = delete;
	DescriptorUpdateTemplate &operator=(DescriptorUpdateTemplate &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_descriptorUpdateTemplate = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_descriptorUpdateTemplate, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_descriptorUpdateTemplate;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_descriptorUpdateTemplate)
		{
			getDispatcher()->vkDestroyDescriptorUpdateTemplate(static_cast<VkDevice>(m_device),
			                                                   static_cast<VkDescriptorUpdateTemplate>(m_descriptorUpdateTemplate),
			                                                   reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_descriptorUpdateTemplate = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DescriptorUpdateTemplate &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_descriptorUpdateTemplate, rhs.m_descriptorUpdateTemplate);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate m_descriptorUpdateTemplate = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class DeviceMemory
{
public:
	using CType = VkDeviceMemory;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDeviceMemory;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDeviceMemory;

public:
	DeviceMemory(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	             VULKAN_HPP_NAMESPACE::MemoryAllocateInfo const &allocateInfo,
	             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result =
		    static_cast<VULKAN_HPP_NAMESPACE::Result>(device.getDispatcher()->vkAllocateMemory(static_cast<VkDevice>(*device),
		                                                                                       reinterpret_cast<const VkMemoryAllocateInfo *>(&allocateInfo),
		                                                                                       reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                                                       reinterpret_cast<VkDeviceMemory *>(&m_memory)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkAllocateMemory");
		}
	}

	DeviceMemory(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	             VkDeviceMemory memory,
	             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_memory(memory)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	DeviceMemory(std::nullptr_t) {}

	~DeviceMemory()
	{
		clear();
	}

	DeviceMemory() = delete;
	DeviceMemory(DeviceMemory const &) = delete;
	DeviceMemory(DeviceMemory &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_memory(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_memory, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	DeviceMemory &operator=(DeviceMemory const &) = delete;
	DeviceMemory &operator=(DeviceMemory &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_memory = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_memory, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::DeviceMemory const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_memory;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_memory)
		{
			getDispatcher()->vkFreeMemory(
			    static_cast<VkDevice>(m_device), static_cast<VkDeviceMemory>(m_memory), reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_memory = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceMemory &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_memory, rhs.m_memory);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_VERSION_1_0 ===

	VULKAN_HPP_NODISCARD void *mapMemory(VULKAN_HPP_NAMESPACE::DeviceSize offset,
	                                     VULKAN_HPP_NAMESPACE::DeviceSize size,
	                                     VULKAN_HPP_NAMESPACE::MemoryMapFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const;

	void unmapMemory() const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DeviceSize getCommitment() const VULKAN_HPP_NOEXCEPT;

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
	//=== VK_NV_external_memory_win32 ===

	VULKAN_HPP_NODISCARD HANDLE getMemoryWin32HandleNV(VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV handleType) const;
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

	//=== VK_EXT_pageable_device_local_memory ===

	void setPriorityEXT(float priority) const VULKAN_HPP_NOEXCEPT;

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::DeviceMemory m_memory = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class DisplayKHR
{
public:
	using CType = VkDisplayKHR;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDisplayKHR;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDisplayKHR;

public:
	DisplayKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice const &physicalDevice, int32_t drmFd, uint32_t connectorId)
	    : m_physicalDevice(*physicalDevice)
	    , m_dispatcher(physicalDevice.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(physicalDevice.getDispatcher()->vkGetDrmDisplayEXT(
		    static_cast<VkPhysicalDevice>(*physicalDevice), drmFd, connectorId, reinterpret_cast<VkDisplayKHR *>(&m_display)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkGetDrmDisplayEXT");
		}
	}

#	if defined(VK_USE_PLATFORM_XLIB_XRANDR_EXT)
	DisplayKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice const &physicalDevice, Display &dpy, RROutput rrOutput)
	    : m_physicalDevice(*physicalDevice)
	    , m_dispatcher(physicalDevice.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(physicalDevice.getDispatcher()->vkGetRandROutputDisplayEXT(
		    static_cast<VkPhysicalDevice>(*physicalDevice), &dpy, rrOutput, reinterpret_cast<VkDisplayKHR *>(&m_display)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkGetRandROutputDisplayEXT");
		}
	}
#	endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
	DisplayKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice const &physicalDevice, uint32_t deviceRelativeId)
	    : m_physicalDevice(*physicalDevice)
	    , m_dispatcher(physicalDevice.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(physicalDevice.getDispatcher()->vkGetWinrtDisplayNV(
		    static_cast<VkPhysicalDevice>(*physicalDevice), deviceRelativeId, reinterpret_cast<VkDisplayKHR *>(&m_display)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkGetWinrtDisplayNV");
		}
	}
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

	DisplayKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice const &physicalDevice, VkDisplayKHR display)
	    : m_physicalDevice(*physicalDevice)
	    , m_display(display)
	    , m_dispatcher(physicalDevice.getDispatcher())
	{
	}

	DisplayKHR(std::nullptr_t) {}

	~DisplayKHR()
	{
		clear();
	}

	DisplayKHR() = delete;
	DisplayKHR(DisplayKHR const &) = delete;
	DisplayKHR(DisplayKHR &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_physicalDevice(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_physicalDevice, {})),
	      m_display(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_display, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	DisplayKHR &operator=(DisplayKHR const &) = delete;
	DisplayKHR &operator=(DisplayKHR &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_physicalDevice = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_physicalDevice, {});
			m_display = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_display, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::DisplayKHR const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_display;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_display)
		{
			getDispatcher()->vkReleaseDisplayEXT(static_cast<VkPhysicalDevice>(m_physicalDevice), static_cast<VkDisplayKHR>(m_display));
		}
		m_physicalDevice = nullptr;
		m_display = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::PhysicalDevice getPhysicalDevice() const
	{
		return m_physicalDevice;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_physicalDevice, rhs.m_physicalDevice);
		std::swap(m_display, rhs.m_display);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_KHR_display ===

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR> getModeProperties() const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_RAII_NAMESPACE::DisplayModeKHR
	createMode(VULKAN_HPP_NAMESPACE::DisplayModeCreateInfoKHR const &createInfo,
	           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr) const;

	//=== VK_KHR_get_display_properties2 ===

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR> getModeProperties2() const;

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
	//=== VK_NV_acquire_winrt_display ===

	void acquireWinrtNV() const;
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

private:
	VULKAN_HPP_NAMESPACE::PhysicalDevice m_physicalDevice = {};
	VULKAN_HPP_NAMESPACE::DisplayKHR m_display = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher const *m_dispatcher = nullptr;
};

class DisplayKHRs : public std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR>
{
public:
	DisplayKHRs(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice const &physicalDevice, uint32_t planeIndex)
	{
		VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher const *dispatcher = physicalDevice.getDispatcher();
		std::vector<VkDisplayKHR> displays;
		uint32_t displayCount;
		VULKAN_HPP_NAMESPACE::Result result;
		do
		{
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
			    dispatcher->vkGetDisplayPlaneSupportedDisplaysKHR(static_cast<VkPhysicalDevice>(*physicalDevice), planeIndex, &displayCount, nullptr));
			if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && displayCount)
			{
				displays.resize(displayCount);
				result = static_cast<VULKAN_HPP_NAMESPACE::Result>(dispatcher->vkGetDisplayPlaneSupportedDisplaysKHR(
				    static_cast<VkPhysicalDevice>(*physicalDevice), planeIndex, &displayCount, displays.data()));
			}
		} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
		if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			VULKAN_HPP_ASSERT(displayCount <= displays.size());
			this->reserve(displayCount);
			for(auto const &displayKHR : displays)
			{
				this->emplace_back(physicalDevice, displayKHR);
			}
		}
		else
		{
			throwResultException(result, "vkGetDisplayPlaneSupportedDisplaysKHR");
		}
	}

	DisplayKHRs(std::nullptr_t) {}

	DisplayKHRs() = delete;
	DisplayKHRs(DisplayKHRs const &) = delete;
	DisplayKHRs(DisplayKHRs &&rhs) = default;
	DisplayKHRs &operator=(DisplayKHRs const &) = delete;
	DisplayKHRs &operator=(DisplayKHRs &&rhs) = default;
};

class DisplayModeKHR
{
public:
	using CType = VkDisplayModeKHR;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eDisplayModeKHR;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eDisplayModeKHR;

public:
	DisplayModeKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR const &display,
	               VULKAN_HPP_NAMESPACE::DisplayModeCreateInfoKHR const &createInfo,
	               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_physicalDevice(display.getPhysicalDevice())
	    , m_dispatcher(display.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(display.getDispatcher()->vkCreateDisplayModeKHR(
		    static_cast<VkPhysicalDevice>(display.getPhysicalDevice()),
		    static_cast<VkDisplayKHR>(*display),
		    reinterpret_cast<const VkDisplayModeCreateInfoKHR *>(&createInfo),
		    reinterpret_cast<const VkAllocationCallbacks *>(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator)),
		    reinterpret_cast<VkDisplayModeKHR *>(&m_displayModeKHR)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateDisplayModeKHR");
		}
	}

	DisplayModeKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR const &display, VkDisplayModeKHR displayModeKHR)
	    : m_physicalDevice(display.getPhysicalDevice())
	    , m_displayModeKHR(displayModeKHR)
	    , m_dispatcher(display.getDispatcher())
	{
	}

	DisplayModeKHR(std::nullptr_t) {}

	~DisplayModeKHR()
	{
		clear();
	}

	DisplayModeKHR() = delete;
	DisplayModeKHR(DisplayModeKHR const &rhs)
	    : m_displayModeKHR(rhs.m_displayModeKHR)
	    , m_dispatcher(rhs.m_dispatcher)
	{}
	DisplayModeKHR(DisplayModeKHR &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_physicalDevice(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_physicalDevice, {})),
	      m_displayModeKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_displayModeKHR, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	DisplayModeKHR &operator=(DisplayModeKHR const &rhs)
	{
		m_displayModeKHR = rhs.m_displayModeKHR;
		m_dispatcher = rhs.m_dispatcher;
		return *this;
	}
	DisplayModeKHR &operator=(DisplayModeKHR &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			m_physicalDevice = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_physicalDevice, {});
			m_displayModeKHR = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_displayModeKHR, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::DisplayModeKHR const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_displayModeKHR;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		m_physicalDevice = nullptr;
		m_displayModeKHR = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayModeKHR &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_physicalDevice, rhs.m_physicalDevice);
		std::swap(m_displayModeKHR, rhs.m_displayModeKHR);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_KHR_display ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilitiesKHR getDisplayPlaneCapabilities(uint32_t planeIndex) const;

private:
	VULKAN_HPP_NAMESPACE::PhysicalDevice m_physicalDevice = {};
	VULKAN_HPP_NAMESPACE::DisplayModeKHR m_displayModeKHR = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher const *m_dispatcher = nullptr;
};

class Event
{
public:
	using CType = VkEvent;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eEvent;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eEvent;

public:
	Event(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	      VULKAN_HPP_NAMESPACE::EventCreateInfo const &createInfo,
	      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result =
		    static_cast<VULKAN_HPP_NAMESPACE::Result>(device.getDispatcher()->vkCreateEvent(static_cast<VkDevice>(*device),
		                                                                                    reinterpret_cast<const VkEventCreateInfo *>(&createInfo),
		                                                                                    reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                                                    reinterpret_cast<VkEvent *>(&m_event)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateEvent");
		}
	}

	Event(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	      VkEvent event,
	      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_event(event)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	Event(std::nullptr_t) {}

	~Event()
	{
		clear();
	}

	Event() = delete;
	Event(Event const &) = delete;
	Event(Event &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_event(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_event, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	Event &operator=(Event const &) = delete;
	Event &operator=(Event &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_event = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_event, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::Event const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_event;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_event)
		{
			getDispatcher()->vkDestroyEvent(
			    static_cast<VkDevice>(m_device), static_cast<VkEvent>(m_event), reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_event = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Event &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_event, rhs.m_event);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_VERSION_1_0 ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result getStatus() const;

	void set() const;

	void reset() const;

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::Event m_event = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class Fence
{
public:
	using CType = VkFence;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eFence;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eFence;

public:
	Fence(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	      VULKAN_HPP_NAMESPACE::FenceCreateInfo const &createInfo,
	      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result =
		    static_cast<VULKAN_HPP_NAMESPACE::Result>(device.getDispatcher()->vkCreateFence(static_cast<VkDevice>(*device),
		                                                                                    reinterpret_cast<const VkFenceCreateInfo *>(&createInfo),
		                                                                                    reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                                                    reinterpret_cast<VkFence *>(&m_fence)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateFence");
		}
	}

	Fence(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	      VULKAN_HPP_NAMESPACE::DeviceEventInfoEXT const &deviceEventInfo,
	      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkRegisterDeviceEventEXT(static_cast<VkDevice>(*device),
		                                                     reinterpret_cast<const VkDeviceEventInfoEXT *>(&deviceEventInfo),
		                                                     reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                     reinterpret_cast<VkFence *>(&m_fence)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkRegisterDeviceEventEXT");
		}
	}

	Fence(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	      VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR const &display,
	      VULKAN_HPP_NAMESPACE::DisplayEventInfoEXT const &displayEventInfo,
	      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkRegisterDisplayEventEXT(static_cast<VkDevice>(*device),
		                                                      static_cast<VkDisplayKHR>(*display),
		                                                      reinterpret_cast<const VkDisplayEventInfoEXT *>(&displayEventInfo),
		                                                      reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                      reinterpret_cast<VkFence *>(&m_fence)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkRegisterDisplayEventEXT");
		}
	}

	Fence(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	      VkFence fence,
	      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_fence(fence)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	Fence(std::nullptr_t) {}

	~Fence()
	{
		clear();
	}

	Fence() = delete;
	Fence(Fence const &) = delete;
	Fence(Fence &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_fence(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_fence, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	Fence &operator=(Fence const &) = delete;
	Fence &operator=(Fence &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_fence = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_fence, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::Fence const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_fence;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_fence)
		{
			getDispatcher()->vkDestroyFence(
			    static_cast<VkDevice>(m_device), static_cast<VkFence>(m_fence), reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_fence = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Fence &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_fence, rhs.m_fence);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_VERSION_1_0 ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result getStatus() const;

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::Fence m_fence = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class Framebuffer
{
public:
	using CType = VkFramebuffer;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eFramebuffer;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eFramebuffer;

public:
	Framebuffer(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	            VULKAN_HPP_NAMESPACE::FramebufferCreateInfo const &createInfo,
	            VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkCreateFramebuffer(static_cast<VkDevice>(*device),
		                                                reinterpret_cast<const VkFramebufferCreateInfo *>(&createInfo),
		                                                reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                reinterpret_cast<VkFramebuffer *>(&m_framebuffer)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateFramebuffer");
		}
	}

	Framebuffer(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	            VkFramebuffer framebuffer,
	            VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_framebuffer(framebuffer)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	Framebuffer(std::nullptr_t) {}

	~Framebuffer()
	{
		clear();
	}

	Framebuffer() = delete;
	Framebuffer(Framebuffer const &) = delete;
	Framebuffer(Framebuffer &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_framebuffer(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_framebuffer, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	Framebuffer &operator=(Framebuffer const &) = delete;
	Framebuffer &operator=(Framebuffer &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_framebuffer = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_framebuffer, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::Framebuffer const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_framebuffer;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_framebuffer)
		{
			getDispatcher()->vkDestroyFramebuffer(
			    static_cast<VkDevice>(m_device), static_cast<VkFramebuffer>(m_framebuffer), reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_framebuffer = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Framebuffer &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_framebuffer, rhs.m_framebuffer);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::Framebuffer m_framebuffer = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class Image
{
public:
	using CType = VkImage;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eImage;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eImage;

public:
	Image(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	      VULKAN_HPP_NAMESPACE::ImageCreateInfo const &createInfo,
	      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result =
		    static_cast<VULKAN_HPP_NAMESPACE::Result>(device.getDispatcher()->vkCreateImage(static_cast<VkDevice>(*device),
		                                                                                    reinterpret_cast<const VkImageCreateInfo *>(&createInfo),
		                                                                                    reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                                                    reinterpret_cast<VkImage *>(&m_image)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateImage");
		}
	}

	Image(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	      VkImage image,
	      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_image(image)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	Image(std::nullptr_t) {}

	~Image()
	{
		clear();
	}

	Image() = delete;
	Image(Image const &) = delete;
	Image(Image &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_image(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_image, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	Image &operator=(Image const &) = delete;
	Image &operator=(Image &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_image = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_image, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::Image const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_image;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_image)
		{
			getDispatcher()->vkDestroyImage(
			    static_cast<VkDevice>(m_device), static_cast<VkImage>(m_image), reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_image = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Image &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_image, rhs.m_image);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_VERSION_1_0 ===

	void bindMemory(VULKAN_HPP_NAMESPACE::DeviceMemory memory, VULKAN_HPP_NAMESPACE::DeviceSize memoryOffset) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::MemoryRequirements getMemoryRequirements() const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements> getSparseMemoryRequirements() const VULKAN_HPP_NOEXCEPT;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::SubresourceLayout
	getSubresourceLayout(const VULKAN_HPP_NAMESPACE::ImageSubresource &subresource) const VULKAN_HPP_NOEXCEPT;

	//=== VK_EXT_image_drm_format_modifier ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierPropertiesEXT getDrmFormatModifierPropertiesEXT() const;

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::Image m_image = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class ImageView
{
public:
	using CType = VkImageView;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eImageView;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eImageView;

public:
	ImageView(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	          VULKAN_HPP_NAMESPACE::ImageViewCreateInfo const &createInfo,
	          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result =
		    static_cast<VULKAN_HPP_NAMESPACE::Result>(device.getDispatcher()->vkCreateImageView(static_cast<VkDevice>(*device),
		                                                                                        reinterpret_cast<const VkImageViewCreateInfo *>(&createInfo),
		                                                                                        reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                                                        reinterpret_cast<VkImageView *>(&m_imageView)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateImageView");
		}
	}

	ImageView(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	          VkImageView imageView,
	          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_imageView(imageView)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	ImageView(std::nullptr_t) {}

	~ImageView()
	{
		clear();
	}

	ImageView() = delete;
	ImageView(ImageView const &) = delete;
	ImageView(ImageView &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_imageView(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_imageView, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	ImageView &operator=(ImageView const &) = delete;
	ImageView &operator=(ImageView &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_imageView = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_imageView, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::ImageView const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_imageView;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_imageView)
		{
			getDispatcher()->vkDestroyImageView(
			    static_cast<VkDevice>(m_device), static_cast<VkImageView>(m_imageView), reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_imageView = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ImageView &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_imageView, rhs.m_imageView);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_NVX_image_view_handle ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::ImageViewAddressPropertiesNVX getAddressNVX() const;

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::ImageView m_imageView = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class IndirectCommandsLayoutNV
{
public:
	using CType = VkIndirectCommandsLayoutNV;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eIndirectCommandsLayoutNV;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;

public:
	IndirectCommandsLayoutNV(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                         VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoNV const &createInfo,
	                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkCreateIndirectCommandsLayoutNV(static_cast<VkDevice>(*device),
		                                                             reinterpret_cast<const VkIndirectCommandsLayoutCreateInfoNV *>(&createInfo),
		                                                             reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                             reinterpret_cast<VkIndirectCommandsLayoutNV *>(&m_indirectCommandsLayout)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateIndirectCommandsLayoutNV");
		}
	}

	IndirectCommandsLayoutNV(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                         VkIndirectCommandsLayoutNV indirectCommandsLayout,
	                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_indirectCommandsLayout(indirectCommandsLayout)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	IndirectCommandsLayoutNV(std::nullptr_t) {}

	~IndirectCommandsLayoutNV()
	{
		clear();
	}

	IndirectCommandsLayoutNV() = delete;
	IndirectCommandsLayoutNV(IndirectCommandsLayoutNV const &) = delete;
	IndirectCommandsLayoutNV(IndirectCommandsLayoutNV &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_indirectCommandsLayout(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_indirectCommandsLayout, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	IndirectCommandsLayoutNV &operator=(IndirectCommandsLayoutNV const &) = delete;
	IndirectCommandsLayoutNV &operator=(IndirectCommandsLayoutNV &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_indirectCommandsLayout = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_indirectCommandsLayout, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_indirectCommandsLayout;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_indirectCommandsLayout)
		{
			getDispatcher()->vkDestroyIndirectCommandsLayoutNV(static_cast<VkDevice>(m_device),
			                                                   static_cast<VkIndirectCommandsLayoutNV>(m_indirectCommandsLayout),
			                                                   reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_indirectCommandsLayout = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::IndirectCommandsLayoutNV &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_indirectCommandsLayout, rhs.m_indirectCommandsLayout);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV m_indirectCommandsLayout = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class PerformanceConfigurationINTEL
{
public:
	using CType = VkPerformanceConfigurationINTEL;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::ePerformanceConfigurationINTEL;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;

public:
	PerformanceConfigurationINTEL(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                              VULKAN_HPP_NAMESPACE::PerformanceConfigurationAcquireInfoINTEL const &acquireInfo)
	    : m_device(*device)
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkAcquirePerformanceConfigurationINTEL(static_cast<VkDevice>(*device),
		                                                                   reinterpret_cast<const VkPerformanceConfigurationAcquireInfoINTEL *>(&acquireInfo),
		                                                                   reinterpret_cast<VkPerformanceConfigurationINTEL *>(&m_configuration)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkAcquirePerformanceConfigurationINTEL");
		}
	}

	PerformanceConfigurationINTEL(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device, VkPerformanceConfigurationINTEL configuration)
	    : m_device(*device)
	    , m_configuration(configuration)
	    , m_dispatcher(device.getDispatcher())
	{
	}

	PerformanceConfigurationINTEL(std::nullptr_t) {}

	~PerformanceConfigurationINTEL()
	{
		clear();
	}

	PerformanceConfigurationINTEL() = delete;
	PerformanceConfigurationINTEL(PerformanceConfigurationINTEL const &) = delete;
	PerformanceConfigurationINTEL(PerformanceConfigurationINTEL &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_configuration(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_configuration, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	PerformanceConfigurationINTEL &operator=(PerformanceConfigurationINTEL const &) = delete;
	PerformanceConfigurationINTEL &operator=(PerformanceConfigurationINTEL &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_configuration = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_configuration, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_configuration;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_configuration)
		{
			getDispatcher()->vkReleasePerformanceConfigurationINTEL(static_cast<VkDevice>(m_device),
			                                                        static_cast<VkPerformanceConfigurationINTEL>(m_configuration));
		}
		m_device = nullptr;
		m_configuration = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PerformanceConfigurationINTEL &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_configuration, rhs.m_configuration);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL m_configuration = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class PipelineCache
{
public:
	using CType = VkPipelineCache;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::ePipelineCache;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::ePipelineCache;

public:
	PipelineCache(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	              VULKAN_HPP_NAMESPACE::PipelineCacheCreateInfo const &createInfo,
	              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkCreatePipelineCache(static_cast<VkDevice>(*device),
		                                                  reinterpret_cast<const VkPipelineCacheCreateInfo *>(&createInfo),
		                                                  reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                  reinterpret_cast<VkPipelineCache *>(&m_pipelineCache)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreatePipelineCache");
		}
	}

	PipelineCache(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	              VkPipelineCache pipelineCache,
	              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_pipelineCache(pipelineCache)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	PipelineCache(std::nullptr_t) {}

	~PipelineCache()
	{
		clear();
	}

	PipelineCache() = delete;
	PipelineCache(PipelineCache const &) = delete;
	PipelineCache(PipelineCache &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_pipelineCache(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_pipelineCache, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	PipelineCache &operator=(PipelineCache const &) = delete;
	PipelineCache &operator=(PipelineCache &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_pipelineCache = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_pipelineCache, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::PipelineCache const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_pipelineCache;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_pipelineCache)
		{
			getDispatcher()->vkDestroyPipelineCache(static_cast<VkDevice>(m_device),
			                                        static_cast<VkPipelineCache>(m_pipelineCache),
			                                        reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_pipelineCache = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_pipelineCache, rhs.m_pipelineCache);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_VERSION_1_0 ===

	VULKAN_HPP_NODISCARD std::vector<uint8_t> getData() const;

	void merge(ArrayProxy<const VULKAN_HPP_NAMESPACE::PipelineCache> const &srcCaches) const;

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::PipelineCache m_pipelineCache = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class Pipeline
{
public:
	using CType = VkPipeline;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::ePipeline;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::ePipeline;

public:
	Pipeline(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &pipelineCache,
	         VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo const &createInfo,
	         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		m_constructorSuccessCode = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    getDispatcher()->vkCreateComputePipelines(static_cast<VkDevice>(*device),
		                                              pipelineCache ? static_cast<VkPipelineCache>(**pipelineCache) : 0,
		                                              1,
		                                              reinterpret_cast<const VkComputePipelineCreateInfo *>(&createInfo),
		                                              reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                              reinterpret_cast<VkPipeline *>(&m_pipeline)));
		if((m_constructorSuccessCode != VULKAN_HPP_NAMESPACE::Result::eSuccess) &&
		   (m_constructorSuccessCode != VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT))
		{
			throwResultException(m_constructorSuccessCode, "vkCreateComputePipelines");
		}
	}

	Pipeline(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &pipelineCache,
	         VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo const &createInfo,
	         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		m_constructorSuccessCode = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    getDispatcher()->vkCreateGraphicsPipelines(static_cast<VkDevice>(*device),
		                                               pipelineCache ? static_cast<VkPipelineCache>(**pipelineCache) : 0,
		                                               1,
		                                               reinterpret_cast<const VkGraphicsPipelineCreateInfo *>(&createInfo),
		                                               reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                               reinterpret_cast<VkPipeline *>(&m_pipeline)));
		if((m_constructorSuccessCode != VULKAN_HPP_NAMESPACE::Result::eSuccess) &&
		   (m_constructorSuccessCode != VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT))
		{
			throwResultException(m_constructorSuccessCode, "vkCreateGraphicsPipelines");
		}
	}

	Pipeline(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeferredOperationKHR> const &deferredOperation,
	         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &pipelineCache,
	         VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR const &createInfo,
	         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		m_constructorSuccessCode = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    getDispatcher()->vkCreateRayTracingPipelinesKHR(static_cast<VkDevice>(*device),
		                                                    deferredOperation ? static_cast<VkDeferredOperationKHR>(**deferredOperation) : 0,
		                                                    pipelineCache ? static_cast<VkPipelineCache>(**pipelineCache) : 0,
		                                                    1,
		                                                    reinterpret_cast<const VkRayTracingPipelineCreateInfoKHR *>(&createInfo),
		                                                    reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                    reinterpret_cast<VkPipeline *>(&m_pipeline)));
		if((m_constructorSuccessCode != VULKAN_HPP_NAMESPACE::Result::eSuccess) &&
		   (m_constructorSuccessCode != VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR) &&
		   (m_constructorSuccessCode != VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR) &&
		   (m_constructorSuccessCode != VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT))
		{
			throwResultException(m_constructorSuccessCode, "vkCreateRayTracingPipelinesKHR");
		}
	}

	Pipeline(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &pipelineCache,
	         VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV const &createInfo,
	         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		m_constructorSuccessCode = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    getDispatcher()->vkCreateRayTracingPipelinesNV(static_cast<VkDevice>(*device),
		                                                   pipelineCache ? static_cast<VkPipelineCache>(**pipelineCache) : 0,
		                                                   1,
		                                                   reinterpret_cast<const VkRayTracingPipelineCreateInfoNV *>(&createInfo),
		                                                   reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                   reinterpret_cast<VkPipeline *>(&m_pipeline)));
		if((m_constructorSuccessCode != VULKAN_HPP_NAMESPACE::Result::eSuccess) &&
		   (m_constructorSuccessCode != VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT))
		{
			throwResultException(m_constructorSuccessCode, "vkCreateRayTracingPipelinesNV");
		}
	}

	Pipeline(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	         VkPipeline pipeline,
	         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr,
	         VULKAN_HPP_NAMESPACE::Result successCode = VULKAN_HPP_NAMESPACE::Result::eSuccess)
	    : m_device(*device)
	    , m_pipeline(pipeline)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_constructorSuccessCode(successCode)
	    , m_dispatcher(device.getDispatcher())
	{
	}

	Pipeline(std::nullptr_t) {}

	~Pipeline()
	{
		clear();
	}

	Pipeline() = delete;
	Pipeline(Pipeline const &) = delete;
	Pipeline(Pipeline &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_pipeline(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_pipeline, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	Pipeline &operator=(Pipeline const &) = delete;
	Pipeline &operator=(Pipeline &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_pipeline = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_pipeline, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::Pipeline const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_pipeline;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_pipeline)
		{
			getDispatcher()->vkDestroyPipeline(
			    static_cast<VkDevice>(m_device), static_cast<VkPipeline>(m_pipeline), reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_pipeline = nullptr;
		m_allocator = nullptr;
		m_constructorSuccessCode = VULKAN_HPP_NAMESPACE::Result::eErrorUnknown;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Result getConstructorSuccessCode() const
	{
		return m_constructorSuccessCode;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_pipeline, rhs.m_pipeline);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_constructorSuccessCode, rhs.m_constructorSuccessCode);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_AMD_shader_info ===

	VULKAN_HPP_NODISCARD std::vector<uint8_t> getShaderInfoAMD(VULKAN_HPP_NAMESPACE::ShaderStageFlagBits shaderStage,
	                                                           VULKAN_HPP_NAMESPACE::ShaderInfoTypeAMD infoType) const;

	//=== VK_NV_ray_tracing ===

	template<typename DataType>
	VULKAN_HPP_NODISCARD std::vector<DataType> getRayTracingShaderGroupHandlesNV(uint32_t firstGroup, uint32_t groupCount, size_t dataSize) const;

	template<typename DataType>
	VULKAN_HPP_NODISCARD DataType getRayTracingShaderGroupHandleNV(uint32_t firstGroup, uint32_t groupCount) const;

	void compileDeferredNV(uint32_t shader) const;

	//=== VK_KHR_ray_tracing_pipeline ===

	template<typename DataType>
	VULKAN_HPP_NODISCARD std::vector<DataType> getRayTracingShaderGroupHandlesKHR(uint32_t firstGroup, uint32_t groupCount, size_t dataSize) const;

	template<typename DataType>
	VULKAN_HPP_NODISCARD DataType getRayTracingShaderGroupHandleKHR(uint32_t firstGroup, uint32_t groupCount) const;

	template<typename DataType>
	VULKAN_HPP_NODISCARD std::vector<DataType>
	getRayTracingCaptureReplayShaderGroupHandlesKHR(uint32_t firstGroup, uint32_t groupCount, size_t dataSize) const;

	template<typename DataType>
	VULKAN_HPP_NODISCARD DataType getRayTracingCaptureReplayShaderGroupHandleKHR(uint32_t firstGroup, uint32_t groupCount) const;

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::DeviceSize
	getRayTracingShaderGroupStackSizeKHR(uint32_t group, VULKAN_HPP_NAMESPACE::ShaderGroupShaderKHR groupShader) const VULKAN_HPP_NOEXCEPT;

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::Pipeline m_pipeline = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::Result m_constructorSuccessCode = VULKAN_HPP_NAMESPACE::Result::eErrorUnknown;
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class Pipelines : public std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Pipeline>
{
public:
	Pipelines(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &pipelineCache,
	          VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo> const &createInfos,
	          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	{
		VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *dispatcher = device.getDispatcher();
		std::vector<VkPipeline> pipelines(createInfos.size());
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(dispatcher->vkCreateComputePipelines(
		    static_cast<VkDevice>(*device),
		    pipelineCache ? static_cast<VkPipelineCache>(**pipelineCache) : 0,
		    createInfos.size(),
		    reinterpret_cast<const VkComputePipelineCreateInfo *>(createInfos.data()),
		    reinterpret_cast<const VkAllocationCallbacks *>(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator)),
		    pipelines.data()));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) || (result == VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT))
		{
			this->reserve(createInfos.size());
			for(auto const &pipeline : pipelines)
			{
				this->emplace_back(device, pipeline, allocator, result);
			}
		}
		else
		{
			throwResultException(result, "vkCreateComputePipelines");
		}
	}

	Pipelines(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &pipelineCache,
	          VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo> const &createInfos,
	          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	{
		VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *dispatcher = device.getDispatcher();
		std::vector<VkPipeline> pipelines(createInfos.size());
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(dispatcher->vkCreateGraphicsPipelines(
		    static_cast<VkDevice>(*device),
		    pipelineCache ? static_cast<VkPipelineCache>(**pipelineCache) : 0,
		    createInfos.size(),
		    reinterpret_cast<const VkGraphicsPipelineCreateInfo *>(createInfos.data()),
		    reinterpret_cast<const VkAllocationCallbacks *>(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator)),
		    pipelines.data()));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) || (result == VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT))
		{
			this->reserve(createInfos.size());
			for(auto const &pipeline : pipelines)
			{
				this->emplace_back(device, pipeline, allocator, result);
			}
		}
		else
		{
			throwResultException(result, "vkCreateGraphicsPipelines");
		}
	}

	Pipelines(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeferredOperationKHR> const &deferredOperation,
	          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &pipelineCache,
	          VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR> const &createInfos,
	          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	{
		VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *dispatcher = device.getDispatcher();
		std::vector<VkPipeline> pipelines(createInfos.size());
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(dispatcher->vkCreateRayTracingPipelinesKHR(
		    static_cast<VkDevice>(*device),
		    deferredOperation ? static_cast<VkDeferredOperationKHR>(**deferredOperation) : 0,
		    pipelineCache ? static_cast<VkPipelineCache>(**pipelineCache) : 0,
		    createInfos.size(),
		    reinterpret_cast<const VkRayTracingPipelineCreateInfoKHR *>(createInfos.data()),
		    reinterpret_cast<const VkAllocationCallbacks *>(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator)),
		    pipelines.data()));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) || (result == VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR) ||
		   (result == VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR) || (result == VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT))
		{
			this->reserve(createInfos.size());
			for(auto const &pipeline : pipelines)
			{
				this->emplace_back(device, pipeline, allocator, result);
			}
		}
		else
		{
			throwResultException(result, "vkCreateRayTracingPipelinesKHR");
		}
	}

	Pipelines(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &pipelineCache,
	          VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV> const &createInfos,
	          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	{
		VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *dispatcher = device.getDispatcher();
		std::vector<VkPipeline> pipelines(createInfos.size());
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(dispatcher->vkCreateRayTracingPipelinesNV(
		    static_cast<VkDevice>(*device),
		    pipelineCache ? static_cast<VkPipelineCache>(**pipelineCache) : 0,
		    createInfos.size(),
		    reinterpret_cast<const VkRayTracingPipelineCreateInfoNV *>(createInfos.data()),
		    reinterpret_cast<const VkAllocationCallbacks *>(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator)),
		    pipelines.data()));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) || (result == VULKAN_HPP_NAMESPACE::Result::ePipelineCompileRequiredEXT))
		{
			this->reserve(createInfos.size());
			for(auto const &pipeline : pipelines)
			{
				this->emplace_back(device, pipeline, allocator, result);
			}
		}
		else
		{
			throwResultException(result, "vkCreateRayTracingPipelinesNV");
		}
	}

	Pipelines(std::nullptr_t) {}

	Pipelines() = delete;
	Pipelines(Pipelines const &) = delete;
	Pipelines(Pipelines &&rhs) = default;
	Pipelines &operator=(Pipelines const &) = delete;
	Pipelines &operator=(Pipelines &&rhs) = default;
};

class PipelineLayout
{
public:
	using CType = VkPipelineLayout;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::ePipelineLayout;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::ePipelineLayout;

public:
	PipelineLayout(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	               VULKAN_HPP_NAMESPACE::PipelineLayoutCreateInfo const &createInfo,
	               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkCreatePipelineLayout(static_cast<VkDevice>(*device),
		                                                   reinterpret_cast<const VkPipelineLayoutCreateInfo *>(&createInfo),
		                                                   reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                   reinterpret_cast<VkPipelineLayout *>(&m_pipelineLayout)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreatePipelineLayout");
		}
	}

	PipelineLayout(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	               VkPipelineLayout pipelineLayout,
	               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_pipelineLayout(pipelineLayout)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	PipelineLayout(std::nullptr_t) {}

	~PipelineLayout()
	{
		clear();
	}

	PipelineLayout() = delete;
	PipelineLayout(PipelineLayout const &) = delete;
	PipelineLayout(PipelineLayout &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_pipelineLayout(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_pipelineLayout, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	PipelineLayout &operator=(PipelineLayout const &) = delete;
	PipelineLayout &operator=(PipelineLayout &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_pipelineLayout = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_pipelineLayout, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::PipelineLayout const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_pipelineLayout;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_pipelineLayout)
		{
			getDispatcher()->vkDestroyPipelineLayout(static_cast<VkDevice>(m_device),
			                                         static_cast<VkPipelineLayout>(m_pipelineLayout),
			                                         reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_pipelineLayout = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineLayout &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_pipelineLayout, rhs.m_pipelineLayout);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::PipelineLayout m_pipelineLayout = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class PrivateDataSlot
{
public:
	using CType = VkPrivateDataSlot;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::ePrivateDataSlot;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;

public:
	PrivateDataSlot(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo const &createInfo,
	                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkCreatePrivateDataSlot(static_cast<VkDevice>(*device),
		                                                    reinterpret_cast<const VkPrivateDataSlotCreateInfo *>(&createInfo),
		                                                    reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                    reinterpret_cast<VkPrivateDataSlot *>(&m_privateDataSlot)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreatePrivateDataSlot");
		}
	}

	PrivateDataSlot(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                VkPrivateDataSlot privateDataSlot,
	                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_privateDataSlot(privateDataSlot)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	PrivateDataSlot(std::nullptr_t) {}

	~PrivateDataSlot()
	{
		clear();
	}

	PrivateDataSlot() = delete;
	PrivateDataSlot(PrivateDataSlot const &) = delete;
	PrivateDataSlot(PrivateDataSlot &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_privateDataSlot(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_privateDataSlot, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	PrivateDataSlot &operator=(PrivateDataSlot const &) = delete;
	PrivateDataSlot &operator=(PrivateDataSlot &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_privateDataSlot = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_privateDataSlot, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::PrivateDataSlot const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_privateDataSlot;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_privateDataSlot)
		{
			getDispatcher()->vkDestroyPrivateDataSlot(static_cast<VkDevice>(m_device),
			                                          static_cast<VkPrivateDataSlot>(m_privateDataSlot),
			                                          reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_privateDataSlot = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PrivateDataSlot &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_privateDataSlot, rhs.m_privateDataSlot);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::PrivateDataSlot m_privateDataSlot = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class QueryPool
{
public:
	using CType = VkQueryPool;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eQueryPool;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eQueryPool;

public:
	QueryPool(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	          VULKAN_HPP_NAMESPACE::QueryPoolCreateInfo const &createInfo,
	          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result =
		    static_cast<VULKAN_HPP_NAMESPACE::Result>(device.getDispatcher()->vkCreateQueryPool(static_cast<VkDevice>(*device),
		                                                                                        reinterpret_cast<const VkQueryPoolCreateInfo *>(&createInfo),
		                                                                                        reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                                                        reinterpret_cast<VkQueryPool *>(&m_queryPool)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateQueryPool");
		}
	}

	QueryPool(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	          VkQueryPool queryPool,
	          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_queryPool(queryPool)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	QueryPool(std::nullptr_t) {}

	~QueryPool()
	{
		clear();
	}

	QueryPool() = delete;
	QueryPool(QueryPool const &) = delete;
	QueryPool(QueryPool &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_queryPool(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_queryPool, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	QueryPool &operator=(QueryPool const &) = delete;
	QueryPool &operator=(QueryPool &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_queryPool = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_queryPool, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::QueryPool const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_queryPool;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_queryPool)
		{
			getDispatcher()->vkDestroyQueryPool(
			    static_cast<VkDevice>(m_device), static_cast<VkQueryPool>(m_queryPool), reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_queryPool = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::QueryPool &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_queryPool, rhs.m_queryPool);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_VERSION_1_0 ===

	template<typename DataType>
	VULKAN_HPP_NODISCARD std::pair<VULKAN_HPP_NAMESPACE::Result, std::vector<DataType>>
	getResults(uint32_t firstQuery,
	           uint32_t queryCount,
	           size_t dataSize,
	           VULKAN_HPP_NAMESPACE::DeviceSize stride,
	           VULKAN_HPP_NAMESPACE::QueryResultFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const;

	template<typename DataType>
	VULKAN_HPP_NODISCARD std::pair<VULKAN_HPP_NAMESPACE::Result, DataType>
	getResult(uint32_t firstQuery,
	          uint32_t queryCount,
	          VULKAN_HPP_NAMESPACE::DeviceSize stride,
	          VULKAN_HPP_NAMESPACE::QueryResultFlags flags VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const;

	//=== VK_VERSION_1_2 ===

	void reset(uint32_t firstQuery, uint32_t queryCount) const VULKAN_HPP_NOEXCEPT;

	//=== VK_EXT_host_query_reset ===

	void resetEXT(uint32_t firstQuery, uint32_t queryCount) const VULKAN_HPP_NOEXCEPT;

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::QueryPool m_queryPool = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class Queue
{
public:
	using CType = VkQueue;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eQueue;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eQueue;

public:
	Queue(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device, uint32_t queueFamilyIndex, uint32_t queueIndex)
	    : m_dispatcher(device.getDispatcher())
	{
		getDispatcher()->vkGetDeviceQueue(static_cast<VkDevice>(*device), queueFamilyIndex, queueIndex, reinterpret_cast<VkQueue *>(&m_queue));
	}

	Queue(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device, VULKAN_HPP_NAMESPACE::DeviceQueueInfo2 const &queueInfo)
	    : m_dispatcher(device.getDispatcher())
	{
		getDispatcher()->vkGetDeviceQueue2(
		    static_cast<VkDevice>(*device), reinterpret_cast<const VkDeviceQueueInfo2 *>(&queueInfo), reinterpret_cast<VkQueue *>(&m_queue));
	}

	Queue(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device, VkQueue queue)
	    : m_queue(queue)
	    , m_dispatcher(device.getDispatcher())
	{
	}

	Queue(std::nullptr_t) {}

	~Queue()
	{
		clear();
	}

	Queue() = delete;
	Queue(Queue const &rhs)
	    : m_queue(rhs.m_queue)
	    , m_dispatcher(rhs.m_dispatcher)
	{}
	Queue(Queue &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_queue(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_queue, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	Queue &operator=(Queue const &rhs)
	{
		m_queue = rhs.m_queue;
		m_dispatcher = rhs.m_dispatcher;
		return *this;
	}
	Queue &operator=(Queue &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			m_queue = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_queue, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::Queue const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_queue;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		m_queue = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Queue &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_queue, rhs.m_queue);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_VERSION_1_0 ===

	void submit(ArrayProxy<const VULKAN_HPP_NAMESPACE::SubmitInfo> const &submits,
	            VULKAN_HPP_NAMESPACE::Fence fence VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const;

	void waitIdle() const;

	void bindSparse(ArrayProxy<const VULKAN_HPP_NAMESPACE::BindSparseInfo> const &bindInfo,
	                VULKAN_HPP_NAMESPACE::Fence fence VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const;

	//=== VK_VERSION_1_3 ===

	void submit2(ArrayProxy<const VULKAN_HPP_NAMESPACE::SubmitInfo2> const &submits,
	             VULKAN_HPP_NAMESPACE::Fence fence VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const;

	//=== VK_KHR_swapchain ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result presentKHR(const VULKAN_HPP_NAMESPACE::PresentInfoKHR &presentInfo) const;

	//=== VK_EXT_debug_utils ===

	void beginDebugUtilsLabelEXT(const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT &labelInfo) const VULKAN_HPP_NOEXCEPT;

	void endDebugUtilsLabelEXT() const VULKAN_HPP_NOEXCEPT;

	void insertDebugUtilsLabelEXT(const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT &labelInfo) const VULKAN_HPP_NOEXCEPT;

	//=== VK_NV_device_diagnostic_checkpoints ===

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::CheckpointDataNV> getCheckpointDataNV() const VULKAN_HPP_NOEXCEPT;

	//=== VK_INTEL_performance_query ===

	void setPerformanceConfigurationINTEL(VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration) const;

	//=== VK_KHR_synchronization2 ===

	void submit2KHR(ArrayProxy<const VULKAN_HPP_NAMESPACE::SubmitInfo2> const &submits,
	                VULKAN_HPP_NAMESPACE::Fence fence VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::CheckpointData2NV> getCheckpointData2NV() const VULKAN_HPP_NOEXCEPT;

private:
	VULKAN_HPP_NAMESPACE::Queue m_queue = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class RenderPass
{
public:
	using CType = VkRenderPass;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eRenderPass;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eRenderPass;

public:
	RenderPass(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	           VULKAN_HPP_NAMESPACE::RenderPassCreateInfo const &createInfo,
	           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkCreateRenderPass(static_cast<VkDevice>(*device),
		                                               reinterpret_cast<const VkRenderPassCreateInfo *>(&createInfo),
		                                               reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                               reinterpret_cast<VkRenderPass *>(&m_renderPass)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateRenderPass");
		}
	}

	RenderPass(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	           VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 const &createInfo,
	           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkCreateRenderPass2(static_cast<VkDevice>(*device),
		                                                reinterpret_cast<const VkRenderPassCreateInfo2 *>(&createInfo),
		                                                reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                reinterpret_cast<VkRenderPass *>(&m_renderPass)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateRenderPass2");
		}
	}

	RenderPass(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	           VkRenderPass renderPass,
	           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_renderPass(renderPass)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	RenderPass(std::nullptr_t) {}

	~RenderPass()
	{
		clear();
	}

	RenderPass() = delete;
	RenderPass(RenderPass const &) = delete;
	RenderPass(RenderPass &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_renderPass(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_renderPass, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	RenderPass &operator=(RenderPass const &) = delete;
	RenderPass &operator=(RenderPass &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_renderPass = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_renderPass, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::RenderPass const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_renderPass;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_renderPass)
		{
			getDispatcher()->vkDestroyRenderPass(
			    static_cast<VkDevice>(m_device), static_cast<VkRenderPass>(m_renderPass), reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_renderPass = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::RenderPass &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_renderPass, rhs.m_renderPass);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_VERSION_1_0 ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Extent2D getRenderAreaGranularity() const VULKAN_HPP_NOEXCEPT;

	//=== VK_HUAWEI_subpass_shading ===

	VULKAN_HPP_NODISCARD std::pair<VULKAN_HPP_NAMESPACE::Result, VULKAN_HPP_NAMESPACE::Extent2D> getSubpassShadingMaxWorkgroupSizeHUAWEI() const;

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::RenderPass m_renderPass = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class Sampler
{
public:
	using CType = VkSampler;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eSampler;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSampler;

public:
	Sampler(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	        VULKAN_HPP_NAMESPACE::SamplerCreateInfo const &createInfo,
	        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result =
		    static_cast<VULKAN_HPP_NAMESPACE::Result>(device.getDispatcher()->vkCreateSampler(static_cast<VkDevice>(*device),
		                                                                                      reinterpret_cast<const VkSamplerCreateInfo *>(&createInfo),
		                                                                                      reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                                                      reinterpret_cast<VkSampler *>(&m_sampler)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateSampler");
		}
	}

	Sampler(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	        VkSampler sampler,
	        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_sampler(sampler)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	Sampler(std::nullptr_t) {}

	~Sampler()
	{
		clear();
	}

	Sampler() = delete;
	Sampler(Sampler const &) = delete;
	Sampler(Sampler &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_sampler(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_sampler, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	Sampler &operator=(Sampler const &) = delete;
	Sampler &operator=(Sampler &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_sampler = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_sampler, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::Sampler const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_sampler;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_sampler)
		{
			getDispatcher()->vkDestroySampler(
			    static_cast<VkDevice>(m_device), static_cast<VkSampler>(m_sampler), reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_sampler = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Sampler &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_sampler, rhs.m_sampler);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::Sampler m_sampler = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class SamplerYcbcrConversion
{
public:
	using CType = VkSamplerYcbcrConversion;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eSamplerYcbcrConversion;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSamplerYcbcrConversion;

public:
	SamplerYcbcrConversion(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                       VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo const &createInfo,
	                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkCreateSamplerYcbcrConversion(static_cast<VkDevice>(*device),
		                                                           reinterpret_cast<const VkSamplerYcbcrConversionCreateInfo *>(&createInfo),
		                                                           reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                           reinterpret_cast<VkSamplerYcbcrConversion *>(&m_ycbcrConversion)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateSamplerYcbcrConversion");
		}
	}

	SamplerYcbcrConversion(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                       VkSamplerYcbcrConversion ycbcrConversion,
	                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_ycbcrConversion(ycbcrConversion)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	SamplerYcbcrConversion(std::nullptr_t) {}

	~SamplerYcbcrConversion()
	{
		clear();
	}

	SamplerYcbcrConversion() = delete;
	SamplerYcbcrConversion(SamplerYcbcrConversion const &) = delete;
	SamplerYcbcrConversion(SamplerYcbcrConversion &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_ycbcrConversion(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_ycbcrConversion, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	SamplerYcbcrConversion &operator=(SamplerYcbcrConversion const &) = delete;
	SamplerYcbcrConversion &operator=(SamplerYcbcrConversion &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_ycbcrConversion = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_ycbcrConversion, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_ycbcrConversion;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_ycbcrConversion)
		{
			getDispatcher()->vkDestroySamplerYcbcrConversion(static_cast<VkDevice>(m_device),
			                                                 static_cast<VkSamplerYcbcrConversion>(m_ycbcrConversion),
			                                                 reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_ycbcrConversion = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SamplerYcbcrConversion &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_ycbcrConversion, rhs.m_ycbcrConversion);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion m_ycbcrConversion = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class Semaphore
{
public:
	using CType = VkSemaphore;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eSemaphore;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSemaphore;

public:
	Semaphore(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	          VULKAN_HPP_NAMESPACE::SemaphoreCreateInfo const &createInfo,
	          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result =
		    static_cast<VULKAN_HPP_NAMESPACE::Result>(device.getDispatcher()->vkCreateSemaphore(static_cast<VkDevice>(*device),
		                                                                                        reinterpret_cast<const VkSemaphoreCreateInfo *>(&createInfo),
		                                                                                        reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                                                        reinterpret_cast<VkSemaphore *>(&m_semaphore)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateSemaphore");
		}
	}

	Semaphore(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	          VkSemaphore semaphore,
	          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_semaphore(semaphore)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	Semaphore(std::nullptr_t) {}

	~Semaphore()
	{
		clear();
	}

	Semaphore() = delete;
	Semaphore(Semaphore const &) = delete;
	Semaphore(Semaphore &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_semaphore(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_semaphore, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	Semaphore &operator=(Semaphore const &) = delete;
	Semaphore &operator=(Semaphore &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_semaphore = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_semaphore, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::Semaphore const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_semaphore;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_semaphore)
		{
			getDispatcher()->vkDestroySemaphore(
			    static_cast<VkDevice>(m_device), static_cast<VkSemaphore>(m_semaphore), reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_semaphore = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Semaphore &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_semaphore, rhs.m_semaphore);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_VERSION_1_2 ===

	VULKAN_HPP_NODISCARD uint64_t getCounterValue() const;

	//=== VK_KHR_timeline_semaphore ===

	VULKAN_HPP_NODISCARD uint64_t getCounterValueKHR() const;

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::Semaphore m_semaphore = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class ShaderModule
{
public:
	using CType = VkShaderModule;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eShaderModule;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eShaderModule;

public:
	ShaderModule(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	             VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo const &createInfo,
	             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkCreateShaderModule(static_cast<VkDevice>(*device),
		                                                 reinterpret_cast<const VkShaderModuleCreateInfo *>(&createInfo),
		                                                 reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                 reinterpret_cast<VkShaderModule *>(&m_shaderModule)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateShaderModule");
		}
	}

	ShaderModule(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	             VkShaderModule shaderModule,
	             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_shaderModule(shaderModule)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	ShaderModule(std::nullptr_t) {}

	~ShaderModule()
	{
		clear();
	}

	ShaderModule() = delete;
	ShaderModule(ShaderModule const &) = delete;
	ShaderModule(ShaderModule &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_shaderModule(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_shaderModule, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	ShaderModule &operator=(ShaderModule const &) = delete;
	ShaderModule &operator=(ShaderModule &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_shaderModule = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_shaderModule, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::ShaderModule const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_shaderModule;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_shaderModule)
		{
			getDispatcher()->vkDestroyShaderModule(
			    static_cast<VkDevice>(m_device), static_cast<VkShaderModule>(m_shaderModule), reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_shaderModule = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ShaderModule &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_shaderModule, rhs.m_shaderModule);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::ShaderModule m_shaderModule = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class SurfaceKHR
{
public:
	using CType = VkSurfaceKHR;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eSurfaceKHR;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSurfaceKHR;

public:
#	if defined(VK_USE_PLATFORM_ANDROID_KHR)
	SurfaceKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &instance,
	           VULKAN_HPP_NAMESPACE::AndroidSurfaceCreateInfoKHR const &createInfo,
	           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_instance(*instance)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(instance.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    instance.getDispatcher()->vkCreateAndroidSurfaceKHR(static_cast<VkInstance>(*instance),
		                                                        reinterpret_cast<const VkAndroidSurfaceCreateInfoKHR *>(&createInfo),
		                                                        reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                        reinterpret_cast<VkSurfaceKHR *>(&m_surface)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateAndroidSurfaceKHR");
		}
	}
#	endif /*VK_USE_PLATFORM_ANDROID_KHR*/

#	if defined(VK_USE_PLATFORM_DIRECTFB_EXT)
	SurfaceKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &instance,
	           VULKAN_HPP_NAMESPACE::DirectFBSurfaceCreateInfoEXT const &createInfo,
	           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_instance(*instance)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(instance.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    instance.getDispatcher()->vkCreateDirectFBSurfaceEXT(static_cast<VkInstance>(*instance),
		                                                         reinterpret_cast<const VkDirectFBSurfaceCreateInfoEXT *>(&createInfo),
		                                                         reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                         reinterpret_cast<VkSurfaceKHR *>(&m_surface)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateDirectFBSurfaceEXT");
		}
	}
#	endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/

	SurfaceKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &instance,
	           VULKAN_HPP_NAMESPACE::DisplaySurfaceCreateInfoKHR const &createInfo,
	           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_instance(*instance)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(instance.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    instance.getDispatcher()->vkCreateDisplayPlaneSurfaceKHR(static_cast<VkInstance>(*instance),
		                                                             reinterpret_cast<const VkDisplaySurfaceCreateInfoKHR *>(&createInfo),
		                                                             reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                             reinterpret_cast<VkSurfaceKHR *>(&m_surface)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateDisplayPlaneSurfaceKHR");
		}
	}

	SurfaceKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &instance,
	           VULKAN_HPP_NAMESPACE::HeadlessSurfaceCreateInfoEXT const &createInfo,
	           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_instance(*instance)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(instance.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    instance.getDispatcher()->vkCreateHeadlessSurfaceEXT(static_cast<VkInstance>(*instance),
		                                                         reinterpret_cast<const VkHeadlessSurfaceCreateInfoEXT *>(&createInfo),
		                                                         reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                         reinterpret_cast<VkSurfaceKHR *>(&m_surface)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateHeadlessSurfaceEXT");
		}
	}

#	if defined(VK_USE_PLATFORM_IOS_MVK)
	SurfaceKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &instance,
	           VULKAN_HPP_NAMESPACE::IOSSurfaceCreateInfoMVK const &createInfo,
	           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_instance(*instance)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(instance.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    instance.getDispatcher()->vkCreateIOSSurfaceMVK(static_cast<VkInstance>(*instance),
		                                                    reinterpret_cast<const VkIOSSurfaceCreateInfoMVK *>(&createInfo),
		                                                    reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                    reinterpret_cast<VkSurfaceKHR *>(&m_surface)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateIOSSurfaceMVK");
		}
	}
#	endif /*VK_USE_PLATFORM_IOS_MVK*/

#	if defined(VK_USE_PLATFORM_FUCHSIA)
	SurfaceKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &instance,
	           VULKAN_HPP_NAMESPACE::ImagePipeSurfaceCreateInfoFUCHSIA const &createInfo,
	           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_instance(*instance)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(instance.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    instance.getDispatcher()->vkCreateImagePipeSurfaceFUCHSIA(static_cast<VkInstance>(*instance),
		                                                              reinterpret_cast<const VkImagePipeSurfaceCreateInfoFUCHSIA *>(&createInfo),
		                                                              reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                              reinterpret_cast<VkSurfaceKHR *>(&m_surface)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateImagePipeSurfaceFUCHSIA");
		}
	}
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

#	if defined(VK_USE_PLATFORM_MACOS_MVK)
	SurfaceKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &instance,
	           VULKAN_HPP_NAMESPACE::MacOSSurfaceCreateInfoMVK const &createInfo,
	           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_instance(*instance)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(instance.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    instance.getDispatcher()->vkCreateMacOSSurfaceMVK(static_cast<VkInstance>(*instance),
		                                                      reinterpret_cast<const VkMacOSSurfaceCreateInfoMVK *>(&createInfo),
		                                                      reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                      reinterpret_cast<VkSurfaceKHR *>(&m_surface)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateMacOSSurfaceMVK");
		}
	}
#	endif /*VK_USE_PLATFORM_MACOS_MVK*/

#	if defined(VK_USE_PLATFORM_METAL_EXT)
	SurfaceKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &instance,
	           VULKAN_HPP_NAMESPACE::MetalSurfaceCreateInfoEXT const &createInfo,
	           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_instance(*instance)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(instance.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    instance.getDispatcher()->vkCreateMetalSurfaceEXT(static_cast<VkInstance>(*instance),
		                                                      reinterpret_cast<const VkMetalSurfaceCreateInfoEXT *>(&createInfo),
		                                                      reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                      reinterpret_cast<VkSurfaceKHR *>(&m_surface)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateMetalSurfaceEXT");
		}
	}
#	endif /*VK_USE_PLATFORM_METAL_EXT*/

#	if defined(VK_USE_PLATFORM_SCREEN_QNX)
	SurfaceKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &instance,
	           VULKAN_HPP_NAMESPACE::ScreenSurfaceCreateInfoQNX const &createInfo,
	           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_instance(*instance)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(instance.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    instance.getDispatcher()->vkCreateScreenSurfaceQNX(static_cast<VkInstance>(*instance),
		                                                       reinterpret_cast<const VkScreenSurfaceCreateInfoQNX *>(&createInfo),
		                                                       reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                       reinterpret_cast<VkSurfaceKHR *>(&m_surface)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateScreenSurfaceQNX");
		}
	}
#	endif /*VK_USE_PLATFORM_SCREEN_QNX*/

#	if defined(VK_USE_PLATFORM_GGP)
	SurfaceKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &instance,
	           VULKAN_HPP_NAMESPACE::StreamDescriptorSurfaceCreateInfoGGP const &createInfo,
	           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_instance(*instance)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(instance.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    instance.getDispatcher()->vkCreateStreamDescriptorSurfaceGGP(static_cast<VkInstance>(*instance),
		                                                                 reinterpret_cast<const VkStreamDescriptorSurfaceCreateInfoGGP *>(&createInfo),
		                                                                 reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                                 reinterpret_cast<VkSurfaceKHR *>(&m_surface)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateStreamDescriptorSurfaceGGP");
		}
	}
#	endif /*VK_USE_PLATFORM_GGP*/

#	if defined(VK_USE_PLATFORM_VI_NN)
	SurfaceKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &instance,
	           VULKAN_HPP_NAMESPACE::ViSurfaceCreateInfoNN const &createInfo,
	           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_instance(*instance)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(instance.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    instance.getDispatcher()->vkCreateViSurfaceNN(static_cast<VkInstance>(*instance),
		                                                  reinterpret_cast<const VkViSurfaceCreateInfoNN *>(&createInfo),
		                                                  reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                  reinterpret_cast<VkSurfaceKHR *>(&m_surface)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateViSurfaceNN");
		}
	}
#	endif /*VK_USE_PLATFORM_VI_NN*/

#	if defined(VK_USE_PLATFORM_WAYLAND_KHR)
	SurfaceKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &instance,
	           VULKAN_HPP_NAMESPACE::WaylandSurfaceCreateInfoKHR const &createInfo,
	           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_instance(*instance)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(instance.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    instance.getDispatcher()->vkCreateWaylandSurfaceKHR(static_cast<VkInstance>(*instance),
		                                                        reinterpret_cast<const VkWaylandSurfaceCreateInfoKHR *>(&createInfo),
		                                                        reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                        reinterpret_cast<VkSurfaceKHR *>(&m_surface)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateWaylandSurfaceKHR");
		}
	}
#	endif /*VK_USE_PLATFORM_WAYLAND_KHR*/

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
	SurfaceKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &instance,
	           VULKAN_HPP_NAMESPACE::Win32SurfaceCreateInfoKHR const &createInfo,
	           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_instance(*instance)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(instance.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    instance.getDispatcher()->vkCreateWin32SurfaceKHR(static_cast<VkInstance>(*instance),
		                                                      reinterpret_cast<const VkWin32SurfaceCreateInfoKHR *>(&createInfo),
		                                                      reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                      reinterpret_cast<VkSurfaceKHR *>(&m_surface)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateWin32SurfaceKHR");
		}
	}
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

#	if defined(VK_USE_PLATFORM_XCB_KHR)
	SurfaceKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &instance,
	           VULKAN_HPP_NAMESPACE::XcbSurfaceCreateInfoKHR const &createInfo,
	           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_instance(*instance)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(instance.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    instance.getDispatcher()->vkCreateXcbSurfaceKHR(static_cast<VkInstance>(*instance),
		                                                    reinterpret_cast<const VkXcbSurfaceCreateInfoKHR *>(&createInfo),
		                                                    reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                    reinterpret_cast<VkSurfaceKHR *>(&m_surface)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateXcbSurfaceKHR");
		}
	}
#	endif /*VK_USE_PLATFORM_XCB_KHR*/

#	if defined(VK_USE_PLATFORM_XLIB_KHR)
	SurfaceKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &instance,
	           VULKAN_HPP_NAMESPACE::XlibSurfaceCreateInfoKHR const &createInfo,
	           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_instance(*instance)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(instance.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    instance.getDispatcher()->vkCreateXlibSurfaceKHR(static_cast<VkInstance>(*instance),
		                                                     reinterpret_cast<const VkXlibSurfaceCreateInfoKHR *>(&createInfo),
		                                                     reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                     reinterpret_cast<VkSurfaceKHR *>(&m_surface)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateXlibSurfaceKHR");
		}
	}
#	endif /*VK_USE_PLATFORM_XLIB_KHR*/

	SurfaceKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Instance const &instance,
	           VkSurfaceKHR surface,
	           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_instance(*instance)
	    , m_surface(surface)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(instance.getDispatcher())
	{
	}

	SurfaceKHR(std::nullptr_t) {}

	~SurfaceKHR()
	{
		clear();
	}

	SurfaceKHR() = delete;
	SurfaceKHR(SurfaceKHR const &) = delete;
	SurfaceKHR(SurfaceKHR &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_instance(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_instance, {})),
	      m_surface(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_surface, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	SurfaceKHR &operator=(SurfaceKHR const &) = delete;
	SurfaceKHR &operator=(SurfaceKHR &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_instance = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_instance, {});
			m_surface = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_surface, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::SurfaceKHR const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_surface;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_surface)
		{
			getDispatcher()->vkDestroySurfaceKHR(
			    static_cast<VkInstance>(m_instance), static_cast<VkSurfaceKHR>(m_surface), reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_instance = nullptr;
		m_surface = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Instance getInstance() const
	{
		return m_instance;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_instance, rhs.m_instance);
		std::swap(m_surface, rhs.m_surface);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

private:
	VULKAN_HPP_NAMESPACE::Instance m_instance = {};
	VULKAN_HPP_NAMESPACE::SurfaceKHR m_surface = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher const *m_dispatcher = nullptr;
};

class SwapchainKHR
{
public:
	using CType = VkSwapchainKHR;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eSwapchainKHR;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eSwapchainKHR;

public:
	SwapchainKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	             VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR const &createInfo,
	             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkCreateSwapchainKHR(static_cast<VkDevice>(*device),
		                                                 reinterpret_cast<const VkSwapchainCreateInfoKHR *>(&createInfo),
		                                                 reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                 reinterpret_cast<VkSwapchainKHR *>(&m_swapchain)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateSwapchainKHR");
		}
	}

	SwapchainKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	             VkSwapchainKHR swapchain,
	             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_swapchain(swapchain)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	SwapchainKHR(std::nullptr_t) {}

	~SwapchainKHR()
	{
		clear();
	}

	SwapchainKHR() = delete;
	SwapchainKHR(SwapchainKHR const &) = delete;
	SwapchainKHR(SwapchainKHR &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_swapchain(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_swapchain, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	SwapchainKHR &operator=(SwapchainKHR const &) = delete;
	SwapchainKHR &operator=(SwapchainKHR &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_swapchain = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_swapchain, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::SwapchainKHR const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_swapchain;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_swapchain)
		{
			getDispatcher()->vkDestroySwapchainKHR(
			    static_cast<VkDevice>(m_device), static_cast<VkSwapchainKHR>(m_swapchain), reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_swapchain = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SwapchainKHR &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_swapchain, rhs.m_swapchain);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_KHR_swapchain ===

	VULKAN_HPP_NODISCARD std::vector<VkImage> getImages() const;

	VULKAN_HPP_NODISCARD std::pair<VULKAN_HPP_NAMESPACE::Result, uint32_t>
	acquireNextImage(uint64_t timeout,
	                 VULKAN_HPP_NAMESPACE::Semaphore semaphore VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT,
	                 VULKAN_HPP_NAMESPACE::Fence fence VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT) const;

	//=== VK_EXT_display_control ===

	VULKAN_HPP_NODISCARD uint64_t getCounterEXT(VULKAN_HPP_NAMESPACE::SurfaceCounterFlagBitsEXT counter) const;

	//=== VK_GOOGLE_display_timing ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::RefreshCycleDurationGOOGLE getRefreshCycleDurationGOOGLE() const;

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE> getPastPresentationTimingGOOGLE() const;

	//=== VK_KHR_shared_presentable_image ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result getStatus() const;

	//=== VK_AMD_display_native_hdr ===

	void setLocalDimmingAMD(VULKAN_HPP_NAMESPACE::Bool32 localDimmingEnable) const VULKAN_HPP_NOEXCEPT;

	//=== VK_KHR_present_wait ===

	VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result waitForPresent(uint64_t presentId, uint64_t timeout) const;

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
	//=== VK_EXT_full_screen_exclusive ===

	void acquireFullScreenExclusiveModeEXT() const;

	void releaseFullScreenExclusiveModeEXT() const;
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::SwapchainKHR m_swapchain = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

class SwapchainKHRs : public std::vector<VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::SwapchainKHR>
{
public:
	SwapchainKHRs(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	              VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR> const &createInfos,
	              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	{
		VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *dispatcher = device.getDispatcher();
		std::vector<VkSwapchainKHR> swapchains(createInfos.size());
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(dispatcher->vkCreateSharedSwapchainsKHR(
		    static_cast<VkDevice>(*device),
		    createInfos.size(),
		    reinterpret_cast<const VkSwapchainCreateInfoKHR *>(createInfos.data()),
		    reinterpret_cast<const VkAllocationCallbacks *>(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator)),
		    swapchains.data()));
		if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			this->reserve(createInfos.size());
			for(auto const &swapchainKHR : swapchains)
			{
				this->emplace_back(device, swapchainKHR, allocator);
			}
		}
		else
		{
			throwResultException(result, "vkCreateSharedSwapchainsKHR");
		}
	}

	SwapchainKHRs(std::nullptr_t) {}

	SwapchainKHRs() = delete;
	SwapchainKHRs(SwapchainKHRs const &) = delete;
	SwapchainKHRs(SwapchainKHRs &&rhs) = default;
	SwapchainKHRs &operator=(SwapchainKHRs const &) = delete;
	SwapchainKHRs &operator=(SwapchainKHRs &&rhs) = default;
};

class ValidationCacheEXT
{
public:
	using CType = VkValidationCacheEXT;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eValidationCacheEXT;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eValidationCacheEXT;

public:
	ValidationCacheEXT(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                   VULKAN_HPP_NAMESPACE::ValidationCacheCreateInfoEXT const &createInfo,
	                   VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkCreateValidationCacheEXT(static_cast<VkDevice>(*device),
		                                                       reinterpret_cast<const VkValidationCacheCreateInfoEXT *>(&createInfo),
		                                                       reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                       reinterpret_cast<VkValidationCacheEXT *>(&m_validationCache)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateValidationCacheEXT");
		}
	}

	ValidationCacheEXT(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                   VkValidationCacheEXT validationCache,
	                   VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_validationCache(validationCache)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	ValidationCacheEXT(std::nullptr_t) {}

	~ValidationCacheEXT()
	{
		clear();
	}

	ValidationCacheEXT() = delete;
	ValidationCacheEXT(ValidationCacheEXT const &) = delete;
	ValidationCacheEXT(ValidationCacheEXT &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_validationCache(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_validationCache, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	ValidationCacheEXT &operator=(ValidationCacheEXT const &) = delete;
	ValidationCacheEXT &operator=(ValidationCacheEXT &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_validationCache = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_validationCache, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::ValidationCacheEXT const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_validationCache;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_validationCache)
		{
			getDispatcher()->vkDestroyValidationCacheEXT(static_cast<VkDevice>(m_device),
			                                             static_cast<VkValidationCacheEXT>(m_validationCache),
			                                             reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_validationCache = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ValidationCacheEXT &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_validationCache, rhs.m_validationCache);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_EXT_validation_cache ===

	void merge(ArrayProxy<const VULKAN_HPP_NAMESPACE::ValidationCacheEXT> const &srcCaches) const;

	VULKAN_HPP_NODISCARD std::vector<uint8_t> getData() const;

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::ValidationCacheEXT m_validationCache = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
class VideoSessionKHR
{
public:
	using CType = VkVideoSessionKHR;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eVideoSessionKHR;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;

public:
	VideoSessionKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                VULKAN_HPP_NAMESPACE::VideoSessionCreateInfoKHR const &createInfo,
	                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkCreateVideoSessionKHR(static_cast<VkDevice>(*device),
		                                                    reinterpret_cast<const VkVideoSessionCreateInfoKHR *>(&createInfo),
		                                                    reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                    reinterpret_cast<VkVideoSessionKHR *>(&m_videoSession)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateVideoSessionKHR");
		}
	}

	VideoSessionKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                VkVideoSessionKHR videoSession,
	                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_videoSession(videoSession)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	VideoSessionKHR(std::nullptr_t) {}

	~VideoSessionKHR()
	{
		clear();
	}

	VideoSessionKHR() = delete;
	VideoSessionKHR(VideoSessionKHR const &) = delete;
	VideoSessionKHR(VideoSessionKHR &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_videoSession(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_videoSession, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	VideoSessionKHR &operator=(VideoSessionKHR const &) = delete;
	VideoSessionKHR &operator=(VideoSessionKHR &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_videoSession = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_videoSession, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::VideoSessionKHR const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_videoSession;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_videoSession)
		{
			getDispatcher()->vkDestroyVideoSessionKHR(static_cast<VkDevice>(m_device),
			                                          static_cast<VkVideoSessionKHR>(m_videoSession),
			                                          reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_videoSession = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::VideoSessionKHR &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_videoSession, rhs.m_videoSession);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_KHR_video_queue ===

	VULKAN_HPP_NODISCARD std::vector<VULKAN_HPP_NAMESPACE::VideoGetMemoryPropertiesKHR> getMemoryRequirements() const;

	void bindMemory(ArrayProxy<const VULKAN_HPP_NAMESPACE::VideoBindMemoryKHR> const &videoSessionBindMemories) const;

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::VideoSessionKHR m_videoSession = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
class VideoSessionParametersKHR
{
public:
	using CType = VkVideoSessionParametersKHR;

	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType = VULKAN_HPP_NAMESPACE::ObjectType::eVideoSessionParametersKHR;
	static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
	    VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::eUnknown;

public:
	VideoSessionParametersKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                          VULKAN_HPP_NAMESPACE::VideoSessionParametersCreateInfoKHR const &createInfo,
	                          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
		VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    device.getDispatcher()->vkCreateVideoSessionParametersKHR(static_cast<VkDevice>(*device),
		                                                              reinterpret_cast<const VkVideoSessionParametersCreateInfoKHR *>(&createInfo),
		                                                              reinterpret_cast<const VkAllocationCallbacks *>(m_allocator),
		                                                              reinterpret_cast<VkVideoSessionParametersKHR *>(&m_videoSessionParameters)));
		if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
		{
			throwResultException(result, "vkCreateVideoSessionParametersKHR");
		}
	}

	VideoSessionParametersKHR(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::Device const &device,
	                          VkVideoSessionParametersKHR videoSessionParameters,
	                          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator = nullptr)
	    : m_device(*device)
	    , m_videoSessionParameters(videoSessionParameters)
	    , m_allocator(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator))
	    , m_dispatcher(device.getDispatcher())
	{
	}

	VideoSessionParametersKHR(std::nullptr_t) {}

	~VideoSessionParametersKHR()
	{
		clear();
	}

	VideoSessionParametersKHR() = delete;
	VideoSessionParametersKHR(VideoSessionParametersKHR const &) = delete;
	VideoSessionParametersKHR(VideoSessionParametersKHR &&rhs) VULKAN_HPP_NOEXCEPT
	    : m_device(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {})),
	      m_videoSessionParameters(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_videoSessionParameters, {})),
	      m_allocator(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {})),
	      m_dispatcher(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr))
	{
	}
	VideoSessionParametersKHR &operator=(VideoSessionParametersKHR const &) = delete;
	VideoSessionParametersKHR &operator=(VideoSessionParametersKHR &&rhs) VULKAN_HPP_NOEXCEPT
	{
		if(this != &rhs)
		{
			clear();
			m_device = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_device, {});
			m_videoSessionParameters = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_videoSessionParameters, {});
			m_allocator = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_allocator, {});
			m_dispatcher = VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::exchange(rhs.m_dispatcher, nullptr);
		}
		return *this;
	}

	VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR const &operator*() const VULKAN_HPP_NOEXCEPT
	{
		return m_videoSessionParameters;
	}

	void clear() VULKAN_HPP_NOEXCEPT
	{
		if(m_videoSessionParameters)
		{
			getDispatcher()->vkDestroyVideoSessionParametersKHR(static_cast<VkDevice>(m_device),
			                                                    static_cast<VkVideoSessionParametersKHR>(m_videoSessionParameters),
			                                                    reinterpret_cast<const VkAllocationCallbacks *>(m_allocator));
		}
		m_device = nullptr;
		m_videoSessionParameters = nullptr;
		m_allocator = nullptr;
		m_dispatcher = nullptr;
	}

	VULKAN_HPP_NAMESPACE::Device getDevice() const
	{
		return m_device;
	}

	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *getDispatcher() const
	{
		VULKAN_HPP_ASSERT(m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION);
		return m_dispatcher;
	}

	void swap(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::VideoSessionParametersKHR &rhs) VULKAN_HPP_NOEXCEPT
	{
		std::swap(m_device, rhs.m_device);
		std::swap(m_videoSessionParameters, rhs.m_videoSessionParameters);
		std::swap(m_allocator, rhs.m_allocator);
		std::swap(m_dispatcher, rhs.m_dispatcher);
	}

	//=== VK_KHR_video_queue ===

	void update(const VULKAN_HPP_NAMESPACE::VideoSessionParametersUpdateInfoKHR &updateInfo) const;

private:
	VULKAN_HPP_NAMESPACE::Device m_device = {};
	VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR m_videoSessionParameters = {};
	const VULKAN_HPP_NAMESPACE::AllocationCallbacks *m_allocator = {};
	VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const *m_dispatcher = nullptr;
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

//===========================
//=== COMMAND Definitions ===
//===========================

//=== VK_VERSION_1_0 ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::Instance
Context::createInstance(VULKAN_HPP_NAMESPACE::InstanceCreateInfo const &createInfo,
                        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::Instance(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_RAII_NAMESPACE::PhysicalDevice> Instance::enumeratePhysicalDevices() const
{
	return VULKAN_HPP_RAII_NAMESPACE::PhysicalDevices(*this);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures PhysicalDevice::getFeatures() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures features;
	getDispatcher()->vkGetPhysicalDeviceFeatures(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                             reinterpret_cast<VkPhysicalDeviceFeatures *>(&features));
	return features;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::FormatProperties
PhysicalDevice::getFormatProperties(VULKAN_HPP_NAMESPACE::Format format) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_NAMESPACE::FormatProperties formatProperties;
	getDispatcher()->vkGetPhysicalDeviceFormatProperties(
	    static_cast<VkPhysicalDevice>(m_physicalDevice), static_cast<VkFormat>(format), reinterpret_cast<VkFormatProperties *>(&formatProperties));
	return formatProperties;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ImageFormatProperties
PhysicalDevice::getImageFormatProperties(VULKAN_HPP_NAMESPACE::Format format,
                                         VULKAN_HPP_NAMESPACE::ImageType type,
                                         VULKAN_HPP_NAMESPACE::ImageTiling tiling,
                                         VULKAN_HPP_NAMESPACE::ImageUsageFlags usage,
                                         VULKAN_HPP_NAMESPACE::ImageCreateFlags flags) const
{
	VULKAN_HPP_NAMESPACE::ImageFormatProperties imageFormatProperties;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetPhysicalDeviceImageFormatProperties(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                              static_cast<VkFormat>(format),
	                                                              static_cast<VkImageType>(type),
	                                                              static_cast<VkImageTiling>(tiling),
	                                                              static_cast<VkImageUsageFlags>(usage),
	                                                              static_cast<VkImageCreateFlags>(flags),
	                                                              reinterpret_cast<VkImageFormatProperties *>(&imageFormatProperties)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getImageFormatProperties");
	}
	return imageFormatProperties;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties PhysicalDevice::getProperties() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties properties;
	getDispatcher()->vkGetPhysicalDeviceProperties(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                               reinterpret_cast<VkPhysicalDeviceProperties *>(&properties));
	return properties;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties>
PhysicalDevice::getQueueFamilyProperties() const VULKAN_HPP_NOEXCEPT
{
	uint32_t queueFamilyPropertyCount;
	getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties(static_cast<VkPhysicalDevice>(m_physicalDevice), &queueFamilyPropertyCount, nullptr);
	std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties> queueFamilyProperties(queueFamilyPropertyCount);
	getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                          &queueFamilyPropertyCount,
	                                                          reinterpret_cast<VkQueueFamilyProperties *>(queueFamilyProperties.data()));
	VULKAN_HPP_ASSERT(queueFamilyPropertyCount == queueFamilyProperties.size());
	return queueFamilyProperties;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties PhysicalDevice::getMemoryProperties() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties memoryProperties;
	getDispatcher()->vkGetPhysicalDeviceMemoryProperties(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                     reinterpret_cast<VkPhysicalDeviceMemoryProperties *>(&memoryProperties));
	return memoryProperties;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE PFN_vkVoidFunction Instance::getProcAddr(const std::string &name) const VULKAN_HPP_NOEXCEPT
{
	return getDispatcher()->vkGetInstanceProcAddr(static_cast<VkInstance>(m_instance), name.c_str());
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE PFN_vkVoidFunction Device::getProcAddr(const std::string &name) const VULKAN_HPP_NOEXCEPT
{
	return getDispatcher()->vkGetDeviceProcAddr(static_cast<VkDevice>(m_device), name.c_str());
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::Device
PhysicalDevice::createDevice(VULKAN_HPP_NAMESPACE::DeviceCreateInfo const &createInfo,
                             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::Device(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::ExtensionProperties>
Context::enumerateInstanceExtensionProperties(Optional<const std::string> layerName) const
{
	std::vector<VULKAN_HPP_NAMESPACE::ExtensionProperties> properties;
	uint32_t propertyCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    getDispatcher()->vkEnumerateInstanceExtensionProperties(layerName ? layerName->c_str() : nullptr, &propertyCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && propertyCount)
		{
			properties.resize(propertyCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkEnumerateInstanceExtensionProperties(
			    layerName ? layerName->c_str() : nullptr, &propertyCount, reinterpret_cast<VkExtensionProperties *>(properties.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Context::enumerateInstanceExtensionProperties");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(propertyCount <= properties.size());
		if(propertyCount < properties.size())
		{
			properties.resize(propertyCount);
		}
	}
	return properties;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::ExtensionProperties>
PhysicalDevice::enumerateDeviceExtensionProperties(Optional<const std::string> layerName) const
{
	std::vector<VULKAN_HPP_NAMESPACE::ExtensionProperties> properties;
	uint32_t propertyCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkEnumerateDeviceExtensionProperties(
		    static_cast<VkPhysicalDevice>(m_physicalDevice), layerName ? layerName->c_str() : nullptr, &propertyCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && propertyCount)
		{
			properties.resize(propertyCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
			    getDispatcher()->vkEnumerateDeviceExtensionProperties(static_cast<VkPhysicalDevice>(m_physicalDevice),
			                                                          layerName ? layerName->c_str() : nullptr,
			                                                          &propertyCount,
			                                                          reinterpret_cast<VkExtensionProperties *>(properties.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::enumerateDeviceExtensionProperties");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(propertyCount <= properties.size());
		if(propertyCount < properties.size())
		{
			properties.resize(propertyCount);
		}
	}
	return properties;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::LayerProperties> Context::enumerateInstanceLayerProperties() const
{
	std::vector<VULKAN_HPP_NAMESPACE::LayerProperties> properties;
	uint32_t propertyCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkEnumerateInstanceLayerProperties(&propertyCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && propertyCount)
		{
			properties.resize(propertyCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
			    getDispatcher()->vkEnumerateInstanceLayerProperties(&propertyCount, reinterpret_cast<VkLayerProperties *>(properties.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Context::enumerateInstanceLayerProperties");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(propertyCount <= properties.size());
		if(propertyCount < properties.size())
		{
			properties.resize(propertyCount);
		}
	}
	return properties;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::LayerProperties> PhysicalDevice::enumerateDeviceLayerProperties() const
{
	std::vector<VULKAN_HPP_NAMESPACE::LayerProperties> properties;
	uint32_t propertyCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    getDispatcher()->vkEnumerateDeviceLayerProperties(static_cast<VkPhysicalDevice>(m_physicalDevice), &propertyCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && propertyCount)
		{
			properties.resize(propertyCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkEnumerateDeviceLayerProperties(
			    static_cast<VkPhysicalDevice>(m_physicalDevice), &propertyCount, reinterpret_cast<VkLayerProperties *>(properties.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::enumerateDeviceLayerProperties");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(propertyCount <= properties.size());
		if(propertyCount < properties.size())
		{
			properties.resize(propertyCount);
		}
	}
	return properties;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::Queue Device::getQueue(uint32_t queueFamilyIndex, uint32_t queueIndex) const
{
	return VULKAN_HPP_RAII_NAMESPACE::Queue(*this, queueFamilyIndex, queueIndex);
}

VULKAN_HPP_INLINE void Queue::submit(ArrayProxy<const VULKAN_HPP_NAMESPACE::SubmitInfo> const &submits, VULKAN_HPP_NAMESPACE::Fence fence) const
{
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkQueueSubmit(
	    static_cast<VkQueue>(m_queue), submits.size(), reinterpret_cast<const VkSubmitInfo *>(submits.data()), static_cast<VkFence>(fence)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Queue::submit");
	}
}

VULKAN_HPP_INLINE void Queue::waitIdle() const
{
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkQueueWaitIdle(static_cast<VkQueue>(m_queue)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Queue::waitIdle");
	}
}

VULKAN_HPP_INLINE void Device::waitIdle() const
{
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkDeviceWaitIdle(static_cast<VkDevice>(m_device)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::waitIdle");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::DeviceMemory
Device::allocateMemory(VULKAN_HPP_NAMESPACE::MemoryAllocateInfo const &allocateInfo,
                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::DeviceMemory(*this, allocateInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE void *DeviceMemory::mapMemory(VULKAN_HPP_NAMESPACE::DeviceSize offset,
                                                                     VULKAN_HPP_NAMESPACE::DeviceSize size,
                                                                     VULKAN_HPP_NAMESPACE::MemoryMapFlags flags) const
{
	void *pData;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkMapMemory(static_cast<VkDevice>(m_device),
	                                                                                                             static_cast<VkDeviceMemory>(m_memory),
	                                                                                                             static_cast<VkDeviceSize>(offset),
	                                                                                                             static_cast<VkDeviceSize>(size),
	                                                                                                             static_cast<VkMemoryMapFlags>(flags),
	                                                                                                             &pData));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::DeviceMemory::mapMemory");
	}
	return pData;
}

VULKAN_HPP_INLINE void DeviceMemory::unmapMemory() const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkUnmapMemory(static_cast<VkDevice>(m_device), static_cast<VkDeviceMemory>(m_memory));
}

VULKAN_HPP_INLINE void Device::flushMappedMemoryRanges(ArrayProxy<const VULKAN_HPP_NAMESPACE::MappedMemoryRange> const &memoryRanges) const
{
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkFlushMappedMemoryRanges(
	    static_cast<VkDevice>(m_device), memoryRanges.size(), reinterpret_cast<const VkMappedMemoryRange *>(memoryRanges.data())));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::flushMappedMemoryRanges");
	}
}

VULKAN_HPP_INLINE void Device::invalidateMappedMemoryRanges(ArrayProxy<const VULKAN_HPP_NAMESPACE::MappedMemoryRange> const &memoryRanges) const
{
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkInvalidateMappedMemoryRanges(
	    static_cast<VkDevice>(m_device), memoryRanges.size(), reinterpret_cast<const VkMappedMemoryRange *>(memoryRanges.data())));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::invalidateMappedMemoryRanges");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceSize DeviceMemory::getCommitment() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_NAMESPACE::DeviceSize committedMemoryInBytes;
	getDispatcher()->vkGetDeviceMemoryCommitment(
	    static_cast<VkDevice>(m_device), static_cast<VkDeviceMemory>(m_memory), reinterpret_cast<VkDeviceSize *>(&committedMemoryInBytes));
	return committedMemoryInBytes;
}

VULKAN_HPP_INLINE void Buffer::bindMemory(VULKAN_HPP_NAMESPACE::DeviceMemory memory, VULKAN_HPP_NAMESPACE::DeviceSize memoryOffset) const
{
	VULKAN_HPP_NAMESPACE::Result result =
	    static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkBindBufferMemory(static_cast<VkDevice>(m_device),
	                                                                                  static_cast<VkBuffer>(m_buffer),
	                                                                                  static_cast<VkDeviceMemory>(memory),
	                                                                                  static_cast<VkDeviceSize>(memoryOffset)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Buffer::bindMemory");
	}
}

VULKAN_HPP_INLINE void Image::bindMemory(VULKAN_HPP_NAMESPACE::DeviceMemory memory, VULKAN_HPP_NAMESPACE::DeviceSize memoryOffset) const
{
	VULKAN_HPP_NAMESPACE::Result result =
	    static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkBindImageMemory(static_cast<VkDevice>(m_device),
	                                                                                 static_cast<VkImage>(m_image),
	                                                                                 static_cast<VkDeviceMemory>(memory),
	                                                                                 static_cast<VkDeviceSize>(memoryOffset)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Image::bindMemory");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements Buffer::getMemoryRequirements() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_NAMESPACE::MemoryRequirements memoryRequirements;
	getDispatcher()->vkGetBufferMemoryRequirements(
	    static_cast<VkDevice>(m_device), static_cast<VkBuffer>(m_buffer), reinterpret_cast<VkMemoryRequirements *>(&memoryRequirements));
	return memoryRequirements;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements Image::getMemoryRequirements() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_NAMESPACE::MemoryRequirements memoryRequirements;
	getDispatcher()->vkGetImageMemoryRequirements(
	    static_cast<VkDevice>(m_device), static_cast<VkImage>(m_image), reinterpret_cast<VkMemoryRequirements *>(&memoryRequirements));
	return memoryRequirements;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements>
Image::getSparseMemoryRequirements() const VULKAN_HPP_NOEXCEPT
{
	uint32_t sparseMemoryRequirementCount;
	getDispatcher()->vkGetImageSparseMemoryRequirements(
	    static_cast<VkDevice>(m_device), static_cast<VkImage>(m_image), &sparseMemoryRequirementCount, nullptr);
	std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements> sparseMemoryRequirements(sparseMemoryRequirementCount);
	getDispatcher()->vkGetImageSparseMemoryRequirements(static_cast<VkDevice>(m_device),
	                                                    static_cast<VkImage>(m_image),
	                                                    &sparseMemoryRequirementCount,
	                                                    reinterpret_cast<VkSparseImageMemoryRequirements *>(sparseMemoryRequirements.data()));
	VULKAN_HPP_ASSERT(sparseMemoryRequirementCount == sparseMemoryRequirements.size());
	return sparseMemoryRequirements;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties>
PhysicalDevice::getSparseImageFormatProperties(VULKAN_HPP_NAMESPACE::Format format,
                                               VULKAN_HPP_NAMESPACE::ImageType type,
                                               VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples,
                                               VULKAN_HPP_NAMESPACE::ImageUsageFlags usage,
                                               VULKAN_HPP_NAMESPACE::ImageTiling tiling) const VULKAN_HPP_NOEXCEPT
{
	uint32_t propertyCount;
	getDispatcher()->vkGetPhysicalDeviceSparseImageFormatProperties(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                                static_cast<VkFormat>(format),
	                                                                static_cast<VkImageType>(type),
	                                                                static_cast<VkSampleCountFlagBits>(samples),
	                                                                static_cast<VkImageUsageFlags>(usage),
	                                                                static_cast<VkImageTiling>(tiling),
	                                                                &propertyCount,
	                                                                nullptr);
	std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties> properties(propertyCount);
	getDispatcher()->vkGetPhysicalDeviceSparseImageFormatProperties(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                                static_cast<VkFormat>(format),
	                                                                static_cast<VkImageType>(type),
	                                                                static_cast<VkSampleCountFlagBits>(samples),
	                                                                static_cast<VkImageUsageFlags>(usage),
	                                                                static_cast<VkImageTiling>(tiling),
	                                                                &propertyCount,
	                                                                reinterpret_cast<VkSparseImageFormatProperties *>(properties.data()));
	VULKAN_HPP_ASSERT(propertyCount == properties.size());
	return properties;
}

VULKAN_HPP_INLINE void Queue::bindSparse(ArrayProxy<const VULKAN_HPP_NAMESPACE::BindSparseInfo> const &bindInfo, VULKAN_HPP_NAMESPACE::Fence fence) const
{
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkQueueBindSparse(
	    static_cast<VkQueue>(m_queue), bindInfo.size(), reinterpret_cast<const VkBindSparseInfo *>(bindInfo.data()), static_cast<VkFence>(fence)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Queue::bindSparse");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::Fence
Device::createFence(VULKAN_HPP_NAMESPACE::FenceCreateInfo const &createInfo,
                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::Fence(*this, createInfo, allocator);
}

VULKAN_HPP_INLINE void Device::resetFences(ArrayProxy<const VULKAN_HPP_NAMESPACE::Fence> const &fences) const
{
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkResetFences(static_cast<VkDevice>(m_device), fences.size(), reinterpret_cast<const VkFence *>(fences.data())));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::resetFences");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result Fence::getStatus() const
{
	VULKAN_HPP_NAMESPACE::Result result =
	    static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetFenceStatus(static_cast<VkDevice>(m_device), static_cast<VkFence>(m_fence)));
	if((result != VULKAN_HPP_NAMESPACE::Result::eSuccess) && (result != VULKAN_HPP_NAMESPACE::Result::eNotReady))
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Fence::getStatus");
	}
	return result;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result
Device::waitForFences(ArrayProxy<const VULKAN_HPP_NAMESPACE::Fence> const &fences, VULKAN_HPP_NAMESPACE::Bool32 waitAll, uint64_t timeout) const
{
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkWaitForFences(
	    static_cast<VkDevice>(m_device), fences.size(), reinterpret_cast<const VkFence *>(fences.data()), static_cast<VkBool32>(waitAll), timeout));
	if((result != VULKAN_HPP_NAMESPACE::Result::eSuccess) && (result != VULKAN_HPP_NAMESPACE::Result::eTimeout))
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::waitForFences");
	}
	return result;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::Semaphore
Device::createSemaphore(VULKAN_HPP_NAMESPACE::SemaphoreCreateInfo const &createInfo,
                        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::Semaphore(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::Event
Device::createEvent(VULKAN_HPP_NAMESPACE::EventCreateInfo const &createInfo,
                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::Event(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result Event::getStatus() const
{
	VULKAN_HPP_NAMESPACE::Result result =
	    static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetEventStatus(static_cast<VkDevice>(m_device), static_cast<VkEvent>(m_event)));
	if((result != VULKAN_HPP_NAMESPACE::Result::eEventSet) && (result != VULKAN_HPP_NAMESPACE::Result::eEventReset))
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Event::getStatus");
	}
	return result;
}

VULKAN_HPP_INLINE void Event::set() const
{
	VULKAN_HPP_NAMESPACE::Result result =
	    static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkSetEvent(static_cast<VkDevice>(m_device), static_cast<VkEvent>(m_event)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Event::set");
	}
}

VULKAN_HPP_INLINE void Event::reset() const
{
	VULKAN_HPP_NAMESPACE::Result result =
	    static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkResetEvent(static_cast<VkDevice>(m_device), static_cast<VkEvent>(m_event)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Event::reset");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::QueryPool
Device::createQueryPool(VULKAN_HPP_NAMESPACE::QueryPoolCreateInfo const &createInfo,
                        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::QueryPool(*this, createInfo, allocator);
}

template<typename DataType>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::pair<VULKAN_HPP_NAMESPACE::Result, std::vector<DataType>> QueryPool::getResults(
    uint32_t firstQuery, uint32_t queryCount, size_t dataSize, VULKAN_HPP_NAMESPACE::DeviceSize stride, VULKAN_HPP_NAMESPACE::QueryResultFlags flags) const
{
	VULKAN_HPP_ASSERT(dataSize % sizeof(DataType) == 0);
	std::vector<DataType> data(dataSize / sizeof(DataType));
	Result result = static_cast<Result>(getDispatcher()->vkGetQueryPoolResults(static_cast<VkDevice>(m_device),
	                                                                           static_cast<VkQueryPool>(m_queryPool),
	                                                                           firstQuery,
	                                                                           queryCount,
	                                                                           data.size() * sizeof(DataType),
	                                                                           reinterpret_cast<void *>(data.data()),
	                                                                           static_cast<VkDeviceSize>(stride),
	                                                                           static_cast<VkQueryResultFlags>(flags)));
	if((result != VULKAN_HPP_NAMESPACE::Result::eSuccess) && (result != VULKAN_HPP_NAMESPACE::Result::eNotReady))
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::QueryPool::getResults");
	}
	return std::make_pair(result, data);
}

template<typename DataType>
VULKAN_HPP_NODISCARD std::pair<VULKAN_HPP_NAMESPACE::Result, DataType> QueryPool::getResult(uint32_t firstQuery,
                                                                                            uint32_t queryCount,
                                                                                            VULKAN_HPP_NAMESPACE::DeviceSize stride,
                                                                                            VULKAN_HPP_NAMESPACE::QueryResultFlags flags) const
{
	DataType data;
	Result result = static_cast<Result>(getDispatcher()->vkGetQueryPoolResults(static_cast<VkDevice>(m_device),
	                                                                           static_cast<VkQueryPool>(m_queryPool),
	                                                                           firstQuery,
	                                                                           queryCount,
	                                                                           sizeof(DataType),
	                                                                           reinterpret_cast<void *>(&data),
	                                                                           static_cast<VkDeviceSize>(stride),
	                                                                           static_cast<VkQueryResultFlags>(flags)));
	if((result != VULKAN_HPP_NAMESPACE::Result::eSuccess) && (result != VULKAN_HPP_NAMESPACE::Result::eNotReady))
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::QueryPool::getResult");
	}
	return std::make_pair(result, data);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::Buffer
Device::createBuffer(VULKAN_HPP_NAMESPACE::BufferCreateInfo const &createInfo,
                     VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::Buffer(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::BufferView
Device::createBufferView(VULKAN_HPP_NAMESPACE::BufferViewCreateInfo const &createInfo,
                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::BufferView(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::Image
Device::createImage(VULKAN_HPP_NAMESPACE::ImageCreateInfo const &createInfo,
                    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::Image(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::SubresourceLayout
Image::getSubresourceLayout(const VULKAN_HPP_NAMESPACE::ImageSubresource &subresource) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_NAMESPACE::SubresourceLayout layout;
	getDispatcher()->vkGetImageSubresourceLayout(static_cast<VkDevice>(m_device),
	                                             static_cast<VkImage>(m_image),
	                                             reinterpret_cast<const VkImageSubresource *>(&subresource),
	                                             reinterpret_cast<VkSubresourceLayout *>(&layout));
	return layout;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::ImageView
Device::createImageView(VULKAN_HPP_NAMESPACE::ImageViewCreateInfo const &createInfo,
                        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::ImageView(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::ShaderModule
Device::createShaderModule(VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo const &createInfo,
                           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::ShaderModule(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::PipelineCache
Device::createPipelineCache(VULKAN_HPP_NAMESPACE::PipelineCacheCreateInfo const &createInfo,
                            VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::PipelineCache(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<uint8_t> PipelineCache::getData() const
{
	std::vector<uint8_t> data;
	size_t dataSize;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    getDispatcher()->vkGetPipelineCacheData(static_cast<VkDevice>(m_device), static_cast<VkPipelineCache>(m_pipelineCache), &dataSize, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && dataSize)
		{
			data.resize(dataSize);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetPipelineCacheData(
			    static_cast<VkDevice>(m_device), static_cast<VkPipelineCache>(m_pipelineCache), &dataSize, reinterpret_cast<void *>(data.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PipelineCache::getData");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(dataSize <= data.size());
		if(dataSize < data.size())
		{
			data.resize(dataSize);
		}
	}
	return data;
}

VULKAN_HPP_INLINE void PipelineCache::merge(ArrayProxy<const VULKAN_HPP_NAMESPACE::PipelineCache> const &srcCaches) const
{
	VULKAN_HPP_NAMESPACE::Result result =
	    static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkMergePipelineCaches(static_cast<VkDevice>(m_device),
	                                                                                     static_cast<VkPipelineCache>(m_pipelineCache),
	                                                                                     srcCaches.size(),
	                                                                                     reinterpret_cast<const VkPipelineCache *>(srcCaches.data())));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PipelineCache::merge");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_RAII_NAMESPACE::Pipeline> Device::createGraphicsPipelines(
    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &pipelineCache,
    VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo> const &createInfos,
    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::Pipelines(*this, pipelineCache, createInfos, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::Pipeline Device::createGraphicsPipeline(
    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &pipelineCache,
    VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo const &createInfo,
    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::Pipeline(*this, pipelineCache, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_RAII_NAMESPACE::Pipeline> Device::createComputePipelines(
    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &pipelineCache,
    VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo> const &createInfos,
    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::Pipelines(*this, pipelineCache, createInfos, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::Pipeline
Device::createComputePipeline(VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &pipelineCache,
                              VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo const &createInfo,
                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::Pipeline(*this, pipelineCache, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::PipelineLayout
Device::createPipelineLayout(VULKAN_HPP_NAMESPACE::PipelineLayoutCreateInfo const &createInfo,
                             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::PipelineLayout(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::Sampler
Device::createSampler(VULKAN_HPP_NAMESPACE::SamplerCreateInfo const &createInfo,
                      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::Sampler(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::DescriptorSetLayout
Device::createDescriptorSetLayout(VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo const &createInfo,
                                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::DescriptorSetLayout(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::DescriptorPool
Device::createDescriptorPool(VULKAN_HPP_NAMESPACE::DescriptorPoolCreateInfo const &createInfo,
                             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::DescriptorPool(*this, createInfo, allocator);
}

VULKAN_HPP_INLINE void DescriptorPool::reset(VULKAN_HPP_NAMESPACE::DescriptorPoolResetFlags flags) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkResetDescriptorPool(
	    static_cast<VkDevice>(m_device), static_cast<VkDescriptorPool>(m_descriptorPool), static_cast<VkDescriptorPoolResetFlags>(flags));
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_RAII_NAMESPACE::DescriptorSet>
Device::allocateDescriptorSets(VULKAN_HPP_NAMESPACE::DescriptorSetAllocateInfo const &allocateInfo) const
{
	return VULKAN_HPP_RAII_NAMESPACE::DescriptorSets(*this, allocateInfo);
}

VULKAN_HPP_INLINE void
Device::updateDescriptorSets(ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteDescriptorSet> const &descriptorWrites,
                             ArrayProxy<const VULKAN_HPP_NAMESPACE::CopyDescriptorSet> const &descriptorCopies) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkUpdateDescriptorSets(static_cast<VkDevice>(m_device),
	                                        descriptorWrites.size(),
	                                        reinterpret_cast<const VkWriteDescriptorSet *>(descriptorWrites.data()),
	                                        descriptorCopies.size(),
	                                        reinterpret_cast<const VkCopyDescriptorSet *>(descriptorCopies.data()));
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::Framebuffer
Device::createFramebuffer(VULKAN_HPP_NAMESPACE::FramebufferCreateInfo const &createInfo,
                          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::Framebuffer(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::RenderPass
Device::createRenderPass(VULKAN_HPP_NAMESPACE::RenderPassCreateInfo const &createInfo,
                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::RenderPass(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Extent2D RenderPass::getRenderAreaGranularity() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_NAMESPACE::Extent2D granularity;
	getDispatcher()->vkGetRenderAreaGranularity(
	    static_cast<VkDevice>(m_device), static_cast<VkRenderPass>(m_renderPass), reinterpret_cast<VkExtent2D *>(&granularity));
	return granularity;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::CommandPool
Device::createCommandPool(VULKAN_HPP_NAMESPACE::CommandPoolCreateInfo const &createInfo,
                          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::CommandPool(*this, createInfo, allocator);
}

VULKAN_HPP_INLINE void CommandPool::reset(VULKAN_HPP_NAMESPACE::CommandPoolResetFlags flags) const
{
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkResetCommandPool(
	    static_cast<VkDevice>(m_device), static_cast<VkCommandPool>(m_commandPool), static_cast<VkCommandPoolResetFlags>(flags)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::CommandPool::reset");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_RAII_NAMESPACE::CommandBuffer>
Device::allocateCommandBuffers(VULKAN_HPP_NAMESPACE::CommandBufferAllocateInfo const &allocateInfo) const
{
	return VULKAN_HPP_RAII_NAMESPACE::CommandBuffers(*this, allocateInfo);
}

VULKAN_HPP_INLINE void CommandBuffer::begin(const VULKAN_HPP_NAMESPACE::CommandBufferBeginInfo &beginInfo) const
{
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkBeginCommandBuffer(
	    static_cast<VkCommandBuffer>(m_commandBuffer), reinterpret_cast<const VkCommandBufferBeginInfo *>(&beginInfo)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::begin");
	}
}

VULKAN_HPP_INLINE void CommandBuffer::end() const
{
	VULKAN_HPP_NAMESPACE::Result result =
	    static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkEndCommandBuffer(static_cast<VkCommandBuffer>(m_commandBuffer)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::end");
	}
}

VULKAN_HPP_INLINE void CommandBuffer::reset(VULKAN_HPP_NAMESPACE::CommandBufferResetFlags flags) const
{
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkResetCommandBuffer(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkCommandBufferResetFlags>(flags)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::reset");
	}
}

VULKAN_HPP_INLINE void CommandBuffer::bindPipeline(VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint,
                                                   VULKAN_HPP_NAMESPACE::Pipeline pipeline) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdBindPipeline(
	    static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkPipelineBindPoint>(pipelineBindPoint), static_cast<VkPipeline>(pipeline));
}

VULKAN_HPP_INLINE void CommandBuffer::setViewport(uint32_t firstViewport,
                                                  ArrayProxy<const VULKAN_HPP_NAMESPACE::Viewport> const &viewports) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetViewport(
	    static_cast<VkCommandBuffer>(m_commandBuffer), firstViewport, viewports.size(), reinterpret_cast<const VkViewport *>(viewports.data()));
}

VULKAN_HPP_INLINE void CommandBuffer::setScissor(uint32_t firstScissor,
                                                 ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const &scissors) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetScissor(
	    static_cast<VkCommandBuffer>(m_commandBuffer), firstScissor, scissors.size(), reinterpret_cast<const VkRect2D *>(scissors.data()));
}

VULKAN_HPP_INLINE void CommandBuffer::setLineWidth(float lineWidth) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetLineWidth(static_cast<VkCommandBuffer>(m_commandBuffer), lineWidth);
}

VULKAN_HPP_INLINE void
CommandBuffer::setDepthBias(float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetDepthBias(static_cast<VkCommandBuffer>(m_commandBuffer), depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
}

VULKAN_HPP_INLINE void CommandBuffer::setBlendConstants(const float blendConstants[4]) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetBlendConstants(static_cast<VkCommandBuffer>(m_commandBuffer), blendConstants);
}

VULKAN_HPP_INLINE void CommandBuffer::setDepthBounds(float minDepthBounds, float maxDepthBounds) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetDepthBounds(static_cast<VkCommandBuffer>(m_commandBuffer), minDepthBounds, maxDepthBounds);
}

VULKAN_HPP_INLINE void CommandBuffer::setStencilCompareMask(VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask,
                                                            uint32_t compareMask) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetStencilCompareMask(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkStencilFaceFlags>(faceMask), compareMask);
}

VULKAN_HPP_INLINE void CommandBuffer::setStencilWriteMask(VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask, uint32_t writeMask) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetStencilWriteMask(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkStencilFaceFlags>(faceMask), writeMask);
}

VULKAN_HPP_INLINE void CommandBuffer::setStencilReference(VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask, uint32_t reference) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetStencilReference(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkStencilFaceFlags>(faceMask), reference);
}

VULKAN_HPP_INLINE void CommandBuffer::bindDescriptorSets(VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint,
                                                         VULKAN_HPP_NAMESPACE::PipelineLayout layout,
                                                         uint32_t firstSet,
                                                         ArrayProxy<const VULKAN_HPP_NAMESPACE::DescriptorSet> const &descriptorSets,
                                                         ArrayProxy<const uint32_t> const &dynamicOffsets) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdBindDescriptorSets(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                         static_cast<VkPipelineBindPoint>(pipelineBindPoint),
	                                         static_cast<VkPipelineLayout>(layout),
	                                         firstSet,
	                                         descriptorSets.size(),
	                                         reinterpret_cast<const VkDescriptorSet *>(descriptorSets.data()),
	                                         dynamicOffsets.size(),
	                                         dynamicOffsets.data());
}

VULKAN_HPP_INLINE void CommandBuffer::bindIndexBuffer(VULKAN_HPP_NAMESPACE::Buffer buffer,
                                                      VULKAN_HPP_NAMESPACE::DeviceSize offset,
                                                      VULKAN_HPP_NAMESPACE::IndexType indexType) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdBindIndexBuffer(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                      static_cast<VkBuffer>(buffer),
	                                      static_cast<VkDeviceSize>(offset),
	                                      static_cast<VkIndexType>(indexType));
}

VULKAN_HPP_INLINE void CommandBuffer::bindVertexBuffers(uint32_t firstBinding,
                                                        ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &buffers,
                                                        ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &offsets) const
{
	if(buffers.size() != offsets.size())
	{
		throw LogicError(VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::bindVertexBuffers: buffers.size() != offsets.size()");
	}
	getDispatcher()->vkCmdBindVertexBuffers(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                        firstBinding,
	                                        buffers.size(),
	                                        reinterpret_cast<const VkBuffer *>(buffers.data()),
	                                        reinterpret_cast<const VkDeviceSize *>(offsets.data()));
}

VULKAN_HPP_INLINE void
CommandBuffer::draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdDraw(static_cast<VkCommandBuffer>(m_commandBuffer), vertexCount, instanceCount, firstVertex, firstInstance);
}

VULKAN_HPP_INLINE void CommandBuffer::drawIndexed(
    uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdDrawIndexed(static_cast<VkCommandBuffer>(m_commandBuffer), indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
}

VULKAN_HPP_INLINE void CommandBuffer::drawIndirect(VULKAN_HPP_NAMESPACE::Buffer buffer,
                                                   VULKAN_HPP_NAMESPACE::DeviceSize offset,
                                                   uint32_t drawCount,
                                                   uint32_t stride) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdDrawIndirect(
	    static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkBuffer>(buffer), static_cast<VkDeviceSize>(offset), drawCount, stride);
}

VULKAN_HPP_INLINE void CommandBuffer::drawIndexedIndirect(VULKAN_HPP_NAMESPACE::Buffer buffer,
                                                          VULKAN_HPP_NAMESPACE::DeviceSize offset,
                                                          uint32_t drawCount,
                                                          uint32_t stride) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdDrawIndexedIndirect(
	    static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkBuffer>(buffer), static_cast<VkDeviceSize>(offset), drawCount, stride);
}

VULKAN_HPP_INLINE void CommandBuffer::dispatch(uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdDispatch(static_cast<VkCommandBuffer>(m_commandBuffer), groupCountX, groupCountY, groupCountZ);
}

VULKAN_HPP_INLINE void CommandBuffer::dispatchIndirect(VULKAN_HPP_NAMESPACE::Buffer buffer,
                                                       VULKAN_HPP_NAMESPACE::DeviceSize offset) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdDispatchIndirect(
	    static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkBuffer>(buffer), static_cast<VkDeviceSize>(offset));
}

VULKAN_HPP_INLINE void CommandBuffer::copyBuffer(VULKAN_HPP_NAMESPACE::Buffer srcBuffer,
                                                 VULKAN_HPP_NAMESPACE::Buffer dstBuffer,
                                                 ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferCopy> const &regions) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdCopyBuffer(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                 static_cast<VkBuffer>(srcBuffer),
	                                 static_cast<VkBuffer>(dstBuffer),
	                                 regions.size(),
	                                 reinterpret_cast<const VkBufferCopy *>(regions.data()));
}

VULKAN_HPP_INLINE void CommandBuffer::copyImage(VULKAN_HPP_NAMESPACE::Image srcImage,
                                                VULKAN_HPP_NAMESPACE::ImageLayout srcImageLayout,
                                                VULKAN_HPP_NAMESPACE::Image dstImage,
                                                VULKAN_HPP_NAMESPACE::ImageLayout dstImageLayout,
                                                ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageCopy> const &regions) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdCopyImage(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                static_cast<VkImage>(srcImage),
	                                static_cast<VkImageLayout>(srcImageLayout),
	                                static_cast<VkImage>(dstImage),
	                                static_cast<VkImageLayout>(dstImageLayout),
	                                regions.size(),
	                                reinterpret_cast<const VkImageCopy *>(regions.data()));
}

VULKAN_HPP_INLINE void CommandBuffer::blitImage(VULKAN_HPP_NAMESPACE::Image srcImage,
                                                VULKAN_HPP_NAMESPACE::ImageLayout srcImageLayout,
                                                VULKAN_HPP_NAMESPACE::Image dstImage,
                                                VULKAN_HPP_NAMESPACE::ImageLayout dstImageLayout,
                                                ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageBlit> const &regions,
                                                VULKAN_HPP_NAMESPACE::Filter filter) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdBlitImage(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                static_cast<VkImage>(srcImage),
	                                static_cast<VkImageLayout>(srcImageLayout),
	                                static_cast<VkImage>(dstImage),
	                                static_cast<VkImageLayout>(dstImageLayout),
	                                regions.size(),
	                                reinterpret_cast<const VkImageBlit *>(regions.data()),
	                                static_cast<VkFilter>(filter));
}

VULKAN_HPP_INLINE void CommandBuffer::copyBufferToImage(VULKAN_HPP_NAMESPACE::Buffer srcBuffer,
                                                        VULKAN_HPP_NAMESPACE::Image dstImage,
                                                        VULKAN_HPP_NAMESPACE::ImageLayout dstImageLayout,
                                                        ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferImageCopy> const &regions) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdCopyBufferToImage(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                        static_cast<VkBuffer>(srcBuffer),
	                                        static_cast<VkImage>(dstImage),
	                                        static_cast<VkImageLayout>(dstImageLayout),
	                                        regions.size(),
	                                        reinterpret_cast<const VkBufferImageCopy *>(regions.data()));
}

VULKAN_HPP_INLINE void CommandBuffer::copyImageToBuffer(VULKAN_HPP_NAMESPACE::Image srcImage,
                                                        VULKAN_HPP_NAMESPACE::ImageLayout srcImageLayout,
                                                        VULKAN_HPP_NAMESPACE::Buffer dstBuffer,
                                                        ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferImageCopy> const &regions) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdCopyImageToBuffer(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                        static_cast<VkImage>(srcImage),
	                                        static_cast<VkImageLayout>(srcImageLayout),
	                                        static_cast<VkBuffer>(dstBuffer),
	                                        regions.size(),
	                                        reinterpret_cast<const VkBufferImageCopy *>(regions.data()));
}

template<typename DataType>
VULKAN_HPP_INLINE void CommandBuffer::updateBuffer(VULKAN_HPP_NAMESPACE::Buffer dstBuffer,
                                                   VULKAN_HPP_NAMESPACE::DeviceSize dstOffset,
                                                   ArrayProxy<const DataType> const &data) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdUpdateBuffer(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                   static_cast<VkBuffer>(dstBuffer),
	                                   static_cast<VkDeviceSize>(dstOffset),
	                                   data.size() * sizeof(DataType),
	                                   reinterpret_cast<const void *>(data.data()));
}

VULKAN_HPP_INLINE void CommandBuffer::fillBuffer(VULKAN_HPP_NAMESPACE::Buffer dstBuffer,
                                                 VULKAN_HPP_NAMESPACE::DeviceSize dstOffset,
                                                 VULKAN_HPP_NAMESPACE::DeviceSize size,
                                                 uint32_t data) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdFillBuffer(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                 static_cast<VkBuffer>(dstBuffer),
	                                 static_cast<VkDeviceSize>(dstOffset),
	                                 static_cast<VkDeviceSize>(size),
	                                 data);
}

VULKAN_HPP_INLINE void
CommandBuffer::clearColorImage(VULKAN_HPP_NAMESPACE::Image image,
                               VULKAN_HPP_NAMESPACE::ImageLayout imageLayout,
                               const VULKAN_HPP_NAMESPACE::ClearColorValue &color,
                               ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageSubresourceRange> const &ranges) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdClearColorImage(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                      static_cast<VkImage>(image),
	                                      static_cast<VkImageLayout>(imageLayout),
	                                      reinterpret_cast<const VkClearColorValue *>(&color),
	                                      ranges.size(),
	                                      reinterpret_cast<const VkImageSubresourceRange *>(ranges.data()));
}

VULKAN_HPP_INLINE void
CommandBuffer::clearDepthStencilImage(VULKAN_HPP_NAMESPACE::Image image,
                                      VULKAN_HPP_NAMESPACE::ImageLayout imageLayout,
                                      const VULKAN_HPP_NAMESPACE::ClearDepthStencilValue &depthStencil,
                                      ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageSubresourceRange> const &ranges) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdClearDepthStencilImage(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                             static_cast<VkImage>(image),
	                                             static_cast<VkImageLayout>(imageLayout),
	                                             reinterpret_cast<const VkClearDepthStencilValue *>(&depthStencil),
	                                             ranges.size(),
	                                             reinterpret_cast<const VkImageSubresourceRange *>(ranges.data()));
}

VULKAN_HPP_INLINE void CommandBuffer::clearAttachments(ArrayProxy<const VULKAN_HPP_NAMESPACE::ClearAttachment> const &attachments,
                                                       ArrayProxy<const VULKAN_HPP_NAMESPACE::ClearRect> const &rects) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdClearAttachments(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                       attachments.size(),
	                                       reinterpret_cast<const VkClearAttachment *>(attachments.data()),
	                                       rects.size(),
	                                       reinterpret_cast<const VkClearRect *>(rects.data()));
}

VULKAN_HPP_INLINE void CommandBuffer::resolveImage(VULKAN_HPP_NAMESPACE::Image srcImage,
                                                   VULKAN_HPP_NAMESPACE::ImageLayout srcImageLayout,
                                                   VULKAN_HPP_NAMESPACE::Image dstImage,
                                                   VULKAN_HPP_NAMESPACE::ImageLayout dstImageLayout,
                                                   ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageResolve> const &regions) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdResolveImage(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                   static_cast<VkImage>(srcImage),
	                                   static_cast<VkImageLayout>(srcImageLayout),
	                                   static_cast<VkImage>(dstImage),
	                                   static_cast<VkImageLayout>(dstImageLayout),
	                                   regions.size(),
	                                   reinterpret_cast<const VkImageResolve *>(regions.data()));
}

VULKAN_HPP_INLINE void CommandBuffer::setEvent(VULKAN_HPP_NAMESPACE::Event event,
                                               VULKAN_HPP_NAMESPACE::PipelineStageFlags stageMask) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetEvent(
	    static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkEvent>(event), static_cast<VkPipelineStageFlags>(stageMask));
}

VULKAN_HPP_INLINE void CommandBuffer::resetEvent(VULKAN_HPP_NAMESPACE::Event event,
                                                 VULKAN_HPP_NAMESPACE::PipelineStageFlags stageMask) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdResetEvent(
	    static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkEvent>(event), static_cast<VkPipelineStageFlags>(stageMask));
}

VULKAN_HPP_INLINE void
CommandBuffer::waitEvents(ArrayProxy<const VULKAN_HPP_NAMESPACE::Event> const &events,
                          VULKAN_HPP_NAMESPACE::PipelineStageFlags srcStageMask,
                          VULKAN_HPP_NAMESPACE::PipelineStageFlags dstStageMask,
                          ArrayProxy<const VULKAN_HPP_NAMESPACE::MemoryBarrier> const &memoryBarriers,
                          ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferMemoryBarrier> const &bufferMemoryBarriers,
                          ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier> const &imageMemoryBarriers) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdWaitEvents(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                 events.size(),
	                                 reinterpret_cast<const VkEvent *>(events.data()),
	                                 static_cast<VkPipelineStageFlags>(srcStageMask),
	                                 static_cast<VkPipelineStageFlags>(dstStageMask),
	                                 memoryBarriers.size(),
	                                 reinterpret_cast<const VkMemoryBarrier *>(memoryBarriers.data()),
	                                 bufferMemoryBarriers.size(),
	                                 reinterpret_cast<const VkBufferMemoryBarrier *>(bufferMemoryBarriers.data()),
	                                 imageMemoryBarriers.size(),
	                                 reinterpret_cast<const VkImageMemoryBarrier *>(imageMemoryBarriers.data()));
}

VULKAN_HPP_INLINE void
CommandBuffer::pipelineBarrier(VULKAN_HPP_NAMESPACE::PipelineStageFlags srcStageMask,
                               VULKAN_HPP_NAMESPACE::PipelineStageFlags dstStageMask,
                               VULKAN_HPP_NAMESPACE::DependencyFlags dependencyFlags,
                               ArrayProxy<const VULKAN_HPP_NAMESPACE::MemoryBarrier> const &memoryBarriers,
                               ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferMemoryBarrier> const &bufferMemoryBarriers,
                               ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier> const &imageMemoryBarriers) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdPipelineBarrier(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                      static_cast<VkPipelineStageFlags>(srcStageMask),
	                                      static_cast<VkPipelineStageFlags>(dstStageMask),
	                                      static_cast<VkDependencyFlags>(dependencyFlags),
	                                      memoryBarriers.size(),
	                                      reinterpret_cast<const VkMemoryBarrier *>(memoryBarriers.data()),
	                                      bufferMemoryBarriers.size(),
	                                      reinterpret_cast<const VkBufferMemoryBarrier *>(bufferMemoryBarriers.data()),
	                                      imageMemoryBarriers.size(),
	                                      reinterpret_cast<const VkImageMemoryBarrier *>(imageMemoryBarriers.data()));
}

VULKAN_HPP_INLINE void CommandBuffer::beginQuery(VULKAN_HPP_NAMESPACE::QueryPool queryPool,
                                                 uint32_t query,
                                                 VULKAN_HPP_NAMESPACE::QueryControlFlags flags) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdBeginQuery(
	    static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkQueryPool>(queryPool), query, static_cast<VkQueryControlFlags>(flags));
}

VULKAN_HPP_INLINE void CommandBuffer::endQuery(VULKAN_HPP_NAMESPACE::QueryPool queryPool, uint32_t query) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdEndQuery(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkQueryPool>(queryPool), query);
}

VULKAN_HPP_INLINE void
CommandBuffer::resetQueryPool(VULKAN_HPP_NAMESPACE::QueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdResetQueryPool(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkQueryPool>(queryPool), firstQuery, queryCount);
}

VULKAN_HPP_INLINE void CommandBuffer::writeTimestamp(VULKAN_HPP_NAMESPACE::PipelineStageFlagBits pipelineStage,
                                                     VULKAN_HPP_NAMESPACE::QueryPool queryPool,
                                                     uint32_t query) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdWriteTimestamp(
	    static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkPipelineStageFlagBits>(pipelineStage), static_cast<VkQueryPool>(queryPool), query);
}

VULKAN_HPP_INLINE void CommandBuffer::copyQueryPoolResults(VULKAN_HPP_NAMESPACE::QueryPool queryPool,
                                                           uint32_t firstQuery,
                                                           uint32_t queryCount,
                                                           VULKAN_HPP_NAMESPACE::Buffer dstBuffer,
                                                           VULKAN_HPP_NAMESPACE::DeviceSize dstOffset,
                                                           VULKAN_HPP_NAMESPACE::DeviceSize stride,
                                                           VULKAN_HPP_NAMESPACE::QueryResultFlags flags) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdCopyQueryPoolResults(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                           static_cast<VkQueryPool>(queryPool),
	                                           firstQuery,
	                                           queryCount,
	                                           static_cast<VkBuffer>(dstBuffer),
	                                           static_cast<VkDeviceSize>(dstOffset),
	                                           static_cast<VkDeviceSize>(stride),
	                                           static_cast<VkQueryResultFlags>(flags));
}

template<typename ValuesType>
VULKAN_HPP_INLINE void CommandBuffer::pushConstants(VULKAN_HPP_NAMESPACE::PipelineLayout layout,
                                                    VULKAN_HPP_NAMESPACE::ShaderStageFlags stageFlags,
                                                    uint32_t offset,
                                                    ArrayProxy<const ValuesType> const &values) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdPushConstants(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                    static_cast<VkPipelineLayout>(layout),
	                                    static_cast<VkShaderStageFlags>(stageFlags),
	                                    offset,
	                                    values.size() * sizeof(ValuesType),
	                                    reinterpret_cast<const void *>(values.data()));
}

VULKAN_HPP_INLINE void CommandBuffer::beginRenderPass(const VULKAN_HPP_NAMESPACE::RenderPassBeginInfo &renderPassBegin,
                                                      VULKAN_HPP_NAMESPACE::SubpassContents contents) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdBeginRenderPass(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                      reinterpret_cast<const VkRenderPassBeginInfo *>(&renderPassBegin),
	                                      static_cast<VkSubpassContents>(contents));
}

VULKAN_HPP_INLINE void CommandBuffer::nextSubpass(VULKAN_HPP_NAMESPACE::SubpassContents contents) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdNextSubpass(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkSubpassContents>(contents));
}

VULKAN_HPP_INLINE void CommandBuffer::endRenderPass() const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdEndRenderPass(static_cast<VkCommandBuffer>(m_commandBuffer));
}

VULKAN_HPP_INLINE void
CommandBuffer::executeCommands(ArrayProxy<const VULKAN_HPP_NAMESPACE::CommandBuffer> const &commandBuffers) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdExecuteCommands(
	    static_cast<VkCommandBuffer>(m_commandBuffer), commandBuffers.size(), reinterpret_cast<const VkCommandBuffer *>(commandBuffers.data()));
}

//=== VK_VERSION_1_1 ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint32_t Context::enumerateInstanceVersion() const
{
	uint32_t apiVersion;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkEnumerateInstanceVersion(&apiVersion));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Context::enumerateInstanceVersion");
	}
	return apiVersion;
}

VULKAN_HPP_INLINE void Device::bindBufferMemory2(ArrayProxy<const VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo> const &bindInfos) const
{
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkBindBufferMemory2(
	    static_cast<VkDevice>(m_device), bindInfos.size(), reinterpret_cast<const VkBindBufferMemoryInfo *>(bindInfos.data())));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::bindBufferMemory2");
	}
}

VULKAN_HPP_INLINE void Device::bindImageMemory2(ArrayProxy<const VULKAN_HPP_NAMESPACE::BindImageMemoryInfo> const &bindInfos) const
{
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkBindImageMemory2(
	    static_cast<VkDevice>(m_device), bindInfos.size(), reinterpret_cast<const VkBindImageMemoryInfo *>(bindInfos.data())));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::bindImageMemory2");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags
Device::getGroupPeerMemoryFeatures(uint32_t heapIndex, uint32_t localDeviceIndex, uint32_t remoteDeviceIndex) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags peerMemoryFeatures;
	getDispatcher()->vkGetDeviceGroupPeerMemoryFeatures(static_cast<VkDevice>(m_device),
	                                                    heapIndex,
	                                                    localDeviceIndex,
	                                                    remoteDeviceIndex,
	                                                    reinterpret_cast<VkPeerMemoryFeatureFlags *>(&peerMemoryFeatures));
	return peerMemoryFeatures;
}

VULKAN_HPP_INLINE void CommandBuffer::setDeviceMask(uint32_t deviceMask) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetDeviceMask(static_cast<VkCommandBuffer>(m_commandBuffer), deviceMask);
}

VULKAN_HPP_INLINE void CommandBuffer::dispatchBase(uint32_t baseGroupX,
                                                   uint32_t baseGroupY,
                                                   uint32_t baseGroupZ,
                                                   uint32_t groupCountX,
                                                   uint32_t groupCountY,
                                                   uint32_t groupCountZ) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdDispatchBase(
	    static_cast<VkCommandBuffer>(m_commandBuffer), baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties> Instance::enumeratePhysicalDeviceGroups() const
{
	std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties> physicalDeviceGroupProperties;
	uint32_t physicalDeviceGroupCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    getDispatcher()->vkEnumeratePhysicalDeviceGroups(static_cast<VkInstance>(m_instance), &physicalDeviceGroupCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && physicalDeviceGroupCount)
		{
			physicalDeviceGroupProperties.resize(physicalDeviceGroupCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
			    getDispatcher()->vkEnumeratePhysicalDeviceGroups(static_cast<VkInstance>(m_instance),
			                                                     &physicalDeviceGroupCount,
			                                                     reinterpret_cast<VkPhysicalDeviceGroupProperties *>(physicalDeviceGroupProperties.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Instance::enumeratePhysicalDeviceGroups");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(physicalDeviceGroupCount <= physicalDeviceGroupProperties.size());
		if(physicalDeviceGroupCount < physicalDeviceGroupProperties.size())
		{
			physicalDeviceGroupProperties.resize(physicalDeviceGroupCount);
		}
	}
	return physicalDeviceGroupProperties;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2
Device::getImageMemoryRequirements2(const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;
	getDispatcher()->vkGetImageMemoryRequirements2(static_cast<VkDevice>(m_device),
	                                               reinterpret_cast<const VkImageMemoryRequirementsInfo2 *>(&info),
	                                               reinterpret_cast<VkMemoryRequirements2 *>(&memoryRequirements));
	return memoryRequirements;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...>
Device::getImageMemoryRequirements2(const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 &info) const VULKAN_HPP_NOEXCEPT
{
	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::MemoryRequirements2 &memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();
	getDispatcher()->vkGetImageMemoryRequirements2(static_cast<VkDevice>(m_device),
	                                               reinterpret_cast<const VkImageMemoryRequirementsInfo2 *>(&info),
	                                               reinterpret_cast<VkMemoryRequirements2 *>(&memoryRequirements));
	return structureChain;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2
Device::getBufferMemoryRequirements2(const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;
	getDispatcher()->vkGetBufferMemoryRequirements2(static_cast<VkDevice>(m_device),
	                                                reinterpret_cast<const VkBufferMemoryRequirementsInfo2 *>(&info),
	                                                reinterpret_cast<VkMemoryRequirements2 *>(&memoryRequirements));
	return memoryRequirements;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...>
Device::getBufferMemoryRequirements2(const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 &info) const VULKAN_HPP_NOEXCEPT
{
	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::MemoryRequirements2 &memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();
	getDispatcher()->vkGetBufferMemoryRequirements2(static_cast<VkDevice>(m_device),
	                                                reinterpret_cast<const VkBufferMemoryRequirementsInfo2 *>(&info),
	                                                reinterpret_cast<VkMemoryRequirements2 *>(&memoryRequirements));
	return structureChain;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>
Device::getImageSparseMemoryRequirements2(const VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2 &info) const VULKAN_HPP_NOEXCEPT
{
	uint32_t sparseMemoryRequirementCount;
	getDispatcher()->vkGetImageSparseMemoryRequirements2(
	    static_cast<VkDevice>(m_device), reinterpret_cast<const VkImageSparseMemoryRequirementsInfo2 *>(&info), &sparseMemoryRequirementCount, nullptr);
	std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2> sparseMemoryRequirements(sparseMemoryRequirementCount);
	getDispatcher()->vkGetImageSparseMemoryRequirements2(static_cast<VkDevice>(m_device),
	                                                     reinterpret_cast<const VkImageSparseMemoryRequirementsInfo2 *>(&info),
	                                                     &sparseMemoryRequirementCount,
	                                                     reinterpret_cast<VkSparseImageMemoryRequirements2 *>(sparseMemoryRequirements.data()));
	VULKAN_HPP_ASSERT(sparseMemoryRequirementCount == sparseMemoryRequirements.size());
	return sparseMemoryRequirements;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 PhysicalDevice::getFeatures2() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 features;
	getDispatcher()->vkGetPhysicalDeviceFeatures2(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                              reinterpret_cast<VkPhysicalDeviceFeatures2 *>(&features));
	return features;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...> PhysicalDevice::getFeatures2() const VULKAN_HPP_NOEXCEPT
{
	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 &features = structureChain.template get<VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2>();
	getDispatcher()->vkGetPhysicalDeviceFeatures2(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                              reinterpret_cast<VkPhysicalDeviceFeatures2 *>(&features));
	return structureChain;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 PhysicalDevice::getProperties2() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 properties;
	getDispatcher()->vkGetPhysicalDeviceProperties2(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                reinterpret_cast<VkPhysicalDeviceProperties2 *>(&properties));
	return properties;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...> PhysicalDevice::getProperties2() const VULKAN_HPP_NOEXCEPT
{
	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 &properties = structureChain.template get<VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2>();
	getDispatcher()->vkGetPhysicalDeviceProperties2(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                reinterpret_cast<VkPhysicalDeviceProperties2 *>(&properties));
	return structureChain;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::FormatProperties2
PhysicalDevice::getFormatProperties2(VULKAN_HPP_NAMESPACE::Format format) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_NAMESPACE::FormatProperties2 formatProperties;
	getDispatcher()->vkGetPhysicalDeviceFormatProperties2(
	    static_cast<VkPhysicalDevice>(m_physicalDevice), static_cast<VkFormat>(format), reinterpret_cast<VkFormatProperties2 *>(&formatProperties));
	return formatProperties;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...>
PhysicalDevice::getFormatProperties2(VULKAN_HPP_NAMESPACE::Format format) const VULKAN_HPP_NOEXCEPT
{
	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::FormatProperties2 &formatProperties = structureChain.template get<VULKAN_HPP_NAMESPACE::FormatProperties2>();
	getDispatcher()->vkGetPhysicalDeviceFormatProperties2(
	    static_cast<VkPhysicalDevice>(m_physicalDevice), static_cast<VkFormat>(format), reinterpret_cast<VkFormatProperties2 *>(&formatProperties));
	return structureChain;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ImageFormatProperties2
PhysicalDevice::getImageFormatProperties2(const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 &imageFormatInfo) const
{
	VULKAN_HPP_NAMESPACE::ImageFormatProperties2 imageFormatProperties;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetPhysicalDeviceImageFormatProperties2(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                               reinterpret_cast<const VkPhysicalDeviceImageFormatInfo2 *>(&imageFormatInfo),
	                                                               reinterpret_cast<VkImageFormatProperties2 *>(&imageFormatProperties)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getImageFormatProperties2");
	}
	return imageFormatProperties;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...>
PhysicalDevice::getImageFormatProperties2(const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 &imageFormatInfo) const
{
	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::ImageFormatProperties2 &imageFormatProperties = structureChain.template get<VULKAN_HPP_NAMESPACE::ImageFormatProperties2>();
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetPhysicalDeviceImageFormatProperties2(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                               reinterpret_cast<const VkPhysicalDeviceImageFormatInfo2 *>(&imageFormatInfo),
	                                                               reinterpret_cast<VkImageFormatProperties2 *>(&imageFormatProperties)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getImageFormatProperties2");
	}
	return structureChain;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>
PhysicalDevice::getQueueFamilyProperties2() const VULKAN_HPP_NOEXCEPT
{
	uint32_t queueFamilyPropertyCount;
	getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties2(static_cast<VkPhysicalDevice>(m_physicalDevice), &queueFamilyPropertyCount, nullptr);
	std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2> queueFamilyProperties(queueFamilyPropertyCount);
	getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties2(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                           &queueFamilyPropertyCount,
	                                                           reinterpret_cast<VkQueueFamilyProperties2 *>(queueFamilyProperties.data()));
	VULKAN_HPP_ASSERT(queueFamilyPropertyCount == queueFamilyProperties.size());
	return queueFamilyProperties;
}

template<typename StructureChain>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<StructureChain> PhysicalDevice::getQueueFamilyProperties2() const
{
	uint32_t queueFamilyPropertyCount;
	getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties2(static_cast<VkPhysicalDevice>(m_physicalDevice), &queueFamilyPropertyCount, nullptr);
	std::vector<StructureChain> returnVector(queueFamilyPropertyCount);
	std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2> queueFamilyProperties(queueFamilyPropertyCount);
	for(uint32_t i = 0; i < queueFamilyPropertyCount; i++)
	{
		queueFamilyProperties[i].pNext = returnVector[i].template get<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>().pNext;
	}
	getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties2(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                           &queueFamilyPropertyCount,
	                                                           reinterpret_cast<VkQueueFamilyProperties2 *>(queueFamilyProperties.data()));
	VULKAN_HPP_ASSERT(queueFamilyPropertyCount <= queueFamilyProperties.size());
	for(uint32_t i = 0; i < queueFamilyPropertyCount; i++)
	{
		returnVector[i].template get<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>() = queueFamilyProperties[i];
	}
	return returnVector;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2
PhysicalDevice::getMemoryProperties2() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 memoryProperties;
	getDispatcher()->vkGetPhysicalDeviceMemoryProperties2(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                      reinterpret_cast<VkPhysicalDeviceMemoryProperties2 *>(&memoryProperties));
	return memoryProperties;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...> PhysicalDevice::getMemoryProperties2() const VULKAN_HPP_NOEXCEPT
{
	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 &memoryProperties =
	    structureChain.template get<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2>();
	getDispatcher()->vkGetPhysicalDeviceMemoryProperties2(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                      reinterpret_cast<VkPhysicalDeviceMemoryProperties2 *>(&memoryProperties));
	return structureChain;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2>
PhysicalDevice::getSparseImageFormatProperties2(const VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2 &formatInfo) const VULKAN_HPP_NOEXCEPT
{
	uint32_t propertyCount;
	getDispatcher()->vkGetPhysicalDeviceSparseImageFormatProperties2(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                                 reinterpret_cast<const VkPhysicalDeviceSparseImageFormatInfo2 *>(&formatInfo),
	                                                                 &propertyCount,
	                                                                 nullptr);
	std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2> properties(propertyCount);
	getDispatcher()->vkGetPhysicalDeviceSparseImageFormatProperties2(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                                 reinterpret_cast<const VkPhysicalDeviceSparseImageFormatInfo2 *>(&formatInfo),
	                                                                 &propertyCount,
	                                                                 reinterpret_cast<VkSparseImageFormatProperties2 *>(properties.data()));
	VULKAN_HPP_ASSERT(propertyCount == properties.size());
	return properties;
}

VULKAN_HPP_INLINE void CommandPool::trim(VULKAN_HPP_NAMESPACE::CommandPoolTrimFlags flags) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkTrimCommandPool(
	    static_cast<VkDevice>(m_device), static_cast<VkCommandPool>(m_commandPool), static_cast<VkCommandPoolTrimFlags>(flags));
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::Queue Device::getQueue2(VULKAN_HPP_NAMESPACE::DeviceQueueInfo2 const &queueInfo) const
{
	return VULKAN_HPP_RAII_NAMESPACE::Queue(*this, queueInfo);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::SamplerYcbcrConversion
Device::createSamplerYcbcrConversion(VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo const &createInfo,
                                     VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::SamplerYcbcrConversion(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::DescriptorUpdateTemplate
Device::createDescriptorUpdateTemplate(VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo const &createInfo,
                                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::DescriptorUpdateTemplate(*this, createInfo, allocator);
}

template<typename DataType>
VULKAN_HPP_INLINE void DescriptorSet::updateWithTemplate(VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,
                                                         DataType const &data) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkUpdateDescriptorSetWithTemplate(static_cast<VkDevice>(m_device),
	                                                   static_cast<VkDescriptorSet>(m_descriptorSet),
	                                                   static_cast<VkDescriptorUpdateTemplate>(descriptorUpdateTemplate),
	                                                   reinterpret_cast<const void *>(&data));
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ExternalBufferProperties
PhysicalDevice::getExternalBufferProperties(const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalBufferInfo &externalBufferInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_NAMESPACE::ExternalBufferProperties externalBufferProperties;
	getDispatcher()->vkGetPhysicalDeviceExternalBufferProperties(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                             reinterpret_cast<const VkPhysicalDeviceExternalBufferInfo *>(&externalBufferInfo),
	                                                             reinterpret_cast<VkExternalBufferProperties *>(&externalBufferProperties));
	return externalBufferProperties;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ExternalFenceProperties
PhysicalDevice::getExternalFenceProperties(const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFenceInfo &externalFenceInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_NAMESPACE::ExternalFenceProperties externalFenceProperties;
	getDispatcher()->vkGetPhysicalDeviceExternalFenceProperties(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                            reinterpret_cast<const VkPhysicalDeviceExternalFenceInfo *>(&externalFenceInfo),
	                                                            reinterpret_cast<VkExternalFenceProperties *>(&externalFenceProperties));
	return externalFenceProperties;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties PhysicalDevice::getExternalSemaphoreProperties(
    const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalSemaphoreInfo &externalSemaphoreInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties externalSemaphoreProperties;
	getDispatcher()->vkGetPhysicalDeviceExternalSemaphoreProperties(
	    static_cast<VkPhysicalDevice>(m_physicalDevice),
	    reinterpret_cast<const VkPhysicalDeviceExternalSemaphoreInfo *>(&externalSemaphoreInfo),
	    reinterpret_cast<VkExternalSemaphoreProperties *>(&externalSemaphoreProperties));
	return externalSemaphoreProperties;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport
Device::getDescriptorSetLayoutSupport(const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo &createInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport support;
	getDispatcher()->vkGetDescriptorSetLayoutSupport(static_cast<VkDevice>(m_device),
	                                                 reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>(&createInfo),
	                                                 reinterpret_cast<VkDescriptorSetLayoutSupport *>(&support));
	return support;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...>
Device::getDescriptorSetLayoutSupport(const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo &createInfo) const VULKAN_HPP_NOEXCEPT
{
	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport &support = structureChain.template get<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport>();
	getDispatcher()->vkGetDescriptorSetLayoutSupport(static_cast<VkDevice>(m_device),
	                                                 reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>(&createInfo),
	                                                 reinterpret_cast<VkDescriptorSetLayoutSupport *>(&support));
	return structureChain;
}

//=== VK_VERSION_1_2 ===

VULKAN_HPP_INLINE void CommandBuffer::drawIndirectCount(VULKAN_HPP_NAMESPACE::Buffer buffer,
                                                        VULKAN_HPP_NAMESPACE::DeviceSize offset,
                                                        VULKAN_HPP_NAMESPACE::Buffer countBuffer,
                                                        VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,
                                                        uint32_t maxDrawCount,
                                                        uint32_t stride) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdDrawIndirectCount(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                        static_cast<VkBuffer>(buffer),
	                                        static_cast<VkDeviceSize>(offset),
	                                        static_cast<VkBuffer>(countBuffer),
	                                        static_cast<VkDeviceSize>(countBufferOffset),
	                                        maxDrawCount,
	                                        stride);
}

VULKAN_HPP_INLINE void CommandBuffer::drawIndexedIndirectCount(VULKAN_HPP_NAMESPACE::Buffer buffer,
                                                               VULKAN_HPP_NAMESPACE::DeviceSize offset,
                                                               VULKAN_HPP_NAMESPACE::Buffer countBuffer,
                                                               VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,
                                                               uint32_t maxDrawCount,
                                                               uint32_t stride) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdDrawIndexedIndirectCount(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                               static_cast<VkBuffer>(buffer),
	                                               static_cast<VkDeviceSize>(offset),
	                                               static_cast<VkBuffer>(countBuffer),
	                                               static_cast<VkDeviceSize>(countBufferOffset),
	                                               maxDrawCount,
	                                               stride);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::RenderPass
Device::createRenderPass2(VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 const &createInfo,
                          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::RenderPass(*this, createInfo, allocator);
}

VULKAN_HPP_INLINE void CommandBuffer::beginRenderPass2(const VULKAN_HPP_NAMESPACE::RenderPassBeginInfo &renderPassBegin,
                                                       const VULKAN_HPP_NAMESPACE::SubpassBeginInfo &subpassBeginInfo) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdBeginRenderPass2(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                       reinterpret_cast<const VkRenderPassBeginInfo *>(&renderPassBegin),
	                                       reinterpret_cast<const VkSubpassBeginInfo *>(&subpassBeginInfo));
}

VULKAN_HPP_INLINE void CommandBuffer::nextSubpass2(const VULKAN_HPP_NAMESPACE::SubpassBeginInfo &subpassBeginInfo,
                                                   const VULKAN_HPP_NAMESPACE::SubpassEndInfo &subpassEndInfo) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdNextSubpass2(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                   reinterpret_cast<const VkSubpassBeginInfo *>(&subpassBeginInfo),
	                                   reinterpret_cast<const VkSubpassEndInfo *>(&subpassEndInfo));
}

VULKAN_HPP_INLINE void CommandBuffer::endRenderPass2(const VULKAN_HPP_NAMESPACE::SubpassEndInfo &subpassEndInfo) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdEndRenderPass2(static_cast<VkCommandBuffer>(m_commandBuffer), reinterpret_cast<const VkSubpassEndInfo *>(&subpassEndInfo));
}

VULKAN_HPP_INLINE void QueryPool::reset(uint32_t firstQuery, uint32_t queryCount) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkResetQueryPool(static_cast<VkDevice>(m_device), static_cast<VkQueryPool>(m_queryPool), firstQuery, queryCount);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint64_t Semaphore::getCounterValue() const
{
	uint64_t value;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetSemaphoreCounterValue(static_cast<VkDevice>(m_device), static_cast<VkSemaphore>(m_semaphore), &value));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Semaphore::getCounterValue");
	}
	return value;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result Device::waitSemaphores(const VULKAN_HPP_NAMESPACE::SemaphoreWaitInfo &waitInfo,
                                                                                           uint64_t timeout) const
{
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkWaitSemaphores(static_cast<VkDevice>(m_device), reinterpret_cast<const VkSemaphoreWaitInfo *>(&waitInfo), timeout));
	if((result != VULKAN_HPP_NAMESPACE::Result::eSuccess) && (result != VULKAN_HPP_NAMESPACE::Result::eTimeout))
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::waitSemaphores");
	}
	return result;
}

VULKAN_HPP_INLINE void Device::signalSemaphore(const VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo &signalInfo) const
{
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkSignalSemaphore(static_cast<VkDevice>(m_device), reinterpret_cast<const VkSemaphoreSignalInfo *>(&signalInfo)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::signalSemaphore");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceAddress
Device::getBufferAddress(const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo &info) const VULKAN_HPP_NOEXCEPT
{
	return static_cast<VULKAN_HPP_NAMESPACE::DeviceAddress>(
	    getDispatcher()->vkGetBufferDeviceAddress(static_cast<VkDevice>(m_device), reinterpret_cast<const VkBufferDeviceAddressInfo *>(&info)));
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint64_t
Device::getBufferOpaqueCaptureAddress(const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo &info) const VULKAN_HPP_NOEXCEPT
{
	return getDispatcher()->vkGetBufferOpaqueCaptureAddress(static_cast<VkDevice>(m_device),
	                                                        reinterpret_cast<const VkBufferDeviceAddressInfo *>(&info));
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint64_t
Device::getMemoryOpaqueCaptureAddress(const VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo &info) const VULKAN_HPP_NOEXCEPT
{
	return getDispatcher()->vkGetDeviceMemoryOpaqueCaptureAddress(static_cast<VkDevice>(m_device),
	                                                              reinterpret_cast<const VkDeviceMemoryOpaqueCaptureAddressInfo *>(&info));
}

//=== VK_VERSION_1_3 ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties> PhysicalDevice::getToolProperties() const
{
	std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties> toolProperties;
	uint32_t toolCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    getDispatcher()->vkGetPhysicalDeviceToolProperties(static_cast<VkPhysicalDevice>(m_physicalDevice), &toolCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && toolCount)
		{
			toolProperties.resize(toolCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetPhysicalDeviceToolProperties(
			    static_cast<VkPhysicalDevice>(m_physicalDevice), &toolCount, reinterpret_cast<VkPhysicalDeviceToolProperties *>(toolProperties.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getToolProperties");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(toolCount <= toolProperties.size());
		if(toolCount < toolProperties.size())
		{
			toolProperties.resize(toolCount);
		}
	}
	return toolProperties;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::PrivateDataSlot
Device::createPrivateDataSlot(VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo const &createInfo,
                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::PrivateDataSlot(*this, createInfo, allocator);
}

VULKAN_HPP_INLINE void Device::setPrivateData(VULKAN_HPP_NAMESPACE::ObjectType objectType_,
                                              uint64_t objectHandle,
                                              VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,
                                              uint64_t data) const
{
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkSetPrivateData(
	    static_cast<VkDevice>(m_device), static_cast<VkObjectType>(objectType_), objectHandle, static_cast<VkPrivateDataSlot>(privateDataSlot), data));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::setPrivateData");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint64_t Device::getPrivateData(VULKAN_HPP_NAMESPACE::ObjectType objectType_,
                                                                       uint64_t objectHandle,
                                                                       VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot) const VULKAN_HPP_NOEXCEPT
{
	uint64_t data;
	getDispatcher()->vkGetPrivateData(
	    static_cast<VkDevice>(m_device), static_cast<VkObjectType>(objectType_), objectHandle, static_cast<VkPrivateDataSlot>(privateDataSlot), &data);
	return data;
}

VULKAN_HPP_INLINE void CommandBuffer::setEvent2(VULKAN_HPP_NAMESPACE::Event event,
                                                const VULKAN_HPP_NAMESPACE::DependencyInfo &dependencyInfo) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetEvent2(
	    static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkEvent>(event), reinterpret_cast<const VkDependencyInfo *>(&dependencyInfo));
}

VULKAN_HPP_INLINE void CommandBuffer::resetEvent2(VULKAN_HPP_NAMESPACE::Event event,
                                                  VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stageMask) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdResetEvent2(
	    static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkEvent>(event), static_cast<VkPipelineStageFlags2>(stageMask));
}

VULKAN_HPP_INLINE void CommandBuffer::waitEvents2(ArrayProxy<const VULKAN_HPP_NAMESPACE::Event> const &events,
                                                  ArrayProxy<const VULKAN_HPP_NAMESPACE::DependencyInfo> const &dependencyInfos) const
{
	if(events.size() != dependencyInfos.size())
	{
		throw LogicError(VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::waitEvents2: events.size() != dependencyInfos.size()");
	}
	getDispatcher()->vkCmdWaitEvents2(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                  events.size(),
	                                  reinterpret_cast<const VkEvent *>(events.data()),
	                                  reinterpret_cast<const VkDependencyInfo *>(dependencyInfos.data()));
}

VULKAN_HPP_INLINE void CommandBuffer::pipelineBarrier2(const VULKAN_HPP_NAMESPACE::DependencyInfo &dependencyInfo) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdPipelineBarrier2(static_cast<VkCommandBuffer>(m_commandBuffer), reinterpret_cast<const VkDependencyInfo *>(&dependencyInfo));
}

VULKAN_HPP_INLINE void CommandBuffer::writeTimestamp2(VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stage,
                                                      VULKAN_HPP_NAMESPACE::QueryPool queryPool,
                                                      uint32_t query) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdWriteTimestamp2(
	    static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkPipelineStageFlags2>(stage), static_cast<VkQueryPool>(queryPool), query);
}

VULKAN_HPP_INLINE void Queue::submit2(ArrayProxy<const VULKAN_HPP_NAMESPACE::SubmitInfo2> const &submits, VULKAN_HPP_NAMESPACE::Fence fence) const
{
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkQueueSubmit2(
	    static_cast<VkQueue>(m_queue), submits.size(), reinterpret_cast<const VkSubmitInfo2 *>(submits.data()), static_cast<VkFence>(fence)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Queue::submit2");
	}
}

VULKAN_HPP_INLINE void CommandBuffer::copyBuffer2(const VULKAN_HPP_NAMESPACE::CopyBufferInfo2 &copyBufferInfo) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdCopyBuffer2(static_cast<VkCommandBuffer>(m_commandBuffer), reinterpret_cast<const VkCopyBufferInfo2 *>(&copyBufferInfo));
}

VULKAN_HPP_INLINE void CommandBuffer::copyImage2(const VULKAN_HPP_NAMESPACE::CopyImageInfo2 &copyImageInfo) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdCopyImage2(static_cast<VkCommandBuffer>(m_commandBuffer), reinterpret_cast<const VkCopyImageInfo2 *>(&copyImageInfo));
}

VULKAN_HPP_INLINE void
CommandBuffer::copyBufferToImage2(const VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2 &copyBufferToImageInfo) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdCopyBufferToImage2(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                         reinterpret_cast<const VkCopyBufferToImageInfo2 *>(&copyBufferToImageInfo));
}

VULKAN_HPP_INLINE void
CommandBuffer::copyImageToBuffer2(const VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2 &copyImageToBufferInfo) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdCopyImageToBuffer2(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                         reinterpret_cast<const VkCopyImageToBufferInfo2 *>(&copyImageToBufferInfo));
}

VULKAN_HPP_INLINE void CommandBuffer::blitImage2(const VULKAN_HPP_NAMESPACE::BlitImageInfo2 &blitImageInfo) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdBlitImage2(static_cast<VkCommandBuffer>(m_commandBuffer), reinterpret_cast<const VkBlitImageInfo2 *>(&blitImageInfo));
}

VULKAN_HPP_INLINE void CommandBuffer::resolveImage2(const VULKAN_HPP_NAMESPACE::ResolveImageInfo2 &resolveImageInfo) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdResolveImage2(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                    reinterpret_cast<const VkResolveImageInfo2 *>(&resolveImageInfo));
}

VULKAN_HPP_INLINE void CommandBuffer::beginRendering(const VULKAN_HPP_NAMESPACE::RenderingInfo &renderingInfo) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdBeginRendering(static_cast<VkCommandBuffer>(m_commandBuffer), reinterpret_cast<const VkRenderingInfo *>(&renderingInfo));
}

VULKAN_HPP_INLINE void CommandBuffer::endRendering() const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdEndRendering(static_cast<VkCommandBuffer>(m_commandBuffer));
}

VULKAN_HPP_INLINE void CommandBuffer::setCullMode(VULKAN_HPP_NAMESPACE::CullModeFlags cullMode) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetCullMode(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkCullModeFlags>(cullMode));
}

VULKAN_HPP_INLINE void CommandBuffer::setFrontFace(VULKAN_HPP_NAMESPACE::FrontFace frontFace) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetFrontFace(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkFrontFace>(frontFace));
}

VULKAN_HPP_INLINE void CommandBuffer::setPrimitiveTopology(VULKAN_HPP_NAMESPACE::PrimitiveTopology primitiveTopology) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetPrimitiveTopology(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkPrimitiveTopology>(primitiveTopology));
}

VULKAN_HPP_INLINE void CommandBuffer::setViewportWithCount(ArrayProxy<const VULKAN_HPP_NAMESPACE::Viewport> const &viewports) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetViewportWithCount(
	    static_cast<VkCommandBuffer>(m_commandBuffer), viewports.size(), reinterpret_cast<const VkViewport *>(viewports.data()));
}

VULKAN_HPP_INLINE void CommandBuffer::setScissorWithCount(ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const &scissors) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetScissorWithCount(
	    static_cast<VkCommandBuffer>(m_commandBuffer), scissors.size(), reinterpret_cast<const VkRect2D *>(scissors.data()));
}

VULKAN_HPP_INLINE void CommandBuffer::bindVertexBuffers2(uint32_t firstBinding,
                                                         ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &buffers,
                                                         ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &offsets,
                                                         ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &sizes,
                                                         ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &strides) const
{
	if(buffers.size() != offsets.size())
	{
		throw LogicError(VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::bindVertexBuffers2: buffers.size() != offsets.size()");
	}
	if(!sizes.empty() && buffers.size() != sizes.size())
	{
		throw LogicError(VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::bindVertexBuffers2: buffers.size() != sizes.size()");
	}
	if(!strides.empty() && buffers.size() != strides.size())
	{
		throw LogicError(VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::bindVertexBuffers2: buffers.size() != strides.size()");
	}
	getDispatcher()->vkCmdBindVertexBuffers2(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                         firstBinding,
	                                         buffers.size(),
	                                         reinterpret_cast<const VkBuffer *>(buffers.data()),
	                                         reinterpret_cast<const VkDeviceSize *>(offsets.data()),
	                                         reinterpret_cast<const VkDeviceSize *>(sizes.data()),
	                                         reinterpret_cast<const VkDeviceSize *>(strides.data()));
}

VULKAN_HPP_INLINE void CommandBuffer::setDepthTestEnable(VULKAN_HPP_NAMESPACE::Bool32 depthTestEnable) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetDepthTestEnable(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkBool32>(depthTestEnable));
}

VULKAN_HPP_INLINE void CommandBuffer::setDepthWriteEnable(VULKAN_HPP_NAMESPACE::Bool32 depthWriteEnable) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetDepthWriteEnable(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkBool32>(depthWriteEnable));
}

VULKAN_HPP_INLINE void CommandBuffer::setDepthCompareOp(VULKAN_HPP_NAMESPACE::CompareOp depthCompareOp) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetDepthCompareOp(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkCompareOp>(depthCompareOp));
}

VULKAN_HPP_INLINE void CommandBuffer::setDepthBoundsTestEnable(VULKAN_HPP_NAMESPACE::Bool32 depthBoundsTestEnable) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetDepthBoundsTestEnable(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkBool32>(depthBoundsTestEnable));
}

VULKAN_HPP_INLINE void CommandBuffer::setStencilTestEnable(VULKAN_HPP_NAMESPACE::Bool32 stencilTestEnable) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetStencilTestEnable(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkBool32>(stencilTestEnable));
}

VULKAN_HPP_INLINE void CommandBuffer::setStencilOp(VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask,
                                                   VULKAN_HPP_NAMESPACE::StencilOp failOp,
                                                   VULKAN_HPP_NAMESPACE::StencilOp passOp,
                                                   VULKAN_HPP_NAMESPACE::StencilOp depthFailOp,
                                                   VULKAN_HPP_NAMESPACE::CompareOp compareOp) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetStencilOp(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                   static_cast<VkStencilFaceFlags>(faceMask),
	                                   static_cast<VkStencilOp>(failOp),
	                                   static_cast<VkStencilOp>(passOp),
	                                   static_cast<VkStencilOp>(depthFailOp),
	                                   static_cast<VkCompareOp>(compareOp));
}

VULKAN_HPP_INLINE void CommandBuffer::setRasterizerDiscardEnable(VULKAN_HPP_NAMESPACE::Bool32 rasterizerDiscardEnable) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetRasterizerDiscardEnable(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkBool32>(rasterizerDiscardEnable));
}

VULKAN_HPP_INLINE void CommandBuffer::setDepthBiasEnable(VULKAN_HPP_NAMESPACE::Bool32 depthBiasEnable) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetDepthBiasEnable(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkBool32>(depthBiasEnable));
}

VULKAN_HPP_INLINE void CommandBuffer::setPrimitiveRestartEnable(VULKAN_HPP_NAMESPACE::Bool32 primitiveRestartEnable) const VULKAN_HPP_NOEXCEPT
{
	getDispatcher()->vkCmdSetPrimitiveRestartEnable(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkBool32>(primitiveRestartEnable));
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2
Device::getBufferMemoryRequirements(const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;
	getDispatcher()->vkGetDeviceBufferMemoryRequirements(static_cast<VkDevice>(m_device),
	                                                     reinterpret_cast<const VkDeviceBufferMemoryRequirements *>(&info),
	                                                     reinterpret_cast<VkMemoryRequirements2 *>(&memoryRequirements));
	return memoryRequirements;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...>
Device::getBufferMemoryRequirements(const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements &info) const VULKAN_HPP_NOEXCEPT
{
	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::MemoryRequirements2 &memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();
	getDispatcher()->vkGetDeviceBufferMemoryRequirements(static_cast<VkDevice>(m_device),
	                                                     reinterpret_cast<const VkDeviceBufferMemoryRequirements *>(&info),
	                                                     reinterpret_cast<VkMemoryRequirements2 *>(&memoryRequirements));
	return structureChain;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2
Device::getImageMemoryRequirements(const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;
	getDispatcher()->vkGetDeviceImageMemoryRequirements(static_cast<VkDevice>(m_device),
	                                                    reinterpret_cast<const VkDeviceImageMemoryRequirements *>(&info),
	                                                    reinterpret_cast<VkMemoryRequirements2 *>(&memoryRequirements));
	return memoryRequirements;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...>
Device::getImageMemoryRequirements(const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements &info) const VULKAN_HPP_NOEXCEPT
{
	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::MemoryRequirements2 &memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();
	getDispatcher()->vkGetDeviceImageMemoryRequirements(static_cast<VkDevice>(m_device),
	                                                    reinterpret_cast<const VkDeviceImageMemoryRequirements *>(&info),
	                                                    reinterpret_cast<VkMemoryRequirements2 *>(&memoryRequirements));
	return structureChain;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>
Device::getImageSparseMemoryRequirements(const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements &info) const VULKAN_HPP_NOEXCEPT
{
	uint32_t sparseMemoryRequirementCount;
	getDispatcher()->vkGetDeviceImageSparseMemoryRequirements(
	    static_cast<VkDevice>(m_device), reinterpret_cast<const VkDeviceImageMemoryRequirements *>(&info), &sparseMemoryRequirementCount, nullptr);
	std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2> sparseMemoryRequirements(sparseMemoryRequirementCount);
	getDispatcher()->vkGetDeviceImageSparseMemoryRequirements(static_cast<VkDevice>(m_device),
	                                                          reinterpret_cast<const VkDeviceImageMemoryRequirements *>(&info),
	                                                          &sparseMemoryRequirementCount,
	                                                          reinterpret_cast<VkSparseImageMemoryRequirements2 *>(sparseMemoryRequirements.data()));
	VULKAN_HPP_ASSERT(sparseMemoryRequirementCount == sparseMemoryRequirements.size());
	return sparseMemoryRequirements;
}

//=== VK_KHR_surface ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Bool32 PhysicalDevice::getSurfaceSupportKHR(uint32_t queueFamilyIndex,
                                                                                                         VULKAN_HPP_NAMESPACE::SurfaceKHR surface) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceSurfaceSupportKHR &&
	                  "Function <vkGetPhysicalDeviceSurfaceSupportKHR> needs extension <VK_KHR_surface> enabled!");

	VULKAN_HPP_NAMESPACE::Bool32 supported;
	VULKAN_HPP_NAMESPACE::Result result =
	    static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetPhysicalDeviceSurfaceSupportKHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                                                                    queueFamilyIndex,
	                                                                                                    static_cast<VkSurfaceKHR>(surface),
	                                                                                                    reinterpret_cast<VkBool32 *>(&supported)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getSurfaceSupportKHR");
	}
	return supported;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR
PhysicalDevice::getSurfaceCapabilitiesKHR(VULKAN_HPP_NAMESPACE::SurfaceKHR surface) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceSurfaceCapabilitiesKHR &&
	                  "Function <vkGetPhysicalDeviceSurfaceCapabilitiesKHR> needs extension <VK_KHR_surface> enabled!");

	VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR surfaceCapabilities;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetPhysicalDeviceSurfaceCapabilitiesKHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                               static_cast<VkSurfaceKHR>(surface),
	                                                               reinterpret_cast<VkSurfaceCapabilitiesKHR *>(&surfaceCapabilities)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getSurfaceCapabilitiesKHR");
	}
	return surfaceCapabilities;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormatKHR>
PhysicalDevice::getSurfaceFormatsKHR(VULKAN_HPP_NAMESPACE::SurfaceKHR surface) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceSurfaceFormatsKHR &&
	                  "Function <vkGetPhysicalDeviceSurfaceFormatsKHR> needs extension <VK_KHR_surface> enabled!");

	std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormatKHR> surfaceFormats;
	uint32_t surfaceFormatCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetPhysicalDeviceSurfaceFormatsKHR(
		    static_cast<VkPhysicalDevice>(m_physicalDevice), static_cast<VkSurfaceKHR>(surface), &surfaceFormatCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && surfaceFormatCount)
		{
			surfaceFormats.resize(surfaceFormatCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
			    getDispatcher()->vkGetPhysicalDeviceSurfaceFormatsKHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
			                                                          static_cast<VkSurfaceKHR>(surface),
			                                                          &surfaceFormatCount,
			                                                          reinterpret_cast<VkSurfaceFormatKHR *>(surfaceFormats.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getSurfaceFormatsKHR");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(surfaceFormatCount <= surfaceFormats.size());
		if(surfaceFormatCount < surfaceFormats.size())
		{
			surfaceFormats.resize(surfaceFormatCount);
		}
	}
	return surfaceFormats;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::PresentModeKHR>
PhysicalDevice::getSurfacePresentModesKHR(VULKAN_HPP_NAMESPACE::SurfaceKHR surface) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceSurfacePresentModesKHR &&
	                  "Function <vkGetPhysicalDeviceSurfacePresentModesKHR> needs extension <VK_KHR_surface> enabled!");

	std::vector<VULKAN_HPP_NAMESPACE::PresentModeKHR> presentModes;
	uint32_t presentModeCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetPhysicalDeviceSurfacePresentModesKHR(
		    static_cast<VkPhysicalDevice>(m_physicalDevice), static_cast<VkSurfaceKHR>(surface), &presentModeCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && presentModeCount)
		{
			presentModes.resize(presentModeCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
			    getDispatcher()->vkGetPhysicalDeviceSurfacePresentModesKHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
			                                                               static_cast<VkSurfaceKHR>(surface),
			                                                               &presentModeCount,
			                                                               reinterpret_cast<VkPresentModeKHR *>(presentModes.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getSurfacePresentModesKHR");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(presentModeCount <= presentModes.size());
		if(presentModeCount < presentModes.size())
		{
			presentModes.resize(presentModeCount);
		}
	}
	return presentModes;
}

//=== VK_KHR_swapchain ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::SwapchainKHR
Device::createSwapchainKHR(VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR const &createInfo,
                           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::SwapchainKHR(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VkImage> SwapchainKHR::getImages() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetSwapchainImagesKHR && "Function <vkGetSwapchainImagesKHR> needs extension <VK_KHR_swapchain> enabled!");

	std::vector<VkImage> swapchainImages;
	uint32_t swapchainImageCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetSwapchainImagesKHR(
		    static_cast<VkDevice>(m_device), static_cast<VkSwapchainKHR>(m_swapchain), &swapchainImageCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && swapchainImageCount)
		{
			swapchainImages.resize(swapchainImageCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetSwapchainImagesKHR(
			    static_cast<VkDevice>(m_device), static_cast<VkSwapchainKHR>(m_swapchain), &swapchainImageCount, swapchainImages.data()));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::SwapchainKHR::getImages");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(swapchainImageCount <= swapchainImages.size());
		if(swapchainImageCount < swapchainImages.size())
		{
			swapchainImages.resize(swapchainImageCount);
		}
	}
	return swapchainImages;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::pair<VULKAN_HPP_NAMESPACE::Result, uint32_t>
SwapchainKHR::acquireNextImage(uint64_t timeout, VULKAN_HPP_NAMESPACE::Semaphore semaphore, VULKAN_HPP_NAMESPACE::Fence fence) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkAcquireNextImageKHR && "Function <vkAcquireNextImageKHR> needs extension <VK_KHR_swapchain> enabled!");

	uint32_t imageIndex;
	VULKAN_HPP_NAMESPACE::Result result =
	    static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkAcquireNextImageKHR(static_cast<VkDevice>(m_device),
	                                                                                     static_cast<VkSwapchainKHR>(m_swapchain),
	                                                                                     timeout,
	                                                                                     static_cast<VkSemaphore>(semaphore),
	                                                                                     static_cast<VkFence>(fence),
	                                                                                     &imageIndex));
	if((result != VULKAN_HPP_NAMESPACE::Result::eSuccess) && (result != VULKAN_HPP_NAMESPACE::Result::eTimeout) &&
	   (result != VULKAN_HPP_NAMESPACE::Result::eNotReady) && (result != VULKAN_HPP_NAMESPACE::Result::eSuboptimalKHR))
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::SwapchainKHR::acquireNextImage");
	}
	return std::make_pair(result, imageIndex);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result Queue::presentKHR(const VULKAN_HPP_NAMESPACE::PresentInfoKHR &presentInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkQueuePresentKHR && "Function <vkQueuePresentKHR> needs extension <VK_KHR_swapchain> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkQueuePresentKHR(static_cast<VkQueue>(m_queue), reinterpret_cast<const VkPresentInfoKHR *>(&presentInfo)));
	if((result != VULKAN_HPP_NAMESPACE::Result::eSuccess) && (result != VULKAN_HPP_NAMESPACE::Result::eSuboptimalKHR))
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Queue::presentKHR");
	}
	return result;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceGroupPresentCapabilitiesKHR Device::getGroupPresentCapabilitiesKHR() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetDeviceGroupPresentCapabilitiesKHR &&
	                  "Function <vkGetDeviceGroupPresentCapabilitiesKHR> needs extension <VK_KHR_swapchain> enabled!");

	VULKAN_HPP_NAMESPACE::DeviceGroupPresentCapabilitiesKHR deviceGroupPresentCapabilities;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetDeviceGroupPresentCapabilitiesKHR(
	    static_cast<VkDevice>(m_device), reinterpret_cast<VkDeviceGroupPresentCapabilitiesKHR *>(&deviceGroupPresentCapabilities)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getGroupPresentCapabilitiesKHR");
	}
	return deviceGroupPresentCapabilities;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR
Device::getGroupSurfacePresentModesKHR(VULKAN_HPP_NAMESPACE::SurfaceKHR surface) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetDeviceGroupSurfacePresentModesKHR &&
	                  "Function <vkGetDeviceGroupSurfacePresentModesKHR> needs extension <VK_KHR_swapchain> enabled!");

	VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR modes;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetDeviceGroupSurfacePresentModesKHR(
	    static_cast<VkDevice>(m_device), static_cast<VkSurfaceKHR>(surface), reinterpret_cast<VkDeviceGroupPresentModeFlagsKHR *>(&modes)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getGroupSurfacePresentModesKHR");
	}
	return modes;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::Rect2D>
PhysicalDevice::getPresentRectanglesKHR(VULKAN_HPP_NAMESPACE::SurfaceKHR surface) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDevicePresentRectanglesKHR &&
	                  "Function <vkGetPhysicalDevicePresentRectanglesKHR> needs extension <VK_KHR_swapchain> enabled!");

	std::vector<VULKAN_HPP_NAMESPACE::Rect2D> rects;
	uint32_t rectCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetPhysicalDevicePresentRectanglesKHR(
		    static_cast<VkPhysicalDevice>(m_physicalDevice), static_cast<VkSurfaceKHR>(surface), &rectCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && rectCount)
		{
			rects.resize(rectCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
			    getDispatcher()->vkGetPhysicalDevicePresentRectanglesKHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
			                                                             static_cast<VkSurfaceKHR>(surface),
			                                                             &rectCount,
			                                                             reinterpret_cast<VkRect2D *>(rects.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getPresentRectanglesKHR");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(rectCount <= rects.size());
		if(rectCount < rects.size())
		{
			rects.resize(rectCount);
		}
	}
	return rects;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::pair<VULKAN_HPP_NAMESPACE::Result, uint32_t>
Device::acquireNextImage2KHR(const VULKAN_HPP_NAMESPACE::AcquireNextImageInfoKHR &acquireInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkAcquireNextImage2KHR && "Function <vkAcquireNextImage2KHR> needs extension <VK_KHR_swapchain> enabled!");

	uint32_t imageIndex;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkAcquireNextImage2KHR(
	    static_cast<VkDevice>(m_device), reinterpret_cast<const VkAcquireNextImageInfoKHR *>(&acquireInfo), &imageIndex));
	if((result != VULKAN_HPP_NAMESPACE::Result::eSuccess) && (result != VULKAN_HPP_NAMESPACE::Result::eTimeout) &&
	   (result != VULKAN_HPP_NAMESPACE::Result::eNotReady) && (result != VULKAN_HPP_NAMESPACE::Result::eSuboptimalKHR))
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::acquireNextImage2KHR");
	}
	return std::make_pair(result, imageIndex);
}

//=== VK_KHR_display ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR> PhysicalDevice::getDisplayPropertiesKHR() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceDisplayPropertiesKHR &&
	                  "Function <vkGetPhysicalDeviceDisplayPropertiesKHR> needs extension <VK_KHR_display> enabled!");

	std::vector<VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR> properties;
	uint32_t propertyCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    getDispatcher()->vkGetPhysicalDeviceDisplayPropertiesKHR(static_cast<VkPhysicalDevice>(m_physicalDevice), &propertyCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && propertyCount)
		{
			properties.resize(propertyCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetPhysicalDeviceDisplayPropertiesKHR(
			    static_cast<VkPhysicalDevice>(m_physicalDevice), &propertyCount, reinterpret_cast<VkDisplayPropertiesKHR *>(properties.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getDisplayPropertiesKHR");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(propertyCount <= properties.size());
		if(propertyCount < properties.size())
		{
			properties.resize(propertyCount);
		}
	}
	return properties;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR> PhysicalDevice::getDisplayPlanePropertiesKHR() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceDisplayPlanePropertiesKHR &&
	                  "Function <vkGetPhysicalDeviceDisplayPlanePropertiesKHR> needs extension <VK_KHR_display> enabled!");

	std::vector<VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR> properties;
	uint32_t propertyCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    getDispatcher()->vkGetPhysicalDeviceDisplayPlanePropertiesKHR(static_cast<VkPhysicalDevice>(m_physicalDevice), &propertyCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && propertyCount)
		{
			properties.resize(propertyCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetPhysicalDeviceDisplayPlanePropertiesKHR(
			    static_cast<VkPhysicalDevice>(m_physicalDevice), &propertyCount, reinterpret_cast<VkDisplayPlanePropertiesKHR *>(properties.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getDisplayPlanePropertiesKHR");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(propertyCount <= properties.size());
		if(propertyCount < properties.size())
		{
			properties.resize(propertyCount);
		}
	}
	return properties;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_RAII_NAMESPACE::DisplayKHR>
PhysicalDevice::getDisplayPlaneSupportedDisplaysKHR(uint32_t planeIndex) const
{
	return VULKAN_HPP_RAII_NAMESPACE::DisplayKHRs(*this, planeIndex);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR> DisplayKHR::getModeProperties() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetDisplayModePropertiesKHR &&
	                  "Function <vkGetDisplayModePropertiesKHR> needs extension <VK_KHR_display> enabled!");

	std::vector<VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR> properties;
	uint32_t propertyCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetDisplayModePropertiesKHR(
		    static_cast<VkPhysicalDevice>(m_physicalDevice), static_cast<VkDisplayKHR>(m_display), &propertyCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && propertyCount)
		{
			properties.resize(propertyCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
			    getDispatcher()->vkGetDisplayModePropertiesKHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
			                                                   static_cast<VkDisplayKHR>(m_display),
			                                                   &propertyCount,
			                                                   reinterpret_cast<VkDisplayModePropertiesKHR *>(properties.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::DisplayKHR::getModeProperties");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(propertyCount <= properties.size());
		if(propertyCount < properties.size())
		{
			properties.resize(propertyCount);
		}
	}
	return properties;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::DisplayModeKHR
DisplayKHR::createMode(VULKAN_HPP_NAMESPACE::DisplayModeCreateInfoKHR const &createInfo,
                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::DisplayModeKHR(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilitiesKHR
DisplayModeKHR::getDisplayPlaneCapabilities(uint32_t planeIndex) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetDisplayPlaneCapabilitiesKHR &&
	                  "Function <vkGetDisplayPlaneCapabilitiesKHR> needs extension <VK_KHR_display> enabled!");

	VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilitiesKHR capabilities;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetDisplayPlaneCapabilitiesKHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                      static_cast<VkDisplayModeKHR>(m_displayModeKHR),
	                                                      planeIndex,
	                                                      reinterpret_cast<VkDisplayPlaneCapabilitiesKHR *>(&capabilities)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::DisplayModeKHR::getDisplayPlaneCapabilities");
	}
	return capabilities;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
Instance::createDisplayPlaneSurfaceKHR(VULKAN_HPP_NAMESPACE::DisplaySurfaceCreateInfoKHR const &createInfo,
                                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR(*this, createInfo, allocator);
}

//=== VK_KHR_display_swapchain ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_RAII_NAMESPACE::SwapchainKHR>
Device::createSharedSwapchainsKHR(VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR> const &createInfos,
                                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::SwapchainKHRs(*this, createInfos, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::SwapchainKHR
Device::createSharedSwapchainKHR(VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR const &createInfo,
                                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::SwapchainKHR(*this, createInfo, allocator);
}

#	if defined(VK_USE_PLATFORM_XLIB_KHR)
//=== VK_KHR_xlib_surface ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
Instance::createXlibSurfaceKHR(VULKAN_HPP_NAMESPACE::XlibSurfaceCreateInfoKHR const &createInfo,
                               VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Bool32
PhysicalDevice::getXlibPresentationSupportKHR(uint32_t queueFamilyIndex, Display &dpy, VisualID visualID) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceXlibPresentationSupportKHR &&
	                  "Function <vkGetPhysicalDeviceXlibPresentationSupportKHR> needs extension <VK_KHR_xlib_surface> enabled!");

	return static_cast<VULKAN_HPP_NAMESPACE::Bool32>(
	    getDispatcher()->vkGetPhysicalDeviceXlibPresentationSupportKHR(static_cast<VkPhysicalDevice>(m_physicalDevice), queueFamilyIndex, &dpy, visualID));
}
#	endif /*VK_USE_PLATFORM_XLIB_KHR*/

#	if defined(VK_USE_PLATFORM_XCB_KHR)
//=== VK_KHR_xcb_surface ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
Instance::createXcbSurfaceKHR(VULKAN_HPP_NAMESPACE::XcbSurfaceCreateInfoKHR const &createInfo,
                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Bool32 PhysicalDevice::getXcbPresentationSupportKHR(
    uint32_t queueFamilyIndex, xcb_connection_t &connection, xcb_visualid_t visual_id) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceXcbPresentationSupportKHR &&
	                  "Function <vkGetPhysicalDeviceXcbPresentationSupportKHR> needs extension <VK_KHR_xcb_surface> enabled!");

	return static_cast<VULKAN_HPP_NAMESPACE::Bool32>(getDispatcher()->vkGetPhysicalDeviceXcbPresentationSupportKHR(
	    static_cast<VkPhysicalDevice>(m_physicalDevice), queueFamilyIndex, &connection, visual_id));
}
#	endif /*VK_USE_PLATFORM_XCB_KHR*/

#	if defined(VK_USE_PLATFORM_WAYLAND_KHR)
//=== VK_KHR_wayland_surface ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
Instance::createWaylandSurfaceKHR(VULKAN_HPP_NAMESPACE::WaylandSurfaceCreateInfoKHR const &createInfo,
                                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Bool32
PhysicalDevice::getWaylandPresentationSupportKHR(uint32_t queueFamilyIndex, struct wl_display &display) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceWaylandPresentationSupportKHR &&
	                  "Function <vkGetPhysicalDeviceWaylandPresentationSupportKHR> needs extension <VK_KHR_wayland_surface> enabled!");

	return static_cast<VULKAN_HPP_NAMESPACE::Bool32>(
	    getDispatcher()->vkGetPhysicalDeviceWaylandPresentationSupportKHR(static_cast<VkPhysicalDevice>(m_physicalDevice), queueFamilyIndex, &display));
}
#	endif /*VK_USE_PLATFORM_WAYLAND_KHR*/

#	if defined(VK_USE_PLATFORM_ANDROID_KHR)
//=== VK_KHR_android_surface ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
Instance::createAndroidSurfaceKHR(VULKAN_HPP_NAMESPACE::AndroidSurfaceCreateInfoKHR const &createInfo,
                                  VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR(*this, createInfo, allocator);
}
#	endif /*VK_USE_PLATFORM_ANDROID_KHR*/

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
//=== VK_KHR_win32_surface ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
Instance::createWin32SurfaceKHR(VULKAN_HPP_NAMESPACE::Win32SurfaceCreateInfoKHR const &createInfo,
                                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Bool32
PhysicalDevice::getWin32PresentationSupportKHR(uint32_t queueFamilyIndex) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceWin32PresentationSupportKHR &&
	                  "Function <vkGetPhysicalDeviceWin32PresentationSupportKHR> needs extension <VK_KHR_win32_surface> enabled!");

	return static_cast<VULKAN_HPP_NAMESPACE::Bool32>(
	    getDispatcher()->vkGetPhysicalDeviceWin32PresentationSupportKHR(static_cast<VkPhysicalDevice>(m_physicalDevice), queueFamilyIndex));
}
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

//=== VK_EXT_debug_report ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::DebugReportCallbackEXT
Instance::createDebugReportCallbackEXT(VULKAN_HPP_NAMESPACE::DebugReportCallbackCreateInfoEXT const &createInfo,
                                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::DebugReportCallbackEXT(*this, createInfo, allocator);
}

VULKAN_HPP_INLINE void Instance::debugReportMessageEXT(VULKAN_HPP_NAMESPACE::DebugReportFlagsEXT flags,
                                                       VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT objectType_,
                                                       uint64_t object,
                                                       size_t location,
                                                       int32_t messageCode,
                                                       const std::string &layerPrefix,
                                                       const std::string &message) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkDebugReportMessageEXT && "Function <vkDebugReportMessageEXT> needs extension <VK_EXT_debug_report> enabled!");

	getDispatcher()->vkDebugReportMessageEXT(static_cast<VkInstance>(m_instance),
	                                         static_cast<VkDebugReportFlagsEXT>(flags),
	                                         static_cast<VkDebugReportObjectTypeEXT>(objectType_),
	                                         object,
	                                         location,
	                                         messageCode,
	                                         layerPrefix.c_str(),
	                                         message.c_str());
}

//=== VK_EXT_debug_marker ===

VULKAN_HPP_INLINE void Device::debugMarkerSetObjectTagEXT(const VULKAN_HPP_NAMESPACE::DebugMarkerObjectTagInfoEXT &tagInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkDebugMarkerSetObjectTagEXT &&
	                  "Function <vkDebugMarkerSetObjectTagEXT> needs extension <VK_EXT_debug_marker> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkDebugMarkerSetObjectTagEXT(
	    static_cast<VkDevice>(m_device), reinterpret_cast<const VkDebugMarkerObjectTagInfoEXT *>(&tagInfo)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::debugMarkerSetObjectTagEXT");
	}
}

VULKAN_HPP_INLINE void Device::debugMarkerSetObjectNameEXT(const VULKAN_HPP_NAMESPACE::DebugMarkerObjectNameInfoEXT &nameInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkDebugMarkerSetObjectNameEXT &&
	                  "Function <vkDebugMarkerSetObjectNameEXT> needs extension <VK_EXT_debug_marker> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkDebugMarkerSetObjectNameEXT(
	    static_cast<VkDevice>(m_device), reinterpret_cast<const VkDebugMarkerObjectNameInfoEXT *>(&nameInfo)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::debugMarkerSetObjectNameEXT");
	}
}

VULKAN_HPP_INLINE void CommandBuffer::debugMarkerBeginEXT(const VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT &markerInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdDebugMarkerBeginEXT && "Function <vkCmdDebugMarkerBeginEXT> needs extension <VK_EXT_debug_marker> enabled!");

	getDispatcher()->vkCmdDebugMarkerBeginEXT(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                          reinterpret_cast<const VkDebugMarkerMarkerInfoEXT *>(&markerInfo));
}

VULKAN_HPP_INLINE void CommandBuffer::debugMarkerEndEXT() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdDebugMarkerEndEXT && "Function <vkCmdDebugMarkerEndEXT> needs extension <VK_EXT_debug_marker> enabled!");

	getDispatcher()->vkCmdDebugMarkerEndEXT(static_cast<VkCommandBuffer>(m_commandBuffer));
}

VULKAN_HPP_INLINE void CommandBuffer::debugMarkerInsertEXT(const VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT &markerInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdDebugMarkerInsertEXT && "Function <vkCmdDebugMarkerInsertEXT> needs extension <VK_EXT_debug_marker> enabled!");

	getDispatcher()->vkCmdDebugMarkerInsertEXT(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                           reinterpret_cast<const VkDebugMarkerMarkerInfoEXT *>(&markerInfo));
}

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
//=== VK_KHR_video_queue ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR
PhysicalDevice::getVideoCapabilitiesKHR(const VULKAN_HPP_NAMESPACE::VideoProfileKHR &videoProfile) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceVideoCapabilitiesKHR &&
	                  "Function <vkGetPhysicalDeviceVideoCapabilitiesKHR> needs extension <VK_KHR_video_queue> enabled!");

	VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR capabilities;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetPhysicalDeviceVideoCapabilitiesKHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                             reinterpret_cast<const VkVideoProfileKHR *>(&videoProfile),
	                                                             reinterpret_cast<VkVideoCapabilitiesKHR *>(&capabilities)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getVideoCapabilitiesKHR");
	}
	return capabilities;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...> PhysicalDevice::getVideoCapabilitiesKHR(const VULKAN_HPP_NAMESPACE::VideoProfileKHR &videoProfile) const
{
	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR &capabilities = structureChain.template get<VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR>();
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetPhysicalDeviceVideoCapabilitiesKHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                             reinterpret_cast<const VkVideoProfileKHR *>(&videoProfile),
	                                                             reinterpret_cast<VkVideoCapabilitiesKHR *>(&capabilities)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getVideoCapabilitiesKHR");
	}
	return structureChain;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR>
PhysicalDevice::getVideoFormatPropertiesKHR(const VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoFormatInfoKHR &videoFormatInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceVideoFormatPropertiesKHR &&
	                  "Function <vkGetPhysicalDeviceVideoFormatPropertiesKHR> needs extension <VK_KHR_video_queue> enabled!");

	std::vector<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR> videoFormatProperties;
	uint32_t videoFormatPropertyCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    getDispatcher()->vkGetPhysicalDeviceVideoFormatPropertiesKHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
		                                                                 reinterpret_cast<const VkPhysicalDeviceVideoFormatInfoKHR *>(&videoFormatInfo),
		                                                                 &videoFormatPropertyCount,
		                                                                 nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && videoFormatPropertyCount)
		{
			videoFormatProperties.resize(videoFormatPropertyCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
			    getDispatcher()->vkGetPhysicalDeviceVideoFormatPropertiesKHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
			                                                                 reinterpret_cast<const VkPhysicalDeviceVideoFormatInfoKHR *>(&videoFormatInfo),
			                                                                 &videoFormatPropertyCount,
			                                                                 reinterpret_cast<VkVideoFormatPropertiesKHR *>(videoFormatProperties.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getVideoFormatPropertiesKHR");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(videoFormatPropertyCount <= videoFormatProperties.size());
		if(videoFormatPropertyCount < videoFormatProperties.size())
		{
			videoFormatProperties.resize(videoFormatPropertyCount);
		}
	}
	return videoFormatProperties;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::VideoSessionKHR
Device::createVideoSessionKHR(VULKAN_HPP_NAMESPACE::VideoSessionCreateInfoKHR const &createInfo,
                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::VideoSessionKHR(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::VideoGetMemoryPropertiesKHR> VideoSessionKHR::getMemoryRequirements() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetVideoSessionMemoryRequirementsKHR &&
	                  "Function <vkGetVideoSessionMemoryRequirementsKHR> needs extension <VK_KHR_video_queue> enabled!");

	std::vector<VULKAN_HPP_NAMESPACE::VideoGetMemoryPropertiesKHR> videoSessionMemoryRequirements;
	uint32_t videoSessionMemoryRequirementsCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetVideoSessionMemoryRequirementsKHR(
		    static_cast<VkDevice>(m_device), static_cast<VkVideoSessionKHR>(m_videoSession), &videoSessionMemoryRequirementsCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && videoSessionMemoryRequirementsCount)
		{
			videoSessionMemoryRequirements.resize(videoSessionMemoryRequirementsCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetVideoSessionMemoryRequirementsKHR(
			    static_cast<VkDevice>(m_device),
			    static_cast<VkVideoSessionKHR>(m_videoSession),
			    &videoSessionMemoryRequirementsCount,
			    reinterpret_cast<VkVideoGetMemoryPropertiesKHR *>(videoSessionMemoryRequirements.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::VideoSessionKHR::getMemoryRequirements");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(videoSessionMemoryRequirementsCount <= videoSessionMemoryRequirements.size());
		if(videoSessionMemoryRequirementsCount < videoSessionMemoryRequirements.size())
		{
			videoSessionMemoryRequirements.resize(videoSessionMemoryRequirementsCount);
		}
	}
	return videoSessionMemoryRequirements;
}

VULKAN_HPP_INLINE void VideoSessionKHR::bindMemory(ArrayProxy<const VULKAN_HPP_NAMESPACE::VideoBindMemoryKHR> const &videoSessionBindMemories) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkBindVideoSessionMemoryKHR &&
	                  "Function <vkBindVideoSessionMemoryKHR> needs extension <VK_KHR_video_queue> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkBindVideoSessionMemoryKHR(static_cast<VkDevice>(m_device),
	                                                 static_cast<VkVideoSessionKHR>(m_videoSession),
	                                                 videoSessionBindMemories.size(),
	                                                 reinterpret_cast<const VkVideoBindMemoryKHR *>(videoSessionBindMemories.data())));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::VideoSessionKHR::bindMemory");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::VideoSessionParametersKHR
Device::createVideoSessionParametersKHR(VULKAN_HPP_NAMESPACE::VideoSessionParametersCreateInfoKHR const &createInfo,
                                        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::VideoSessionParametersKHR(*this, createInfo, allocator);
}

VULKAN_HPP_INLINE void VideoSessionParametersKHR::update(const VULKAN_HPP_NAMESPACE::VideoSessionParametersUpdateInfoKHR &updateInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkUpdateVideoSessionParametersKHR &&
	                  "Function <vkUpdateVideoSessionParametersKHR> needs extension <VK_KHR_video_queue> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkUpdateVideoSessionParametersKHR(static_cast<VkDevice>(m_device),
	                                                       static_cast<VkVideoSessionParametersKHR>(m_videoSessionParameters),
	                                                       reinterpret_cast<const VkVideoSessionParametersUpdateInfoKHR *>(&updateInfo)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::VideoSessionParametersKHR::update");
	}
}

VULKAN_HPP_INLINE void CommandBuffer::beginVideoCodingKHR(const VULKAN_HPP_NAMESPACE::VideoBeginCodingInfoKHR &beginInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdBeginVideoCodingKHR && "Function <vkCmdBeginVideoCodingKHR> needs extension <VK_KHR_video_queue> enabled!");

	getDispatcher()->vkCmdBeginVideoCodingKHR(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                          reinterpret_cast<const VkVideoBeginCodingInfoKHR *>(&beginInfo));
}

VULKAN_HPP_INLINE void CommandBuffer::endVideoCodingKHR(const VULKAN_HPP_NAMESPACE::VideoEndCodingInfoKHR &endCodingInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdEndVideoCodingKHR && "Function <vkCmdEndVideoCodingKHR> needs extension <VK_KHR_video_queue> enabled!");

	getDispatcher()->vkCmdEndVideoCodingKHR(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                        reinterpret_cast<const VkVideoEndCodingInfoKHR *>(&endCodingInfo));
}

VULKAN_HPP_INLINE void
CommandBuffer::controlVideoCodingKHR(const VULKAN_HPP_NAMESPACE::VideoCodingControlInfoKHR &codingControlInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdControlVideoCodingKHR && "Function <vkCmdControlVideoCodingKHR> needs extension <VK_KHR_video_queue> enabled!");

	getDispatcher()->vkCmdControlVideoCodingKHR(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                            reinterpret_cast<const VkVideoCodingControlInfoKHR *>(&codingControlInfo));
}
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
//=== VK_KHR_video_decode_queue ===

VULKAN_HPP_INLINE void CommandBuffer::decodeVideoKHR(const VULKAN_HPP_NAMESPACE::VideoDecodeInfoKHR &frameInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdDecodeVideoKHR && "Function <vkCmdDecodeVideoKHR> needs extension <VK_KHR_video_decode_queue> enabled!");

	getDispatcher()->vkCmdDecodeVideoKHR(static_cast<VkCommandBuffer>(m_commandBuffer), reinterpret_cast<const VkVideoDecodeInfoKHR *>(&frameInfo));
}
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

//=== VK_EXT_transform_feedback ===

VULKAN_HPP_INLINE void CommandBuffer::bindTransformFeedbackBuffersEXT(uint32_t firstBinding,
                                                                      ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &buffers,
                                                                      ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &offsets,
                                                                      ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &sizes) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdBindTransformFeedbackBuffersEXT &&
	                  "Function <vkCmdBindTransformFeedbackBuffersEXT> needs extension <VK_EXT_transform_feedback> enabled!");

	if(buffers.size() != offsets.size())
	{
		throw LogicError(VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::bindTransformFeedbackBuffersEXT: buffers.size() != offsets.size()");
	}
	if(!sizes.empty() && buffers.size() != sizes.size())
	{
		throw LogicError(VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::bindTransformFeedbackBuffersEXT: buffers.size() != sizes.size()");
	}
	getDispatcher()->vkCmdBindTransformFeedbackBuffersEXT(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                                      firstBinding,
	                                                      buffers.size(),
	                                                      reinterpret_cast<const VkBuffer *>(buffers.data()),
	                                                      reinterpret_cast<const VkDeviceSize *>(offsets.data()),
	                                                      reinterpret_cast<const VkDeviceSize *>(sizes.data()));
}

VULKAN_HPP_INLINE void CommandBuffer::beginTransformFeedbackEXT(uint32_t firstCounterBuffer,
                                                                ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &counterBuffers,
                                                                ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &counterBufferOffsets) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdBeginTransformFeedbackEXT &&
	                  "Function <vkCmdBeginTransformFeedbackEXT> needs extension <VK_EXT_transform_feedback> enabled!");

	if(!counterBufferOffsets.empty() && counterBuffers.size() != counterBufferOffsets.size())
	{
		throw LogicError(VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::beginTransformFeedbackEXT: counterBuffers.size() != counterBufferOffsets.size()");
	}
	getDispatcher()->vkCmdBeginTransformFeedbackEXT(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                                firstCounterBuffer,
	                                                counterBuffers.size(),
	                                                reinterpret_cast<const VkBuffer *>(counterBuffers.data()),
	                                                reinterpret_cast<const VkDeviceSize *>(counterBufferOffsets.data()));
}

VULKAN_HPP_INLINE void CommandBuffer::endTransformFeedbackEXT(uint32_t firstCounterBuffer,
                                                              ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &counterBuffers,
                                                              ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &counterBufferOffsets) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdEndTransformFeedbackEXT &&
	                  "Function <vkCmdEndTransformFeedbackEXT> needs extension <VK_EXT_transform_feedback> enabled!");

	if(!counterBufferOffsets.empty() && counterBuffers.size() != counterBufferOffsets.size())
	{
		throw LogicError(VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::endTransformFeedbackEXT: counterBuffers.size() != counterBufferOffsets.size()");
	}
	getDispatcher()->vkCmdEndTransformFeedbackEXT(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                              firstCounterBuffer,
	                                              counterBuffers.size(),
	                                              reinterpret_cast<const VkBuffer *>(counterBuffers.data()),
	                                              reinterpret_cast<const VkDeviceSize *>(counterBufferOffsets.data()));
}

VULKAN_HPP_INLINE void CommandBuffer::beginQueryIndexedEXT(VULKAN_HPP_NAMESPACE::QueryPool queryPool,
                                                           uint32_t query,
                                                           VULKAN_HPP_NAMESPACE::QueryControlFlags flags,
                                                           uint32_t index) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdBeginQueryIndexedEXT &&
	                  "Function <vkCmdBeginQueryIndexedEXT> needs extension <VK_EXT_transform_feedback> enabled!");

	getDispatcher()->vkCmdBeginQueryIndexedEXT(
	    static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkQueryPool>(queryPool), query, static_cast<VkQueryControlFlags>(flags), index);
}

VULKAN_HPP_INLINE void
CommandBuffer::endQueryIndexedEXT(VULKAN_HPP_NAMESPACE::QueryPool queryPool, uint32_t query, uint32_t index) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdEndQueryIndexedEXT &&
	                  "Function <vkCmdEndQueryIndexedEXT> needs extension <VK_EXT_transform_feedback> enabled!");

	getDispatcher()->vkCmdEndQueryIndexedEXT(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkQueryPool>(queryPool), query, index);
}

VULKAN_HPP_INLINE void CommandBuffer::drawIndirectByteCountEXT(uint32_t instanceCount,
                                                               uint32_t firstInstance,
                                                               VULKAN_HPP_NAMESPACE::Buffer counterBuffer,
                                                               VULKAN_HPP_NAMESPACE::DeviceSize counterBufferOffset,
                                                               uint32_t counterOffset,
                                                               uint32_t vertexStride) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdDrawIndirectByteCountEXT &&
	                  "Function <vkCmdDrawIndirectByteCountEXT> needs extension <VK_EXT_transform_feedback> enabled!");

	getDispatcher()->vkCmdDrawIndirectByteCountEXT(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                               instanceCount,
	                                               firstInstance,
	                                               static_cast<VkBuffer>(counterBuffer),
	                                               static_cast<VkDeviceSize>(counterBufferOffset),
	                                               counterOffset,
	                                               vertexStride);
}

//=== VK_NVX_binary_import ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::CuModuleNVX
Device::createCuModuleNVX(VULKAN_HPP_NAMESPACE::CuModuleCreateInfoNVX const &createInfo,
                          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::CuModuleNVX(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::CuFunctionNVX
Device::createCuFunctionNVX(VULKAN_HPP_NAMESPACE::CuFunctionCreateInfoNVX const &createInfo,
                            VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::CuFunctionNVX(*this, createInfo, allocator);
}

VULKAN_HPP_INLINE void CommandBuffer::cuLaunchKernelNVX(const VULKAN_HPP_NAMESPACE::CuLaunchInfoNVX &launchInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdCuLaunchKernelNVX && "Function <vkCmdCuLaunchKernelNVX> needs extension <VK_NVX_binary_import> enabled!");

	getDispatcher()->vkCmdCuLaunchKernelNVX(static_cast<VkCommandBuffer>(m_commandBuffer), reinterpret_cast<const VkCuLaunchInfoNVX *>(&launchInfo));
}

//=== VK_NVX_image_view_handle ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint32_t
Device::getImageViewHandleNVX(const VULKAN_HPP_NAMESPACE::ImageViewHandleInfoNVX &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetImageViewHandleNVX && "Function <vkGetImageViewHandleNVX> needs extension <VK_NVX_image_view_handle> enabled!");

	return getDispatcher()->vkGetImageViewHandleNVX(static_cast<VkDevice>(m_device), reinterpret_cast<const VkImageViewHandleInfoNVX *>(&info));
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ImageViewAddressPropertiesNVX ImageView::getAddressNVX() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetImageViewAddressNVX &&
	                  "Function <vkGetImageViewAddressNVX> needs extension <VK_NVX_image_view_handle> enabled!");

	VULKAN_HPP_NAMESPACE::ImageViewAddressPropertiesNVX properties;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetImageViewAddressNVX(
	    static_cast<VkDevice>(m_device), static_cast<VkImageView>(m_imageView), reinterpret_cast<VkImageViewAddressPropertiesNVX *>(&properties)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::ImageView::getAddressNVX");
	}
	return properties;
}

//=== VK_AMD_draw_indirect_count ===

VULKAN_HPP_INLINE void CommandBuffer::drawIndirectCountAMD(VULKAN_HPP_NAMESPACE::Buffer buffer,
                                                           VULKAN_HPP_NAMESPACE::DeviceSize offset,
                                                           VULKAN_HPP_NAMESPACE::Buffer countBuffer,
                                                           VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,
                                                           uint32_t maxDrawCount,
                                                           uint32_t stride) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdDrawIndirectCountAMD &&
	                  "Function <vkCmdDrawIndirectCountAMD> needs extension <VK_AMD_draw_indirect_count> enabled!");

	getDispatcher()->vkCmdDrawIndirectCountAMD(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                           static_cast<VkBuffer>(buffer),
	                                           static_cast<VkDeviceSize>(offset),
	                                           static_cast<VkBuffer>(countBuffer),
	                                           static_cast<VkDeviceSize>(countBufferOffset),
	                                           maxDrawCount,
	                                           stride);
}

VULKAN_HPP_INLINE void CommandBuffer::drawIndexedIndirectCountAMD(VULKAN_HPP_NAMESPACE::Buffer buffer,
                                                                  VULKAN_HPP_NAMESPACE::DeviceSize offset,
                                                                  VULKAN_HPP_NAMESPACE::Buffer countBuffer,
                                                                  VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,
                                                                  uint32_t maxDrawCount,
                                                                  uint32_t stride) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdDrawIndexedIndirectCountAMD &&
	                  "Function <vkCmdDrawIndexedIndirectCountAMD> needs extension <VK_AMD_draw_indirect_count> enabled!");

	getDispatcher()->vkCmdDrawIndexedIndirectCountAMD(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                                  static_cast<VkBuffer>(buffer),
	                                                  static_cast<VkDeviceSize>(offset),
	                                                  static_cast<VkBuffer>(countBuffer),
	                                                  static_cast<VkDeviceSize>(countBufferOffset),
	                                                  maxDrawCount,
	                                                  stride);
}

//=== VK_AMD_shader_info ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<uint8_t> Pipeline::getShaderInfoAMD(VULKAN_HPP_NAMESPACE::ShaderStageFlagBits shaderStage,
                                                                                       VULKAN_HPP_NAMESPACE::ShaderInfoTypeAMD infoType) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetShaderInfoAMD && "Function <vkGetShaderInfoAMD> needs extension <VK_AMD_shader_info> enabled!");

	std::vector<uint8_t> info;
	size_t infoSize;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetShaderInfoAMD(static_cast<VkDevice>(m_device),
		                                                                                       static_cast<VkPipeline>(m_pipeline),
		                                                                                       static_cast<VkShaderStageFlagBits>(shaderStage),
		                                                                                       static_cast<VkShaderInfoTypeAMD>(infoType),
		                                                                                       &infoSize,
		                                                                                       nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && infoSize)
		{
			info.resize(infoSize);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetShaderInfoAMD(static_cast<VkDevice>(m_device),
			                                                                                       static_cast<VkPipeline>(m_pipeline),
			                                                                                       static_cast<VkShaderStageFlagBits>(shaderStage),
			                                                                                       static_cast<VkShaderInfoTypeAMD>(infoType),
			                                                                                       &infoSize,
			                                                                                       reinterpret_cast<void *>(info.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Pipeline::getShaderInfoAMD");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(infoSize <= info.size());
		if(infoSize < info.size())
		{
			info.resize(infoSize);
		}
	}
	return info;
}

//=== VK_KHR_dynamic_rendering ===

VULKAN_HPP_INLINE void CommandBuffer::beginRenderingKHR(const VULKAN_HPP_NAMESPACE::RenderingInfo &renderingInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdBeginRenderingKHR && "Function <vkCmdBeginRenderingKHR> needs extension <VK_KHR_dynamic_rendering> enabled!");

	getDispatcher()->vkCmdBeginRenderingKHR(static_cast<VkCommandBuffer>(m_commandBuffer), reinterpret_cast<const VkRenderingInfo *>(&renderingInfo));
}

VULKAN_HPP_INLINE void CommandBuffer::endRenderingKHR() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdEndRenderingKHR && "Function <vkCmdEndRenderingKHR> needs extension <VK_KHR_dynamic_rendering> enabled!");

	getDispatcher()->vkCmdEndRenderingKHR(static_cast<VkCommandBuffer>(m_commandBuffer));
}

#	if defined(VK_USE_PLATFORM_GGP)
//=== VK_GGP_stream_descriptor_surface ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
Instance::createStreamDescriptorSurfaceGGP(VULKAN_HPP_NAMESPACE::StreamDescriptorSurfaceCreateInfoGGP const &createInfo,
                                           VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR(*this, createInfo, allocator);
}
#	endif /*VK_USE_PLATFORM_GGP*/

//=== VK_NV_external_memory_capabilities ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ExternalImageFormatPropertiesNV
PhysicalDevice::getExternalImageFormatPropertiesNV(VULKAN_HPP_NAMESPACE::Format format,
                                                   VULKAN_HPP_NAMESPACE::ImageType type,
                                                   VULKAN_HPP_NAMESPACE::ImageTiling tiling,
                                                   VULKAN_HPP_NAMESPACE::ImageUsageFlags usage,
                                                   VULKAN_HPP_NAMESPACE::ImageCreateFlags flags,
                                                   VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV externalHandleType) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceExternalImageFormatPropertiesNV &&
	                  "Function <vkGetPhysicalDeviceExternalImageFormatPropertiesNV> needs extension <VK_NV_external_memory_capabilities> enabled!");

	VULKAN_HPP_NAMESPACE::ExternalImageFormatPropertiesNV externalImageFormatProperties;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
	    static_cast<VkPhysicalDevice>(m_physicalDevice),
	    static_cast<VkFormat>(format),
	    static_cast<VkImageType>(type),
	    static_cast<VkImageTiling>(tiling),
	    static_cast<VkImageUsageFlags>(usage),
	    static_cast<VkImageCreateFlags>(flags),
	    static_cast<VkExternalMemoryHandleTypeFlagsNV>(externalHandleType),
	    reinterpret_cast<VkExternalImageFormatPropertiesNV *>(&externalImageFormatProperties)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getExternalImageFormatPropertiesNV");
	}
	return externalImageFormatProperties;
}

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
//=== VK_NV_external_memory_win32 ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE HANDLE DeviceMemory::getMemoryWin32HandleNV(VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV handleType) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetMemoryWin32HandleNV &&
	                  "Function <vkGetMemoryWin32HandleNV> needs extension <VK_NV_external_memory_win32> enabled!");

	HANDLE handle;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetMemoryWin32HandleNV(
	    static_cast<VkDevice>(m_device), static_cast<VkDeviceMemory>(m_memory), static_cast<VkExternalMemoryHandleTypeFlagsNV>(handleType), &handle));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::DeviceMemory::getMemoryWin32HandleNV");
	}
	return handle;
}
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

//=== VK_KHR_get_physical_device_properties2 ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 PhysicalDevice::getFeatures2KHR() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceFeatures2KHR &&
	                  "Function <vkGetPhysicalDeviceFeatures2KHR> needs extension <VK_KHR_get_physical_device_properties2> enabled!");

	VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 features;
	getDispatcher()->vkGetPhysicalDeviceFeatures2KHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                 reinterpret_cast<VkPhysicalDeviceFeatures2 *>(&features));
	return features;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...> PhysicalDevice::getFeatures2KHR() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceFeatures2KHR &&
	                  "Function <vkGetPhysicalDeviceFeatures2KHR> needs extension <VK_KHR_get_physical_device_properties2> enabled!");

	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 &features = structureChain.template get<VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2>();
	getDispatcher()->vkGetPhysicalDeviceFeatures2KHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                 reinterpret_cast<VkPhysicalDeviceFeatures2 *>(&features));
	return structureChain;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 PhysicalDevice::getProperties2KHR() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceProperties2KHR &&
	                  "Function <vkGetPhysicalDeviceProperties2KHR> needs extension <VK_KHR_get_physical_device_properties2> enabled!");

	VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 properties;
	getDispatcher()->vkGetPhysicalDeviceProperties2KHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                   reinterpret_cast<VkPhysicalDeviceProperties2 *>(&properties));
	return properties;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...> PhysicalDevice::getProperties2KHR() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceProperties2KHR &&
	                  "Function <vkGetPhysicalDeviceProperties2KHR> needs extension <VK_KHR_get_physical_device_properties2> enabled!");

	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 &properties = structureChain.template get<VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2>();
	getDispatcher()->vkGetPhysicalDeviceProperties2KHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                   reinterpret_cast<VkPhysicalDeviceProperties2 *>(&properties));
	return structureChain;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::FormatProperties2
PhysicalDevice::getFormatProperties2KHR(VULKAN_HPP_NAMESPACE::Format format) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceFormatProperties2KHR &&
	                  "Function <vkGetPhysicalDeviceFormatProperties2KHR> needs extension <VK_KHR_get_physical_device_properties2> enabled!");

	VULKAN_HPP_NAMESPACE::FormatProperties2 formatProperties;
	getDispatcher()->vkGetPhysicalDeviceFormatProperties2KHR(
	    static_cast<VkPhysicalDevice>(m_physicalDevice), static_cast<VkFormat>(format), reinterpret_cast<VkFormatProperties2 *>(&formatProperties));
	return formatProperties;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...>
PhysicalDevice::getFormatProperties2KHR(VULKAN_HPP_NAMESPACE::Format format) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceFormatProperties2KHR &&
	                  "Function <vkGetPhysicalDeviceFormatProperties2KHR> needs extension <VK_KHR_get_physical_device_properties2> enabled!");

	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::FormatProperties2 &formatProperties = structureChain.template get<VULKAN_HPP_NAMESPACE::FormatProperties2>();
	getDispatcher()->vkGetPhysicalDeviceFormatProperties2KHR(
	    static_cast<VkPhysicalDevice>(m_physicalDevice), static_cast<VkFormat>(format), reinterpret_cast<VkFormatProperties2 *>(&formatProperties));
	return structureChain;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ImageFormatProperties2
PhysicalDevice::getImageFormatProperties2KHR(const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 &imageFormatInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceImageFormatProperties2KHR &&
	                  "Function <vkGetPhysicalDeviceImageFormatProperties2KHR> needs extension <VK_KHR_get_physical_device_properties2> enabled!");

	VULKAN_HPP_NAMESPACE::ImageFormatProperties2 imageFormatProperties;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetPhysicalDeviceImageFormatProperties2KHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                                  reinterpret_cast<const VkPhysicalDeviceImageFormatInfo2 *>(&imageFormatInfo),
	                                                                  reinterpret_cast<VkImageFormatProperties2 *>(&imageFormatProperties)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getImageFormatProperties2KHR");
	}
	return imageFormatProperties;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...>
PhysicalDevice::getImageFormatProperties2KHR(const VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 &imageFormatInfo) const
{
	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::ImageFormatProperties2 &imageFormatProperties = structureChain.template get<VULKAN_HPP_NAMESPACE::ImageFormatProperties2>();
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetPhysicalDeviceImageFormatProperties2KHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                                  reinterpret_cast<const VkPhysicalDeviceImageFormatInfo2 *>(&imageFormatInfo),
	                                                                  reinterpret_cast<VkImageFormatProperties2 *>(&imageFormatProperties)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getImageFormatProperties2KHR");
	}
	return structureChain;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>
PhysicalDevice::getQueueFamilyProperties2KHR() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties2KHR &&
	                  "Function <vkGetPhysicalDeviceQueueFamilyProperties2KHR> needs extension <VK_KHR_get_physical_device_properties2> enabled!");

	uint32_t queueFamilyPropertyCount;
	getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties2KHR(static_cast<VkPhysicalDevice>(m_physicalDevice), &queueFamilyPropertyCount, nullptr);
	std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2> queueFamilyProperties(queueFamilyPropertyCount);
	getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties2KHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                              &queueFamilyPropertyCount,
	                                                              reinterpret_cast<VkQueueFamilyProperties2 *>(queueFamilyProperties.data()));
	VULKAN_HPP_ASSERT(queueFamilyPropertyCount == queueFamilyProperties.size());
	return queueFamilyProperties;
}

template<typename StructureChain>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<StructureChain> PhysicalDevice::getQueueFamilyProperties2KHR() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties2KHR &&
	                  "Function <vkGetPhysicalDeviceQueueFamilyProperties2KHR> needs extension <VK_KHR_get_physical_device_properties2> enabled!");

	uint32_t queueFamilyPropertyCount;
	getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties2KHR(static_cast<VkPhysicalDevice>(m_physicalDevice), &queueFamilyPropertyCount, nullptr);
	std::vector<StructureChain> returnVector(queueFamilyPropertyCount);
	std::vector<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2> queueFamilyProperties(queueFamilyPropertyCount);
	for(uint32_t i = 0; i < queueFamilyPropertyCount; i++)
	{
		queueFamilyProperties[i].pNext = returnVector[i].template get<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>().pNext;
	}
	getDispatcher()->vkGetPhysicalDeviceQueueFamilyProperties2KHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                              &queueFamilyPropertyCount,
	                                                              reinterpret_cast<VkQueueFamilyProperties2 *>(queueFamilyProperties.data()));
	VULKAN_HPP_ASSERT(queueFamilyPropertyCount <= queueFamilyProperties.size());
	for(uint32_t i = 0; i < queueFamilyPropertyCount; i++)
	{
		returnVector[i].template get<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>() = queueFamilyProperties[i];
	}
	return returnVector;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2
PhysicalDevice::getMemoryProperties2KHR() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceMemoryProperties2KHR &&
	                  "Function <vkGetPhysicalDeviceMemoryProperties2KHR> needs extension <VK_KHR_get_physical_device_properties2> enabled!");

	VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 memoryProperties;
	getDispatcher()->vkGetPhysicalDeviceMemoryProperties2KHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                         reinterpret_cast<VkPhysicalDeviceMemoryProperties2 *>(&memoryProperties));
	return memoryProperties;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...> PhysicalDevice::getMemoryProperties2KHR() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceMemoryProperties2KHR &&
	                  "Function <vkGetPhysicalDeviceMemoryProperties2KHR> needs extension <VK_KHR_get_physical_device_properties2> enabled!");

	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 &memoryProperties =
	    structureChain.template get<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2>();
	getDispatcher()->vkGetPhysicalDeviceMemoryProperties2KHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                         reinterpret_cast<VkPhysicalDeviceMemoryProperties2 *>(&memoryProperties));
	return structureChain;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2> PhysicalDevice::getSparseImageFormatProperties2KHR(
    const VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2 &formatInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceSparseImageFormatProperties2KHR &&
	                  "Function <vkGetPhysicalDeviceSparseImageFormatProperties2KHR> needs extension <VK_KHR_get_physical_device_properties2> enabled!");

	uint32_t propertyCount;
	getDispatcher()->vkGetPhysicalDeviceSparseImageFormatProperties2KHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                                    reinterpret_cast<const VkPhysicalDeviceSparseImageFormatInfo2 *>(&formatInfo),
	                                                                    &propertyCount,
	                                                                    nullptr);
	std::vector<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2> properties(propertyCount);
	getDispatcher()->vkGetPhysicalDeviceSparseImageFormatProperties2KHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                                    reinterpret_cast<const VkPhysicalDeviceSparseImageFormatInfo2 *>(&formatInfo),
	                                                                    &propertyCount,
	                                                                    reinterpret_cast<VkSparseImageFormatProperties2 *>(properties.data()));
	VULKAN_HPP_ASSERT(propertyCount == properties.size());
	return properties;
}

//=== VK_KHR_device_group ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags
Device::getGroupPeerMemoryFeaturesKHR(uint32_t heapIndex, uint32_t localDeviceIndex, uint32_t remoteDeviceIndex) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetDeviceGroupPeerMemoryFeaturesKHR &&
	                  "Function <vkGetDeviceGroupPeerMemoryFeaturesKHR> needs extension <VK_KHR_device_group> enabled!");

	VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags peerMemoryFeatures;
	getDispatcher()->vkGetDeviceGroupPeerMemoryFeaturesKHR(static_cast<VkDevice>(m_device),
	                                                       heapIndex,
	                                                       localDeviceIndex,
	                                                       remoteDeviceIndex,
	                                                       reinterpret_cast<VkPeerMemoryFeatureFlags *>(&peerMemoryFeatures));
	return peerMemoryFeatures;
}

VULKAN_HPP_INLINE void CommandBuffer::setDeviceMaskKHR(uint32_t deviceMask) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetDeviceMaskKHR && "Function <vkCmdSetDeviceMaskKHR> needs extension <VK_KHR_device_group> enabled!");

	getDispatcher()->vkCmdSetDeviceMaskKHR(static_cast<VkCommandBuffer>(m_commandBuffer), deviceMask);
}

VULKAN_HPP_INLINE void CommandBuffer::dispatchBaseKHR(uint32_t baseGroupX,
                                                      uint32_t baseGroupY,
                                                      uint32_t baseGroupZ,
                                                      uint32_t groupCountX,
                                                      uint32_t groupCountY,
                                                      uint32_t groupCountZ) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdDispatchBaseKHR && "Function <vkCmdDispatchBaseKHR> needs extension <VK_KHR_device_group> enabled!");

	getDispatcher()->vkCmdDispatchBaseKHR(
	    static_cast<VkCommandBuffer>(m_commandBuffer), baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
}

#	if defined(VK_USE_PLATFORM_VI_NN)
//=== VK_NN_vi_surface ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
Instance::createViSurfaceNN(VULKAN_HPP_NAMESPACE::ViSurfaceCreateInfoNN const &createInfo,
                            VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR(*this, createInfo, allocator);
}
#	endif /*VK_USE_PLATFORM_VI_NN*/

//=== VK_KHR_maintenance1 ===

VULKAN_HPP_INLINE void CommandPool::trimKHR(VULKAN_HPP_NAMESPACE::CommandPoolTrimFlags flags) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkTrimCommandPoolKHR && "Function <vkTrimCommandPoolKHR> needs extension <VK_KHR_maintenance1> enabled!");

	getDispatcher()->vkTrimCommandPoolKHR(
	    static_cast<VkDevice>(m_device), static_cast<VkCommandPool>(m_commandPool), static_cast<VkCommandPoolTrimFlags>(flags));
}

//=== VK_KHR_device_group_creation ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties> Instance::enumeratePhysicalDeviceGroupsKHR() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkEnumeratePhysicalDeviceGroupsKHR &&
	                  "Function <vkEnumeratePhysicalDeviceGroupsKHR> needs extension <VK_KHR_device_group_creation> enabled!");

	std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties> physicalDeviceGroupProperties;
	uint32_t physicalDeviceGroupCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    getDispatcher()->vkEnumeratePhysicalDeviceGroupsKHR(static_cast<VkInstance>(m_instance), &physicalDeviceGroupCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && physicalDeviceGroupCount)
		{
			physicalDeviceGroupProperties.resize(physicalDeviceGroupCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkEnumeratePhysicalDeviceGroupsKHR(
			    static_cast<VkInstance>(m_instance),
			    &physicalDeviceGroupCount,
			    reinterpret_cast<VkPhysicalDeviceGroupProperties *>(physicalDeviceGroupProperties.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Instance::enumeratePhysicalDeviceGroupsKHR");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(physicalDeviceGroupCount <= physicalDeviceGroupProperties.size());
		if(physicalDeviceGroupCount < physicalDeviceGroupProperties.size())
		{
			physicalDeviceGroupProperties.resize(physicalDeviceGroupCount);
		}
	}
	return physicalDeviceGroupProperties;
}

//=== VK_KHR_external_memory_capabilities ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ExternalBufferProperties PhysicalDevice::getExternalBufferPropertiesKHR(
    const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalBufferInfo &externalBufferInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceExternalBufferPropertiesKHR &&
	                  "Function <vkGetPhysicalDeviceExternalBufferPropertiesKHR> needs extension <VK_KHR_external_memory_capabilities> enabled!");

	VULKAN_HPP_NAMESPACE::ExternalBufferProperties externalBufferProperties;
	getDispatcher()->vkGetPhysicalDeviceExternalBufferPropertiesKHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                                reinterpret_cast<const VkPhysicalDeviceExternalBufferInfo *>(&externalBufferInfo),
	                                                                reinterpret_cast<VkExternalBufferProperties *>(&externalBufferProperties));
	return externalBufferProperties;
}

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
//=== VK_KHR_external_memory_win32 ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE HANDLE
Device::getMemoryWin32HandleKHR(const VULKAN_HPP_NAMESPACE::MemoryGetWin32HandleInfoKHR &getWin32HandleInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetMemoryWin32HandleKHR &&
	                  "Function <vkGetMemoryWin32HandleKHR> needs extension <VK_KHR_external_memory_win32> enabled!");

	HANDLE handle;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetMemoryWin32HandleKHR(
	    static_cast<VkDevice>(m_device), reinterpret_cast<const VkMemoryGetWin32HandleInfoKHR *>(&getWin32HandleInfo), &handle));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getMemoryWin32HandleKHR");
	}
	return handle;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryWin32HandlePropertiesKHR
Device::getMemoryWin32HandlePropertiesKHR(VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType, HANDLE handle) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetMemoryWin32HandlePropertiesKHR &&
	                  "Function <vkGetMemoryWin32HandlePropertiesKHR> needs extension <VK_KHR_external_memory_win32> enabled!");

	VULKAN_HPP_NAMESPACE::MemoryWin32HandlePropertiesKHR memoryWin32HandleProperties;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetMemoryWin32HandlePropertiesKHR(static_cast<VkDevice>(m_device),
	                                                         static_cast<VkExternalMemoryHandleTypeFlagBits>(handleType),
	                                                         handle,
	                                                         reinterpret_cast<VkMemoryWin32HandlePropertiesKHR *>(&memoryWin32HandleProperties)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getMemoryWin32HandlePropertiesKHR");
	}
	return memoryWin32HandleProperties;
}
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

//=== VK_KHR_external_memory_fd ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE int Device::getMemoryFdKHR(const VULKAN_HPP_NAMESPACE::MemoryGetFdInfoKHR &getFdInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetMemoryFdKHR && "Function <vkGetMemoryFdKHR> needs extension <VK_KHR_external_memory_fd> enabled!");

	int fd;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetMemoryFdKHR(static_cast<VkDevice>(m_device), reinterpret_cast<const VkMemoryGetFdInfoKHR *>(&getFdInfo), &fd));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getMemoryFdKHR");
	}
	return fd;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryFdPropertiesKHR
Device::getMemoryFdPropertiesKHR(VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType, int fd) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetMemoryFdPropertiesKHR &&
	                  "Function <vkGetMemoryFdPropertiesKHR> needs extension <VK_KHR_external_memory_fd> enabled!");

	VULKAN_HPP_NAMESPACE::MemoryFdPropertiesKHR memoryFdProperties;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetMemoryFdPropertiesKHR(static_cast<VkDevice>(m_device),
	                                                static_cast<VkExternalMemoryHandleTypeFlagBits>(handleType),
	                                                fd,
	                                                reinterpret_cast<VkMemoryFdPropertiesKHR *>(&memoryFdProperties)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getMemoryFdPropertiesKHR");
	}
	return memoryFdProperties;
}

//=== VK_KHR_external_semaphore_capabilities ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties PhysicalDevice::getExternalSemaphorePropertiesKHR(
    const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalSemaphoreInfo &externalSemaphoreInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceExternalSemaphorePropertiesKHR &&
	                  "Function <vkGetPhysicalDeviceExternalSemaphorePropertiesKHR> needs extension <VK_KHR_external_semaphore_capabilities> enabled!");

	VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties externalSemaphoreProperties;
	getDispatcher()->vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(
	    static_cast<VkPhysicalDevice>(m_physicalDevice),
	    reinterpret_cast<const VkPhysicalDeviceExternalSemaphoreInfo *>(&externalSemaphoreInfo),
	    reinterpret_cast<VkExternalSemaphoreProperties *>(&externalSemaphoreProperties));
	return externalSemaphoreProperties;
}

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
//=== VK_KHR_external_semaphore_win32 ===

VULKAN_HPP_INLINE void
Device::importSemaphoreWin32HandleKHR(const VULKAN_HPP_NAMESPACE::ImportSemaphoreWin32HandleInfoKHR &importSemaphoreWin32HandleInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkImportSemaphoreWin32HandleKHR &&
	                  "Function <vkImportSemaphoreWin32HandleKHR> needs extension <VK_KHR_external_semaphore_win32> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkImportSemaphoreWin32HandleKHR(
	    static_cast<VkDevice>(m_device), reinterpret_cast<const VkImportSemaphoreWin32HandleInfoKHR *>(&importSemaphoreWin32HandleInfo)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::importSemaphoreWin32HandleKHR");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE HANDLE
Device::getSemaphoreWin32HandleKHR(const VULKAN_HPP_NAMESPACE::SemaphoreGetWin32HandleInfoKHR &getWin32HandleInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetSemaphoreWin32HandleKHR &&
	                  "Function <vkGetSemaphoreWin32HandleKHR> needs extension <VK_KHR_external_semaphore_win32> enabled!");

	HANDLE handle;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetSemaphoreWin32HandleKHR(
	    static_cast<VkDevice>(m_device), reinterpret_cast<const VkSemaphoreGetWin32HandleInfoKHR *>(&getWin32HandleInfo), &handle));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getSemaphoreWin32HandleKHR");
	}
	return handle;
}
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

//=== VK_KHR_external_semaphore_fd ===

VULKAN_HPP_INLINE void Device::importSemaphoreFdKHR(const VULKAN_HPP_NAMESPACE::ImportSemaphoreFdInfoKHR &importSemaphoreFdInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkImportSemaphoreFdKHR &&
	                  "Function <vkImportSemaphoreFdKHR> needs extension <VK_KHR_external_semaphore_fd> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkImportSemaphoreFdKHR(
	    static_cast<VkDevice>(m_device), reinterpret_cast<const VkImportSemaphoreFdInfoKHR *>(&importSemaphoreFdInfo)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::importSemaphoreFdKHR");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE int Device::getSemaphoreFdKHR(const VULKAN_HPP_NAMESPACE::SemaphoreGetFdInfoKHR &getFdInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetSemaphoreFdKHR && "Function <vkGetSemaphoreFdKHR> needs extension <VK_KHR_external_semaphore_fd> enabled!");

	int fd;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetSemaphoreFdKHR(static_cast<VkDevice>(m_device), reinterpret_cast<const VkSemaphoreGetFdInfoKHR *>(&getFdInfo), &fd));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getSemaphoreFdKHR");
	}
	return fd;
}

//=== VK_KHR_push_descriptor ===

VULKAN_HPP_INLINE void
CommandBuffer::pushDescriptorSetKHR(VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint,
                                    VULKAN_HPP_NAMESPACE::PipelineLayout layout,
                                    uint32_t set,
                                    ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteDescriptorSet> const &descriptorWrites) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdPushDescriptorSetKHR &&
	                  "Function <vkCmdPushDescriptorSetKHR> needs extension <VK_KHR_push_descriptor> enabled!");

	getDispatcher()->vkCmdPushDescriptorSetKHR(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                           static_cast<VkPipelineBindPoint>(pipelineBindPoint),
	                                           static_cast<VkPipelineLayout>(layout),
	                                           set,
	                                           descriptorWrites.size(),
	                                           reinterpret_cast<const VkWriteDescriptorSet *>(descriptorWrites.data()));
}

template<typename DataType>
VULKAN_HPP_INLINE void CommandBuffer::pushDescriptorSetWithTemplateKHR(VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,
                                                                       VULKAN_HPP_NAMESPACE::PipelineLayout layout,
                                                                       uint32_t set,
                                                                       DataType const &data) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdPushDescriptorSetWithTemplateKHR &&
	                  "Function <vkCmdPushDescriptorSetWithTemplateKHR> needs extension <VK_KHR_push_descriptor> enabled!");

	getDispatcher()->vkCmdPushDescriptorSetWithTemplateKHR(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                                       static_cast<VkDescriptorUpdateTemplate>(descriptorUpdateTemplate),
	                                                       static_cast<VkPipelineLayout>(layout),
	                                                       set,
	                                                       reinterpret_cast<const void *>(&data));
}

//=== VK_EXT_conditional_rendering ===

VULKAN_HPP_INLINE void CommandBuffer::beginConditionalRenderingEXT(
    const VULKAN_HPP_NAMESPACE::ConditionalRenderingBeginInfoEXT &conditionalRenderingBegin) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdBeginConditionalRenderingEXT &&
	                  "Function <vkCmdBeginConditionalRenderingEXT> needs extension <VK_EXT_conditional_rendering> enabled!");

	getDispatcher()->vkCmdBeginConditionalRenderingEXT(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                                   reinterpret_cast<const VkConditionalRenderingBeginInfoEXT *>(&conditionalRenderingBegin));
}

VULKAN_HPP_INLINE void CommandBuffer::endConditionalRenderingEXT() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdEndConditionalRenderingEXT &&
	                  "Function <vkCmdEndConditionalRenderingEXT> needs extension <VK_EXT_conditional_rendering> enabled!");

	getDispatcher()->vkCmdEndConditionalRenderingEXT(static_cast<VkCommandBuffer>(m_commandBuffer));
}

//=== VK_KHR_descriptor_update_template ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::DescriptorUpdateTemplate
Device::createDescriptorUpdateTemplateKHR(VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo const &createInfo,
                                          VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::DescriptorUpdateTemplate(*this, createInfo, allocator);
}

VULKAN_HPP_INLINE void
Device::destroyDescriptorUpdateTemplateKHR(VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,
                                           Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkDestroyDescriptorUpdateTemplateKHR &&
	                  "Function <vkDestroyDescriptorUpdateTemplateKHR> needs extension <VK_KHR_descriptor_update_template> enabled!");

	getDispatcher()->vkDestroyDescriptorUpdateTemplateKHR(
	    static_cast<VkDevice>(m_device),
	    static_cast<VkDescriptorUpdateTemplate>(descriptorUpdateTemplate),
	    reinterpret_cast<const VkAllocationCallbacks *>(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator)));
}

template<typename DataType>
VULKAN_HPP_INLINE void DescriptorSet::updateWithTemplateKHR(VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate,
                                                            DataType const &data) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkUpdateDescriptorSetWithTemplateKHR &&
	                  "Function <vkUpdateDescriptorSetWithTemplateKHR> needs extension <VK_KHR_descriptor_update_template> enabled!");

	getDispatcher()->vkUpdateDescriptorSetWithTemplateKHR(static_cast<VkDevice>(m_device),
	                                                      static_cast<VkDescriptorSet>(m_descriptorSet),
	                                                      static_cast<VkDescriptorUpdateTemplate>(descriptorUpdateTemplate),
	                                                      reinterpret_cast<const void *>(&data));
}

//=== VK_NV_clip_space_w_scaling ===

VULKAN_HPP_INLINE void
CommandBuffer::setViewportWScalingNV(uint32_t firstViewport,
                                     ArrayProxy<const VULKAN_HPP_NAMESPACE::ViewportWScalingNV> const &viewportWScalings) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetViewportWScalingNV &&
	                  "Function <vkCmdSetViewportWScalingNV> needs extension <VK_NV_clip_space_w_scaling> enabled!");

	getDispatcher()->vkCmdSetViewportWScalingNV(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                            firstViewport,
	                                            viewportWScalings.size(),
	                                            reinterpret_cast<const VkViewportWScalingNV *>(viewportWScalings.data()));
}

#	if defined(VK_USE_PLATFORM_XLIB_XRANDR_EXT)
//=== VK_EXT_acquire_xlib_display ===

VULKAN_HPP_INLINE void PhysicalDevice::acquireXlibDisplayEXT(Display &dpy, VULKAN_HPP_NAMESPACE::DisplayKHR display) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkAcquireXlibDisplayEXT &&
	                  "Function <vkAcquireXlibDisplayEXT> needs extension <VK_EXT_acquire_xlib_display> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkAcquireXlibDisplayEXT(static_cast<VkPhysicalDevice>(m_physicalDevice), &dpy, static_cast<VkDisplayKHR>(display)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::acquireXlibDisplayEXT");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::DisplayKHR PhysicalDevice::getRandROutputDisplayEXT(Display &dpy,
                                                                                                                      RROutput rrOutput) const
{
	return VULKAN_HPP_RAII_NAMESPACE::DisplayKHR(*this, dpy, rrOutput);
}
#	endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/

//=== VK_EXT_display_surface_counter ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::SurfaceCapabilities2EXT
PhysicalDevice::getSurfaceCapabilities2EXT(VULKAN_HPP_NAMESPACE::SurfaceKHR surface) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceSurfaceCapabilities2EXT &&
	                  "Function <vkGetPhysicalDeviceSurfaceCapabilities2EXT> needs extension <VK_EXT_display_surface_counter> enabled!");

	VULKAN_HPP_NAMESPACE::SurfaceCapabilities2EXT surfaceCapabilities;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetPhysicalDeviceSurfaceCapabilities2EXT(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                                static_cast<VkSurfaceKHR>(surface),
	                                                                reinterpret_cast<VkSurfaceCapabilities2EXT *>(&surfaceCapabilities)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getSurfaceCapabilities2EXT");
	}
	return surfaceCapabilities;
}

//=== VK_EXT_display_control ===

VULKAN_HPP_INLINE void Device::displayPowerControlEXT(VULKAN_HPP_NAMESPACE::DisplayKHR display,
                                                      const VULKAN_HPP_NAMESPACE::DisplayPowerInfoEXT &displayPowerInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkDisplayPowerControlEXT && "Function <vkDisplayPowerControlEXT> needs extension <VK_EXT_display_control> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkDisplayPowerControlEXT(
	    static_cast<VkDevice>(m_device), static_cast<VkDisplayKHR>(display), reinterpret_cast<const VkDisplayPowerInfoEXT *>(&displayPowerInfo)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::displayPowerControlEXT");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::Fence
Device::registerEventEXT(VULKAN_HPP_NAMESPACE::DeviceEventInfoEXT const &deviceEventInfo,
                         VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::Fence(*this, deviceEventInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::Fence
Device::registerDisplayEventEXT(VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DisplayKHR const &display,
                                VULKAN_HPP_NAMESPACE::DisplayEventInfoEXT const &displayEventInfo,
                                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::Fence(*this, display, displayEventInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint64_t SwapchainKHR::getCounterEXT(VULKAN_HPP_NAMESPACE::SurfaceCounterFlagBitsEXT counter) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetSwapchainCounterEXT && "Function <vkGetSwapchainCounterEXT> needs extension <VK_EXT_display_control> enabled!");

	uint64_t counterValue;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetSwapchainCounterEXT(
	    static_cast<VkDevice>(m_device), static_cast<VkSwapchainKHR>(m_swapchain), static_cast<VkSurfaceCounterFlagBitsEXT>(counter), &counterValue));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::SwapchainKHR::getCounterEXT");
	}
	return counterValue;
}

//=== VK_GOOGLE_display_timing ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::RefreshCycleDurationGOOGLE SwapchainKHR::getRefreshCycleDurationGOOGLE() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetRefreshCycleDurationGOOGLE &&
	                  "Function <vkGetRefreshCycleDurationGOOGLE> needs extension <VK_GOOGLE_display_timing> enabled!");

	VULKAN_HPP_NAMESPACE::RefreshCycleDurationGOOGLE displayTimingProperties;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetRefreshCycleDurationGOOGLE(static_cast<VkDevice>(m_device),
	                                                     static_cast<VkSwapchainKHR>(m_swapchain),
	                                                     reinterpret_cast<VkRefreshCycleDurationGOOGLE *>(&displayTimingProperties)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::SwapchainKHR::getRefreshCycleDurationGOOGLE");
	}
	return displayTimingProperties;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE> SwapchainKHR::getPastPresentationTimingGOOGLE() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPastPresentationTimingGOOGLE &&
	                  "Function <vkGetPastPresentationTimingGOOGLE> needs extension <VK_GOOGLE_display_timing> enabled!");

	std::vector<VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE> presentationTimings;
	uint32_t presentationTimingCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetPastPresentationTimingGOOGLE(
		    static_cast<VkDevice>(m_device), static_cast<VkSwapchainKHR>(m_swapchain), &presentationTimingCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && presentationTimingCount)
		{
			presentationTimings.resize(presentationTimingCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
			    getDispatcher()->vkGetPastPresentationTimingGOOGLE(static_cast<VkDevice>(m_device),
			                                                       static_cast<VkSwapchainKHR>(m_swapchain),
			                                                       &presentationTimingCount,
			                                                       reinterpret_cast<VkPastPresentationTimingGOOGLE *>(presentationTimings.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::SwapchainKHR::getPastPresentationTimingGOOGLE");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(presentationTimingCount <= presentationTimings.size());
		if(presentationTimingCount < presentationTimings.size())
		{
			presentationTimings.resize(presentationTimingCount);
		}
	}
	return presentationTimings;
}

//=== VK_EXT_discard_rectangles ===

VULKAN_HPP_INLINE void
CommandBuffer::setDiscardRectangleEXT(uint32_t firstDiscardRectangle,
                                      ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const &discardRectangles) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetDiscardRectangleEXT &&
	                  "Function <vkCmdSetDiscardRectangleEXT> needs extension <VK_EXT_discard_rectangles> enabled!");

	getDispatcher()->vkCmdSetDiscardRectangleEXT(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                             firstDiscardRectangle,
	                                             discardRectangles.size(),
	                                             reinterpret_cast<const VkRect2D *>(discardRectangles.data()));
}

//=== VK_EXT_hdr_metadata ===

VULKAN_HPP_INLINE void Device::setHdrMetadataEXT(ArrayProxy<const VULKAN_HPP_NAMESPACE::SwapchainKHR> const &swapchains,
                                                 ArrayProxy<const VULKAN_HPP_NAMESPACE::HdrMetadataEXT> const &metadata) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkSetHdrMetadataEXT && "Function <vkSetHdrMetadataEXT> needs extension <VK_EXT_hdr_metadata> enabled!");

	if(swapchains.size() != metadata.size())
	{
		throw LogicError(VULKAN_HPP_NAMESPACE_STRING "::Device::setHdrMetadataEXT: swapchains.size() != metadata.size()");
	}
	getDispatcher()->vkSetHdrMetadataEXT(static_cast<VkDevice>(m_device),
	                                     swapchains.size(),
	                                     reinterpret_cast<const VkSwapchainKHR *>(swapchains.data()),
	                                     reinterpret_cast<const VkHdrMetadataEXT *>(metadata.data()));
}

//=== VK_KHR_create_renderpass2 ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::RenderPass
Device::createRenderPass2KHR(VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 const &createInfo,
                             VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::RenderPass(*this, createInfo, allocator);
}

VULKAN_HPP_INLINE void CommandBuffer::beginRenderPass2KHR(const VULKAN_HPP_NAMESPACE::RenderPassBeginInfo &renderPassBegin,
                                                          const VULKAN_HPP_NAMESPACE::SubpassBeginInfo &subpassBeginInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdBeginRenderPass2KHR &&
	                  "Function <vkCmdBeginRenderPass2KHR> needs extension <VK_KHR_create_renderpass2> enabled!");

	getDispatcher()->vkCmdBeginRenderPass2KHR(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                          reinterpret_cast<const VkRenderPassBeginInfo *>(&renderPassBegin),
	                                          reinterpret_cast<const VkSubpassBeginInfo *>(&subpassBeginInfo));
}

VULKAN_HPP_INLINE void CommandBuffer::nextSubpass2KHR(const VULKAN_HPP_NAMESPACE::SubpassBeginInfo &subpassBeginInfo,
                                                      const VULKAN_HPP_NAMESPACE::SubpassEndInfo &subpassEndInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdNextSubpass2KHR && "Function <vkCmdNextSubpass2KHR> needs extension <VK_KHR_create_renderpass2> enabled!");

	getDispatcher()->vkCmdNextSubpass2KHR(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                      reinterpret_cast<const VkSubpassBeginInfo *>(&subpassBeginInfo),
	                                      reinterpret_cast<const VkSubpassEndInfo *>(&subpassEndInfo));
}

VULKAN_HPP_INLINE void CommandBuffer::endRenderPass2KHR(const VULKAN_HPP_NAMESPACE::SubpassEndInfo &subpassEndInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdEndRenderPass2KHR && "Function <vkCmdEndRenderPass2KHR> needs extension <VK_KHR_create_renderpass2> enabled!");

	getDispatcher()->vkCmdEndRenderPass2KHR(static_cast<VkCommandBuffer>(m_commandBuffer), reinterpret_cast<const VkSubpassEndInfo *>(&subpassEndInfo));
}

//=== VK_KHR_shared_presentable_image ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result SwapchainKHR::getStatus() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetSwapchainStatusKHR &&
	                  "Function <vkGetSwapchainStatusKHR> needs extension <VK_KHR_shared_presentable_image> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetSwapchainStatusKHR(static_cast<VkDevice>(m_device), static_cast<VkSwapchainKHR>(m_swapchain)));
	if((result != VULKAN_HPP_NAMESPACE::Result::eSuccess) && (result != VULKAN_HPP_NAMESPACE::Result::eSuboptimalKHR))
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::SwapchainKHR::getStatus");
	}
	return result;
}

//=== VK_KHR_external_fence_capabilities ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ExternalFenceProperties
PhysicalDevice::getExternalFencePropertiesKHR(const VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFenceInfo &externalFenceInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceExternalFencePropertiesKHR &&
	                  "Function <vkGetPhysicalDeviceExternalFencePropertiesKHR> needs extension <VK_KHR_external_fence_capabilities> enabled!");

	VULKAN_HPP_NAMESPACE::ExternalFenceProperties externalFenceProperties;
	getDispatcher()->vkGetPhysicalDeviceExternalFencePropertiesKHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                               reinterpret_cast<const VkPhysicalDeviceExternalFenceInfo *>(&externalFenceInfo),
	                                                               reinterpret_cast<VkExternalFenceProperties *>(&externalFenceProperties));
	return externalFenceProperties;
}

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
//=== VK_KHR_external_fence_win32 ===

VULKAN_HPP_INLINE void Device::importFenceWin32HandleKHR(const VULKAN_HPP_NAMESPACE::ImportFenceWin32HandleInfoKHR &importFenceWin32HandleInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkImportFenceWin32HandleKHR &&
	                  "Function <vkImportFenceWin32HandleKHR> needs extension <VK_KHR_external_fence_win32> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkImportFenceWin32HandleKHR(
	    static_cast<VkDevice>(m_device), reinterpret_cast<const VkImportFenceWin32HandleInfoKHR *>(&importFenceWin32HandleInfo)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::importFenceWin32HandleKHR");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE HANDLE
Device::getFenceWin32HandleKHR(const VULKAN_HPP_NAMESPACE::FenceGetWin32HandleInfoKHR &getWin32HandleInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetFenceWin32HandleKHR &&
	                  "Function <vkGetFenceWin32HandleKHR> needs extension <VK_KHR_external_fence_win32> enabled!");

	HANDLE handle;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetFenceWin32HandleKHR(
	    static_cast<VkDevice>(m_device), reinterpret_cast<const VkFenceGetWin32HandleInfoKHR *>(&getWin32HandleInfo), &handle));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getFenceWin32HandleKHR");
	}
	return handle;
}
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

//=== VK_KHR_external_fence_fd ===

VULKAN_HPP_INLINE void Device::importFenceFdKHR(const VULKAN_HPP_NAMESPACE::ImportFenceFdInfoKHR &importFenceFdInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkImportFenceFdKHR && "Function <vkImportFenceFdKHR> needs extension <VK_KHR_external_fence_fd> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkImportFenceFdKHR(static_cast<VkDevice>(m_device), reinterpret_cast<const VkImportFenceFdInfoKHR *>(&importFenceFdInfo)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::importFenceFdKHR");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE int Device::getFenceFdKHR(const VULKAN_HPP_NAMESPACE::FenceGetFdInfoKHR &getFdInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetFenceFdKHR && "Function <vkGetFenceFdKHR> needs extension <VK_KHR_external_fence_fd> enabled!");

	int fd;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetFenceFdKHR(static_cast<VkDevice>(m_device), reinterpret_cast<const VkFenceGetFdInfoKHR *>(&getFdInfo), &fd));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getFenceFdKHR");
	}
	return fd;
}

//=== VK_KHR_performance_query ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::pair<std::vector<PerformanceCounterKHR>, std::vector<PerformanceCounterDescriptionKHR>>
PhysicalDevice::enumerateQueueFamilyPerformanceQueryCountersKHR(uint32_t queueFamilyIndex) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR &&
	                  "Function <vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR> needs extension <VK_KHR_performance_query> enabled!");

	std::pair<std::vector<PerformanceCounterKHR>, std::vector<PerformanceCounterDescriptionKHR>> data;
	std::vector<PerformanceCounterKHR> &counters = data.first;
	std::vector<PerformanceCounterDescriptionKHR> &counterDescriptions = data.second;
	uint32_t counterCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
		    static_cast<VkPhysicalDevice>(m_physicalDevice), queueFamilyIndex, &counterCount, nullptr, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && counterCount)
		{
			counters.resize(counterCount);
			counterDescriptions.resize(counterCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
			    static_cast<VkPhysicalDevice>(m_physicalDevice),
			    queueFamilyIndex,
			    &counterCount,
			    reinterpret_cast<VkPerformanceCounterKHR *>(counters.data()),
			    reinterpret_cast<VkPerformanceCounterDescriptionKHR *>(counterDescriptions.data())));
			VULKAN_HPP_ASSERT(counterCount <= counters.size());
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && (counterCount < counters.size()))
	{
		counters.resize(counterCount);
		counterDescriptions.resize(counterCount);
	}
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::enumerateQueueFamilyPerformanceQueryCountersKHR");
	}
	return data;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint32_t PhysicalDevice::getQueueFamilyPerformanceQueryPassesKHR(
    const VULKAN_HPP_NAMESPACE::QueryPoolPerformanceCreateInfoKHR &performanceQueryCreateInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR &&
	                  "Function <vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR> needs extension <VK_KHR_performance_query> enabled!");

	uint32_t numPasses;
	getDispatcher()->vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(
	    static_cast<VkPhysicalDevice>(m_physicalDevice),
	    reinterpret_cast<const VkQueryPoolPerformanceCreateInfoKHR *>(&performanceQueryCreateInfo),
	    &numPasses);
	return numPasses;
}

VULKAN_HPP_INLINE void Device::acquireProfilingLockKHR(const VULKAN_HPP_NAMESPACE::AcquireProfilingLockInfoKHR &info) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkAcquireProfilingLockKHR &&
	                  "Function <vkAcquireProfilingLockKHR> needs extension <VK_KHR_performance_query> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkAcquireProfilingLockKHR(static_cast<VkDevice>(m_device), reinterpret_cast<const VkAcquireProfilingLockInfoKHR *>(&info)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::acquireProfilingLockKHR");
	}
}

VULKAN_HPP_INLINE void Device::releaseProfilingLockKHR() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkReleaseProfilingLockKHR &&
	                  "Function <vkReleaseProfilingLockKHR> needs extension <VK_KHR_performance_query> enabled!");

	getDispatcher()->vkReleaseProfilingLockKHR(static_cast<VkDevice>(m_device));
}

//=== VK_KHR_get_surface_capabilities2 ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR
PhysicalDevice::getSurfaceCapabilities2KHR(const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR &surfaceInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceSurfaceCapabilities2KHR &&
	                  "Function <vkGetPhysicalDeviceSurfaceCapabilities2KHR> needs extension <VK_KHR_get_surface_capabilities2> enabled!");

	VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR surfaceCapabilities;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetPhysicalDeviceSurfaceCapabilities2KHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                                reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>(&surfaceInfo),
	                                                                reinterpret_cast<VkSurfaceCapabilities2KHR *>(&surfaceCapabilities)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getSurfaceCapabilities2KHR");
	}
	return surfaceCapabilities;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...>
PhysicalDevice::getSurfaceCapabilities2KHR(const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR &surfaceInfo) const
{
	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR &surfaceCapabilities = structureChain.template get<VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR>();
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetPhysicalDeviceSurfaceCapabilities2KHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                                reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>(&surfaceInfo),
	                                                                reinterpret_cast<VkSurfaceCapabilities2KHR *>(&surfaceCapabilities)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getSurfaceCapabilities2KHR");
	}
	return structureChain;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR>
PhysicalDevice::getSurfaceFormats2KHR(const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR &surfaceInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceSurfaceFormats2KHR &&
	                  "Function <vkGetPhysicalDeviceSurfaceFormats2KHR> needs extension <VK_KHR_get_surface_capabilities2> enabled!");

	std::vector<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR> surfaceFormats;
	uint32_t surfaceFormatCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    getDispatcher()->vkGetPhysicalDeviceSurfaceFormats2KHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
		                                                           reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>(&surfaceInfo),
		                                                           &surfaceFormatCount,
		                                                           nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && surfaceFormatCount)
		{
			surfaceFormats.resize(surfaceFormatCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
			    getDispatcher()->vkGetPhysicalDeviceSurfaceFormats2KHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
			                                                           reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>(&surfaceInfo),
			                                                           &surfaceFormatCount,
			                                                           reinterpret_cast<VkSurfaceFormat2KHR *>(surfaceFormats.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getSurfaceFormats2KHR");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(surfaceFormatCount <= surfaceFormats.size());
		if(surfaceFormatCount < surfaceFormats.size())
		{
			surfaceFormats.resize(surfaceFormatCount);
		}
	}
	return surfaceFormats;
}

//=== VK_KHR_get_display_properties2 ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::DisplayProperties2KHR> PhysicalDevice::getDisplayProperties2KHR() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceDisplayProperties2KHR &&
	                  "Function <vkGetPhysicalDeviceDisplayProperties2KHR> needs extension <VK_KHR_get_display_properties2> enabled!");

	std::vector<VULKAN_HPP_NAMESPACE::DisplayProperties2KHR> properties;
	uint32_t propertyCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    getDispatcher()->vkGetPhysicalDeviceDisplayProperties2KHR(static_cast<VkPhysicalDevice>(m_physicalDevice), &propertyCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && propertyCount)
		{
			properties.resize(propertyCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetPhysicalDeviceDisplayProperties2KHR(
			    static_cast<VkPhysicalDevice>(m_physicalDevice), &propertyCount, reinterpret_cast<VkDisplayProperties2KHR *>(properties.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getDisplayProperties2KHR");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(propertyCount <= properties.size());
		if(propertyCount < properties.size())
		{
			properties.resize(propertyCount);
		}
	}
	return properties;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR> PhysicalDevice::getDisplayPlaneProperties2KHR() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceDisplayPlaneProperties2KHR &&
	                  "Function <vkGetPhysicalDeviceDisplayPlaneProperties2KHR> needs extension <VK_KHR_get_display_properties2> enabled!");

	std::vector<VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR> properties;
	uint32_t propertyCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    getDispatcher()->vkGetPhysicalDeviceDisplayPlaneProperties2KHR(static_cast<VkPhysicalDevice>(m_physicalDevice), &propertyCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && propertyCount)
		{
			properties.resize(propertyCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetPhysicalDeviceDisplayPlaneProperties2KHR(
			    static_cast<VkPhysicalDevice>(m_physicalDevice), &propertyCount, reinterpret_cast<VkDisplayPlaneProperties2KHR *>(properties.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getDisplayPlaneProperties2KHR");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(propertyCount <= properties.size());
		if(propertyCount < properties.size())
		{
			properties.resize(propertyCount);
		}
	}
	return properties;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR> DisplayKHR::getModeProperties2() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetDisplayModeProperties2KHR &&
	                  "Function <vkGetDisplayModeProperties2KHR> needs extension <VK_KHR_get_display_properties2> enabled!");

	std::vector<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR> properties;
	uint32_t propertyCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetDisplayModeProperties2KHR(
		    static_cast<VkPhysicalDevice>(m_physicalDevice), static_cast<VkDisplayKHR>(m_display), &propertyCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && propertyCount)
		{
			properties.resize(propertyCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
			    getDispatcher()->vkGetDisplayModeProperties2KHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
			                                                    static_cast<VkDisplayKHR>(m_display),
			                                                    &propertyCount,
			                                                    reinterpret_cast<VkDisplayModeProperties2KHR *>(properties.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::DisplayKHR::getModeProperties2");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(propertyCount <= properties.size());
		if(propertyCount < properties.size())
		{
			properties.resize(propertyCount);
		}
	}
	return properties;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilities2KHR
PhysicalDevice::getDisplayPlaneCapabilities2KHR(const VULKAN_HPP_NAMESPACE::DisplayPlaneInfo2KHR &displayPlaneInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetDisplayPlaneCapabilities2KHR &&
	                  "Function <vkGetDisplayPlaneCapabilities2KHR> needs extension <VK_KHR_get_display_properties2> enabled!");

	VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilities2KHR capabilities;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetDisplayPlaneCapabilities2KHR(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                       reinterpret_cast<const VkDisplayPlaneInfo2KHR *>(&displayPlaneInfo),
	                                                       reinterpret_cast<VkDisplayPlaneCapabilities2KHR *>(&capabilities)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getDisplayPlaneCapabilities2KHR");
	}
	return capabilities;
}

#	if defined(VK_USE_PLATFORM_IOS_MVK)
//=== VK_MVK_ios_surface ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
Instance::createIOSSurfaceMVK(VULKAN_HPP_NAMESPACE::IOSSurfaceCreateInfoMVK const &createInfo,
                              VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR(*this, createInfo, allocator);
}
#	endif /*VK_USE_PLATFORM_IOS_MVK*/

#	if defined(VK_USE_PLATFORM_MACOS_MVK)
//=== VK_MVK_macos_surface ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
Instance::createMacOSSurfaceMVK(VULKAN_HPP_NAMESPACE::MacOSSurfaceCreateInfoMVK const &createInfo,
                                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR(*this, createInfo, allocator);
}
#	endif /*VK_USE_PLATFORM_MACOS_MVK*/

//=== VK_EXT_debug_utils ===

VULKAN_HPP_INLINE void Device::setDebugUtilsObjectNameEXT(const VULKAN_HPP_NAMESPACE::DebugUtilsObjectNameInfoEXT &nameInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkSetDebugUtilsObjectNameEXT &&
	                  "Function <vkSetDebugUtilsObjectNameEXT> needs extension <VK_EXT_debug_utils> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkSetDebugUtilsObjectNameEXT(
	    static_cast<VkDevice>(m_device), reinterpret_cast<const VkDebugUtilsObjectNameInfoEXT *>(&nameInfo)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::setDebugUtilsObjectNameEXT");
	}
}

VULKAN_HPP_INLINE void Device::setDebugUtilsObjectTagEXT(const VULKAN_HPP_NAMESPACE::DebugUtilsObjectTagInfoEXT &tagInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkSetDebugUtilsObjectTagEXT &&
	                  "Function <vkSetDebugUtilsObjectTagEXT> needs extension <VK_EXT_debug_utils> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkSetDebugUtilsObjectTagEXT(static_cast<VkDevice>(m_device), reinterpret_cast<const VkDebugUtilsObjectTagInfoEXT *>(&tagInfo)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::setDebugUtilsObjectTagEXT");
	}
}

VULKAN_HPP_INLINE void Queue::beginDebugUtilsLabelEXT(const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT &labelInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkQueueBeginDebugUtilsLabelEXT &&
	                  "Function <vkQueueBeginDebugUtilsLabelEXT> needs extension <VK_EXT_debug_utils> enabled!");

	getDispatcher()->vkQueueBeginDebugUtilsLabelEXT(static_cast<VkQueue>(m_queue), reinterpret_cast<const VkDebugUtilsLabelEXT *>(&labelInfo));
}

VULKAN_HPP_INLINE void Queue::endDebugUtilsLabelEXT() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkQueueEndDebugUtilsLabelEXT &&
	                  "Function <vkQueueEndDebugUtilsLabelEXT> needs extension <VK_EXT_debug_utils> enabled!");

	getDispatcher()->vkQueueEndDebugUtilsLabelEXT(static_cast<VkQueue>(m_queue));
}

VULKAN_HPP_INLINE void Queue::insertDebugUtilsLabelEXT(const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT &labelInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkQueueInsertDebugUtilsLabelEXT &&
	                  "Function <vkQueueInsertDebugUtilsLabelEXT> needs extension <VK_EXT_debug_utils> enabled!");

	getDispatcher()->vkQueueInsertDebugUtilsLabelEXT(static_cast<VkQueue>(m_queue), reinterpret_cast<const VkDebugUtilsLabelEXT *>(&labelInfo));
}

VULKAN_HPP_INLINE void CommandBuffer::beginDebugUtilsLabelEXT(const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT &labelInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdBeginDebugUtilsLabelEXT &&
	                  "Function <vkCmdBeginDebugUtilsLabelEXT> needs extension <VK_EXT_debug_utils> enabled!");

	getDispatcher()->vkCmdBeginDebugUtilsLabelEXT(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                              reinterpret_cast<const VkDebugUtilsLabelEXT *>(&labelInfo));
}

VULKAN_HPP_INLINE void CommandBuffer::endDebugUtilsLabelEXT() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdEndDebugUtilsLabelEXT && "Function <vkCmdEndDebugUtilsLabelEXT> needs extension <VK_EXT_debug_utils> enabled!");

	getDispatcher()->vkCmdEndDebugUtilsLabelEXT(static_cast<VkCommandBuffer>(m_commandBuffer));
}

VULKAN_HPP_INLINE void CommandBuffer::insertDebugUtilsLabelEXT(const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT &labelInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdInsertDebugUtilsLabelEXT &&
	                  "Function <vkCmdInsertDebugUtilsLabelEXT> needs extension <VK_EXT_debug_utils> enabled!");

	getDispatcher()->vkCmdInsertDebugUtilsLabelEXT(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                               reinterpret_cast<const VkDebugUtilsLabelEXT *>(&labelInfo));
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::DebugUtilsMessengerEXT
Instance::createDebugUtilsMessengerEXT(VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateInfoEXT const &createInfo,
                                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::DebugUtilsMessengerEXT(*this, createInfo, allocator);
}

VULKAN_HPP_INLINE void
Instance::submitDebugUtilsMessageEXT(VULKAN_HPP_NAMESPACE::DebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
                                     VULKAN_HPP_NAMESPACE::DebugUtilsMessageTypeFlagsEXT messageTypes,
                                     const VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCallbackDataEXT &callbackData) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkSubmitDebugUtilsMessageEXT &&
	                  "Function <vkSubmitDebugUtilsMessageEXT> needs extension <VK_EXT_debug_utils> enabled!");

	getDispatcher()->vkSubmitDebugUtilsMessageEXT(static_cast<VkInstance>(m_instance),
	                                              static_cast<VkDebugUtilsMessageSeverityFlagBitsEXT>(messageSeverity),
	                                              static_cast<VkDebugUtilsMessageTypeFlagsEXT>(messageTypes),
	                                              reinterpret_cast<const VkDebugUtilsMessengerCallbackDataEXT *>(&callbackData));
}

#	if defined(VK_USE_PLATFORM_ANDROID_KHR)
//=== VK_ANDROID_external_memory_android_hardware_buffer ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID
Device::getAndroidHardwareBufferPropertiesANDROID(const struct AHardwareBuffer &buffer) const
{
	VULKAN_HPP_ASSERT(
	    getDispatcher()->vkGetAndroidHardwareBufferPropertiesANDROID &&
	    "Function <vkGetAndroidHardwareBufferPropertiesANDROID> needs extension <VK_ANDROID_external_memory_android_hardware_buffer> enabled!");

	VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID properties;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetAndroidHardwareBufferPropertiesANDROID(
	    static_cast<VkDevice>(m_device), &buffer, reinterpret_cast<VkAndroidHardwareBufferPropertiesANDROID *>(&properties)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getAndroidHardwareBufferPropertiesANDROID");
	}
	return properties;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD StructureChain<X, Y, Z...> Device::getAndroidHardwareBufferPropertiesANDROID(const struct AHardwareBuffer &buffer) const
{
	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID &properties =
	    structureChain.template get<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID>();
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetAndroidHardwareBufferPropertiesANDROID(
	    static_cast<VkDevice>(m_device), &buffer, reinterpret_cast<VkAndroidHardwareBufferPropertiesANDROID *>(&properties)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getAndroidHardwareBufferPropertiesANDROID");
	}
	return structureChain;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE struct AHardwareBuffer *
Device::getMemoryAndroidHardwareBufferANDROID(const VULKAN_HPP_NAMESPACE::MemoryGetAndroidHardwareBufferInfoANDROID &info) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetMemoryAndroidHardwareBufferANDROID &&
	                  "Function <vkGetMemoryAndroidHardwareBufferANDROID> needs extension <VK_ANDROID_external_memory_android_hardware_buffer> enabled!");

	struct AHardwareBuffer *buffer;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetMemoryAndroidHardwareBufferANDROID(
	    static_cast<VkDevice>(m_device), reinterpret_cast<const VkMemoryGetAndroidHardwareBufferInfoANDROID *>(&info), &buffer));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getMemoryAndroidHardwareBufferANDROID");
	}
	return buffer;
}
#	endif /*VK_USE_PLATFORM_ANDROID_KHR*/

//=== VK_EXT_sample_locations ===

VULKAN_HPP_INLINE void
CommandBuffer::setSampleLocationsEXT(const VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT &sampleLocationsInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetSampleLocationsEXT &&
	                  "Function <vkCmdSetSampleLocationsEXT> needs extension <VK_EXT_sample_locations> enabled!");

	getDispatcher()->vkCmdSetSampleLocationsEXT(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                            reinterpret_cast<const VkSampleLocationsInfoEXT *>(&sampleLocationsInfo));
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MultisamplePropertiesEXT
PhysicalDevice::getMultisamplePropertiesEXT(VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceMultisamplePropertiesEXT &&
	                  "Function <vkGetPhysicalDeviceMultisamplePropertiesEXT> needs extension <VK_EXT_sample_locations> enabled!");

	VULKAN_HPP_NAMESPACE::MultisamplePropertiesEXT multisampleProperties;
	getDispatcher()->vkGetPhysicalDeviceMultisamplePropertiesEXT(static_cast<VkPhysicalDevice>(m_physicalDevice),
	                                                             static_cast<VkSampleCountFlagBits>(samples),
	                                                             reinterpret_cast<VkMultisamplePropertiesEXT *>(&multisampleProperties));
	return multisampleProperties;
}

//=== VK_KHR_get_memory_requirements2 ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2
Device::getImageMemoryRequirements2KHR(const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetImageMemoryRequirements2KHR &&
	                  "Function <vkGetImageMemoryRequirements2KHR> needs extension <VK_KHR_get_memory_requirements2> enabled!");

	VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;
	getDispatcher()->vkGetImageMemoryRequirements2KHR(static_cast<VkDevice>(m_device),
	                                                  reinterpret_cast<const VkImageMemoryRequirementsInfo2 *>(&info),
	                                                  reinterpret_cast<VkMemoryRequirements2 *>(&memoryRequirements));
	return memoryRequirements;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...>
Device::getImageMemoryRequirements2KHR(const VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetImageMemoryRequirements2KHR &&
	                  "Function <vkGetImageMemoryRequirements2KHR> needs extension <VK_KHR_get_memory_requirements2> enabled!");

	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::MemoryRequirements2 &memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();
	getDispatcher()->vkGetImageMemoryRequirements2KHR(static_cast<VkDevice>(m_device),
	                                                  reinterpret_cast<const VkImageMemoryRequirementsInfo2 *>(&info),
	                                                  reinterpret_cast<VkMemoryRequirements2 *>(&memoryRequirements));
	return structureChain;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2
Device::getBufferMemoryRequirements2KHR(const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetBufferMemoryRequirements2KHR &&
	                  "Function <vkGetBufferMemoryRequirements2KHR> needs extension <VK_KHR_get_memory_requirements2> enabled!");

	VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;
	getDispatcher()->vkGetBufferMemoryRequirements2KHR(static_cast<VkDevice>(m_device),
	                                                   reinterpret_cast<const VkBufferMemoryRequirementsInfo2 *>(&info),
	                                                   reinterpret_cast<VkMemoryRequirements2 *>(&memoryRequirements));
	return memoryRequirements;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...>
Device::getBufferMemoryRequirements2KHR(const VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetBufferMemoryRequirements2KHR &&
	                  "Function <vkGetBufferMemoryRequirements2KHR> needs extension <VK_KHR_get_memory_requirements2> enabled!");

	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::MemoryRequirements2 &memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();
	getDispatcher()->vkGetBufferMemoryRequirements2KHR(static_cast<VkDevice>(m_device),
	                                                   reinterpret_cast<const VkBufferMemoryRequirementsInfo2 *>(&info),
	                                                   reinterpret_cast<VkMemoryRequirements2 *>(&memoryRequirements));
	return structureChain;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>
Device::getImageSparseMemoryRequirements2KHR(const VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2 &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetImageSparseMemoryRequirements2KHR &&
	                  "Function <vkGetImageSparseMemoryRequirements2KHR> needs extension <VK_KHR_get_memory_requirements2> enabled!");

	uint32_t sparseMemoryRequirementCount;
	getDispatcher()->vkGetImageSparseMemoryRequirements2KHR(
	    static_cast<VkDevice>(m_device), reinterpret_cast<const VkImageSparseMemoryRequirementsInfo2 *>(&info), &sparseMemoryRequirementCount, nullptr);
	std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2> sparseMemoryRequirements(sparseMemoryRequirementCount);
	getDispatcher()->vkGetImageSparseMemoryRequirements2KHR(static_cast<VkDevice>(m_device),
	                                                        reinterpret_cast<const VkImageSparseMemoryRequirementsInfo2 *>(&info),
	                                                        &sparseMemoryRequirementCount,
	                                                        reinterpret_cast<VkSparseImageMemoryRequirements2 *>(sparseMemoryRequirements.data()));
	VULKAN_HPP_ASSERT(sparseMemoryRequirementCount == sparseMemoryRequirements.size());
	return sparseMemoryRequirements;
}

//=== VK_KHR_acceleration_structure ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::AccelerationStructureKHR
Device::createAccelerationStructureKHR(VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoKHR const &createInfo,
                                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::AccelerationStructureKHR(*this, createInfo, allocator);
}

VULKAN_HPP_INLINE void CommandBuffer::buildAccelerationStructuresKHR(
    ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR> const &infos,
    ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR *const> const &pBuildRangeInfos) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdBuildAccelerationStructuresKHR &&
	                  "Function <vkCmdBuildAccelerationStructuresKHR> needs extension <VK_KHR_acceleration_structure> enabled!");

	if(infos.size() != pBuildRangeInfos.size())
	{
		throw LogicError(VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::buildAccelerationStructuresKHR: infos.size() != pBuildRangeInfos.size()");
	}
	getDispatcher()->vkCmdBuildAccelerationStructuresKHR(
	    static_cast<VkCommandBuffer>(m_commandBuffer),
	    infos.size(),
	    reinterpret_cast<const VkAccelerationStructureBuildGeometryInfoKHR *>(infos.data()),
	    reinterpret_cast<const VkAccelerationStructureBuildRangeInfoKHR *const *>(pBuildRangeInfos.data()));
}

VULKAN_HPP_INLINE void
CommandBuffer::buildAccelerationStructuresIndirectKHR(ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR> const &infos,
                                                      ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceAddress> const &indirectDeviceAddresses,
                                                      ArrayProxy<const uint32_t> const &indirectStrides,
                                                      ArrayProxy<const uint32_t *const> const &pMaxPrimitiveCounts) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdBuildAccelerationStructuresIndirectKHR &&
	                  "Function <vkCmdBuildAccelerationStructuresIndirectKHR> needs extension <VK_KHR_acceleration_structure> enabled!");

	if(infos.size() != indirectDeviceAddresses.size())
	{
		throw LogicError(VULKAN_HPP_NAMESPACE_STRING
		                 "::CommandBuffer::buildAccelerationStructuresIndirectKHR: infos.size() != indirectDeviceAddresses.size()");
	}
	if(infos.size() != indirectStrides.size())
	{
		throw LogicError(VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::buildAccelerationStructuresIndirectKHR: infos.size() != indirectStrides.size()");
	}
	if(infos.size() != pMaxPrimitiveCounts.size())
	{
		throw LogicError(VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::buildAccelerationStructuresIndirectKHR: infos.size() != pMaxPrimitiveCounts.size()");
	}
	getDispatcher()->vkCmdBuildAccelerationStructuresIndirectKHR(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                                             infos.size(),
	                                                             reinterpret_cast<const VkAccelerationStructureBuildGeometryInfoKHR *>(infos.data()),
	                                                             reinterpret_cast<const VkDeviceAddress *>(indirectDeviceAddresses.data()),
	                                                             indirectStrides.data(),
	                                                             pMaxPrimitiveCounts.data());
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result Device::buildAccelerationStructuresKHR(
    VULKAN_HPP_NAMESPACE::DeferredOperationKHR deferredOperation,
    ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR> const &infos,
    ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR *const> const &pBuildRangeInfos) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkBuildAccelerationStructuresKHR &&
	                  "Function <vkBuildAccelerationStructuresKHR> needs extension <VK_KHR_acceleration_structure> enabled!");

	if(infos.size() != pBuildRangeInfos.size())
	{
		throw LogicError(VULKAN_HPP_NAMESPACE_STRING "::Device::buildAccelerationStructuresKHR: infos.size() != pBuildRangeInfos.size()");
	}

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkBuildAccelerationStructuresKHR(
	    static_cast<VkDevice>(m_device),
	    static_cast<VkDeferredOperationKHR>(deferredOperation),
	    infos.size(),
	    reinterpret_cast<const VkAccelerationStructureBuildGeometryInfoKHR *>(infos.data()),
	    reinterpret_cast<const VkAccelerationStructureBuildRangeInfoKHR *const *>(pBuildRangeInfos.data())));
	if((result != VULKAN_HPP_NAMESPACE::Result::eSuccess) && (result != VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR) &&
	   (result != VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR))
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::buildAccelerationStructuresKHR");
	}
	return result;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result
Device::copyAccelerationStructureKHR(VULKAN_HPP_NAMESPACE::DeferredOperationKHR deferredOperation,
                                     const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR &info) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCopyAccelerationStructureKHR &&
	                  "Function <vkCopyAccelerationStructureKHR> needs extension <VK_KHR_acceleration_structure> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkCopyAccelerationStructureKHR(static_cast<VkDevice>(m_device),
	                                                    static_cast<VkDeferredOperationKHR>(deferredOperation),
	                                                    reinterpret_cast<const VkCopyAccelerationStructureInfoKHR *>(&info)));
	if((result != VULKAN_HPP_NAMESPACE::Result::eSuccess) && (result != VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR) &&
	   (result != VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR))
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::copyAccelerationStructureKHR");
	}
	return result;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result
Device::copyAccelerationStructureToMemoryKHR(VULKAN_HPP_NAMESPACE::DeferredOperationKHR deferredOperation,
                                             const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureToMemoryInfoKHR &info) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCopyAccelerationStructureToMemoryKHR &&
	                  "Function <vkCopyAccelerationStructureToMemoryKHR> needs extension <VK_KHR_acceleration_structure> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkCopyAccelerationStructureToMemoryKHR(static_cast<VkDevice>(m_device),
	                                                            static_cast<VkDeferredOperationKHR>(deferredOperation),
	                                                            reinterpret_cast<const VkCopyAccelerationStructureToMemoryInfoKHR *>(&info)));
	if((result != VULKAN_HPP_NAMESPACE::Result::eSuccess) && (result != VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR) &&
	   (result != VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR))
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::copyAccelerationStructureToMemoryKHR");
	}
	return result;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result
Device::copyMemoryToAccelerationStructureKHR(VULKAN_HPP_NAMESPACE::DeferredOperationKHR deferredOperation,
                                             const VULKAN_HPP_NAMESPACE::CopyMemoryToAccelerationStructureInfoKHR &info) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCopyMemoryToAccelerationStructureKHR &&
	                  "Function <vkCopyMemoryToAccelerationStructureKHR> needs extension <VK_KHR_acceleration_structure> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkCopyMemoryToAccelerationStructureKHR(static_cast<VkDevice>(m_device),
	                                                            static_cast<VkDeferredOperationKHR>(deferredOperation),
	                                                            reinterpret_cast<const VkCopyMemoryToAccelerationStructureInfoKHR *>(&info)));
	if((result != VULKAN_HPP_NAMESPACE::Result::eSuccess) && (result != VULKAN_HPP_NAMESPACE::Result::eOperationDeferredKHR) &&
	   (result != VULKAN_HPP_NAMESPACE::Result::eOperationNotDeferredKHR))
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::copyMemoryToAccelerationStructureKHR");
	}
	return result;
}

template<typename DataType>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<DataType>
Device::writeAccelerationStructuresPropertiesKHR(ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR> const &accelerationStructures,
                                                 VULKAN_HPP_NAMESPACE::QueryType queryType,
                                                 size_t dataSize,
                                                 size_t stride) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkWriteAccelerationStructuresPropertiesKHR &&
	                  "Function <vkWriteAccelerationStructuresPropertiesKHR> needs extension <VK_KHR_acceleration_structure> enabled!");

	VULKAN_HPP_ASSERT(dataSize % sizeof(DataType) == 0);
	std::vector<DataType> data(dataSize / sizeof(DataType));
	Result result = static_cast<Result>(
	    getDispatcher()->vkWriteAccelerationStructuresPropertiesKHR(static_cast<VkDevice>(m_device),
	                                                                accelerationStructures.size(),
	                                                                reinterpret_cast<const VkAccelerationStructureKHR *>(accelerationStructures.data()),
	                                                                static_cast<VkQueryType>(queryType),
	                                                                data.size() * sizeof(DataType),
	                                                                reinterpret_cast<void *>(data.data()),
	                                                                stride));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::writeAccelerationStructuresPropertiesKHR");
	}
	return data;
}

template<typename DataType>
VULKAN_HPP_NODISCARD DataType
Device::writeAccelerationStructuresPropertyKHR(ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR> const &accelerationStructures,
                                               VULKAN_HPP_NAMESPACE::QueryType queryType,
                                               size_t stride) const
{
	DataType data;
	Result result = static_cast<Result>(
	    getDispatcher()->vkWriteAccelerationStructuresPropertiesKHR(static_cast<VkDevice>(m_device),
	                                                                accelerationStructures.size(),
	                                                                reinterpret_cast<const VkAccelerationStructureKHR *>(accelerationStructures.data()),
	                                                                static_cast<VkQueryType>(queryType),
	                                                                sizeof(DataType),
	                                                                reinterpret_cast<void *>(&data),
	                                                                stride));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::writeAccelerationStructuresPropertyKHR");
	}
	return data;
}

VULKAN_HPP_INLINE void
CommandBuffer::copyAccelerationStructureKHR(const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdCopyAccelerationStructureKHR &&
	                  "Function <vkCmdCopyAccelerationStructureKHR> needs extension <VK_KHR_acceleration_structure> enabled!");

	getDispatcher()->vkCmdCopyAccelerationStructureKHR(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                                   reinterpret_cast<const VkCopyAccelerationStructureInfoKHR *>(&info));
}

VULKAN_HPP_INLINE void CommandBuffer::copyAccelerationStructureToMemoryKHR(
    const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureToMemoryInfoKHR &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdCopyAccelerationStructureToMemoryKHR &&
	                  "Function <vkCmdCopyAccelerationStructureToMemoryKHR> needs extension <VK_KHR_acceleration_structure> enabled!");

	getDispatcher()->vkCmdCopyAccelerationStructureToMemoryKHR(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                                           reinterpret_cast<const VkCopyAccelerationStructureToMemoryInfoKHR *>(&info));
}

VULKAN_HPP_INLINE void CommandBuffer::copyMemoryToAccelerationStructureKHR(
    const VULKAN_HPP_NAMESPACE::CopyMemoryToAccelerationStructureInfoKHR &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdCopyMemoryToAccelerationStructureKHR &&
	                  "Function <vkCmdCopyMemoryToAccelerationStructureKHR> needs extension <VK_KHR_acceleration_structure> enabled!");

	getDispatcher()->vkCmdCopyMemoryToAccelerationStructureKHR(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                                           reinterpret_cast<const VkCopyMemoryToAccelerationStructureInfoKHR *>(&info));
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceAddress
Device::getAccelerationStructureAddressKHR(const VULKAN_HPP_NAMESPACE::AccelerationStructureDeviceAddressInfoKHR &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetAccelerationStructureDeviceAddressKHR &&
	                  "Function <vkGetAccelerationStructureDeviceAddressKHR> needs extension <VK_KHR_acceleration_structure> enabled!");

	return static_cast<VULKAN_HPP_NAMESPACE::DeviceAddress>(getDispatcher()->vkGetAccelerationStructureDeviceAddressKHR(
	    static_cast<VkDevice>(m_device), reinterpret_cast<const VkAccelerationStructureDeviceAddressInfoKHR *>(&info)));
}

VULKAN_HPP_INLINE void
CommandBuffer::writeAccelerationStructuresPropertiesKHR(ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR> const &accelerationStructures,
                                                        VULKAN_HPP_NAMESPACE::QueryType queryType,
                                                        VULKAN_HPP_NAMESPACE::QueryPool queryPool,
                                                        uint32_t firstQuery) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdWriteAccelerationStructuresPropertiesKHR &&
	                  "Function <vkCmdWriteAccelerationStructuresPropertiesKHR> needs extension <VK_KHR_acceleration_structure> enabled!");

	getDispatcher()->vkCmdWriteAccelerationStructuresPropertiesKHR(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                                               accelerationStructures.size(),
	                                                               reinterpret_cast<const VkAccelerationStructureKHR *>(accelerationStructures.data()),
	                                                               static_cast<VkQueryType>(queryType),
	                                                               static_cast<VkQueryPool>(queryPool),
	                                                               firstQuery);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::AccelerationStructureCompatibilityKHR Device::getAccelerationStructureCompatibilityKHR(
    const VULKAN_HPP_NAMESPACE::AccelerationStructureVersionInfoKHR &versionInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetDeviceAccelerationStructureCompatibilityKHR &&
	                  "Function <vkGetDeviceAccelerationStructureCompatibilityKHR> needs extension <VK_KHR_acceleration_structure> enabled!");

	VULKAN_HPP_NAMESPACE::AccelerationStructureCompatibilityKHR compatibility;
	getDispatcher()->vkGetDeviceAccelerationStructureCompatibilityKHR(static_cast<VkDevice>(m_device),
	                                                                  reinterpret_cast<const VkAccelerationStructureVersionInfoKHR *>(&versionInfo),
	                                                                  reinterpret_cast<VkAccelerationStructureCompatibilityKHR *>(&compatibility));
	return compatibility;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR
Device::getAccelerationStructureBuildSizesKHR(VULKAN_HPP_NAMESPACE::AccelerationStructureBuildTypeKHR buildType,
                                              const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildGeometryInfoKHR &buildInfo,
                                              ArrayProxy<const uint32_t> const &maxPrimitiveCounts) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetAccelerationStructureBuildSizesKHR &&
	                  "Function <vkGetAccelerationStructureBuildSizesKHR> needs extension <VK_KHR_acceleration_structure> enabled!");

	if(maxPrimitiveCounts.size() != buildInfo.geometryCount)
	{
		throw LogicError(VULKAN_HPP_NAMESPACE_STRING "::Device::getAccelerationStructureBuildSizesKHR: maxPrimitiveCounts.size() != buildInfo.geometryCount");
	}
	VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR sizeInfo;
	getDispatcher()->vkGetAccelerationStructureBuildSizesKHR(static_cast<VkDevice>(m_device),
	                                                         static_cast<VkAccelerationStructureBuildTypeKHR>(buildType),
	                                                         reinterpret_cast<const VkAccelerationStructureBuildGeometryInfoKHR *>(&buildInfo),
	                                                         maxPrimitiveCounts.data(),
	                                                         reinterpret_cast<VkAccelerationStructureBuildSizesInfoKHR *>(&sizeInfo));
	return sizeInfo;
}

//=== VK_KHR_sampler_ycbcr_conversion ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::SamplerYcbcrConversion
Device::createSamplerYcbcrConversionKHR(VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo const &createInfo,
                                        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::SamplerYcbcrConversion(*this, createInfo, allocator);
}

VULKAN_HPP_INLINE void
Device::destroySamplerYcbcrConversionKHR(VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion ycbcrConversion,
                                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkDestroySamplerYcbcrConversionKHR &&
	                  "Function <vkDestroySamplerYcbcrConversionKHR> needs extension <VK_KHR_sampler_ycbcr_conversion> enabled!");

	getDispatcher()->vkDestroySamplerYcbcrConversionKHR(
	    static_cast<VkDevice>(m_device),
	    static_cast<VkSamplerYcbcrConversion>(ycbcrConversion),
	    reinterpret_cast<const VkAllocationCallbacks *>(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator)));
}

//=== VK_KHR_bind_memory2 ===

VULKAN_HPP_INLINE void Device::bindBufferMemory2KHR(ArrayProxy<const VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo> const &bindInfos) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkBindBufferMemory2KHR && "Function <vkBindBufferMemory2KHR> needs extension <VK_KHR_bind_memory2> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkBindBufferMemory2KHR(
	    static_cast<VkDevice>(m_device), bindInfos.size(), reinterpret_cast<const VkBindBufferMemoryInfo *>(bindInfos.data())));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::bindBufferMemory2KHR");
	}
}

VULKAN_HPP_INLINE void Device::bindImageMemory2KHR(ArrayProxy<const VULKAN_HPP_NAMESPACE::BindImageMemoryInfo> const &bindInfos) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkBindImageMemory2KHR && "Function <vkBindImageMemory2KHR> needs extension <VK_KHR_bind_memory2> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkBindImageMemory2KHR(
	    static_cast<VkDevice>(m_device), bindInfos.size(), reinterpret_cast<const VkBindImageMemoryInfo *>(bindInfos.data())));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::bindImageMemory2KHR");
	}
}

//=== VK_EXT_image_drm_format_modifier ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierPropertiesEXT Image::getDrmFormatModifierPropertiesEXT() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetImageDrmFormatModifierPropertiesEXT &&
	                  "Function <vkGetImageDrmFormatModifierPropertiesEXT> needs extension <VK_EXT_image_drm_format_modifier> enabled!");

	VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierPropertiesEXT properties;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetImageDrmFormatModifierPropertiesEXT(
	    static_cast<VkDevice>(m_device), static_cast<VkImage>(m_image), reinterpret_cast<VkImageDrmFormatModifierPropertiesEXT *>(&properties)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Image::getDrmFormatModifierPropertiesEXT");
	}
	return properties;
}

//=== VK_EXT_validation_cache ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::ValidationCacheEXT
Device::createValidationCacheEXT(VULKAN_HPP_NAMESPACE::ValidationCacheCreateInfoEXT const &createInfo,
                                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::ValidationCacheEXT(*this, createInfo, allocator);
}

VULKAN_HPP_INLINE void ValidationCacheEXT::merge(ArrayProxy<const VULKAN_HPP_NAMESPACE::ValidationCacheEXT> const &srcCaches) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkMergeValidationCachesEXT &&
	                  "Function <vkMergeValidationCachesEXT> needs extension <VK_EXT_validation_cache> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkMergeValidationCachesEXT(static_cast<VkDevice>(m_device),
	                                                static_cast<VkValidationCacheEXT>(m_validationCache),
	                                                srcCaches.size(),
	                                                reinterpret_cast<const VkValidationCacheEXT *>(srcCaches.data())));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::ValidationCacheEXT::merge");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<uint8_t> ValidationCacheEXT::getData() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetValidationCacheDataEXT &&
	                  "Function <vkGetValidationCacheDataEXT> needs extension <VK_EXT_validation_cache> enabled!");

	std::vector<uint8_t> data;
	size_t dataSize;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetValidationCacheDataEXT(
		    static_cast<VkDevice>(m_device), static_cast<VkValidationCacheEXT>(m_validationCache), &dataSize, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && dataSize)
		{
			data.resize(dataSize);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetValidationCacheDataEXT(
			    static_cast<VkDevice>(m_device), static_cast<VkValidationCacheEXT>(m_validationCache), &dataSize, reinterpret_cast<void *>(data.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::ValidationCacheEXT::getData");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(dataSize <= data.size());
		if(dataSize < data.size())
		{
			data.resize(dataSize);
		}
	}
	return data;
}

//=== VK_NV_shading_rate_image ===

VULKAN_HPP_INLINE void CommandBuffer::bindShadingRateImageNV(VULKAN_HPP_NAMESPACE::ImageView imageView,
                                                             VULKAN_HPP_NAMESPACE::ImageLayout imageLayout) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdBindShadingRateImageNV &&
	                  "Function <vkCmdBindShadingRateImageNV> needs extension <VK_NV_shading_rate_image> enabled!");

	getDispatcher()->vkCmdBindShadingRateImageNV(
	    static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkImageView>(imageView), static_cast<VkImageLayout>(imageLayout));
}

VULKAN_HPP_INLINE void CommandBuffer::setViewportShadingRatePaletteNV(
    uint32_t firstViewport, ArrayProxy<const VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV> const &shadingRatePalettes) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetViewportShadingRatePaletteNV &&
	                  "Function <vkCmdSetViewportShadingRatePaletteNV> needs extension <VK_NV_shading_rate_image> enabled!");

	getDispatcher()->vkCmdSetViewportShadingRatePaletteNV(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                                      firstViewport,
	                                                      shadingRatePalettes.size(),
	                                                      reinterpret_cast<const VkShadingRatePaletteNV *>(shadingRatePalettes.data()));
}

VULKAN_HPP_INLINE void CommandBuffer::setCoarseSampleOrderNV(
    VULKAN_HPP_NAMESPACE::CoarseSampleOrderTypeNV sampleOrderType,
    ArrayProxy<const VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV> const &customSampleOrders) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetCoarseSampleOrderNV &&
	                  "Function <vkCmdSetCoarseSampleOrderNV> needs extension <VK_NV_shading_rate_image> enabled!");

	getDispatcher()->vkCmdSetCoarseSampleOrderNV(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                             static_cast<VkCoarseSampleOrderTypeNV>(sampleOrderType),
	                                             customSampleOrders.size(),
	                                             reinterpret_cast<const VkCoarseSampleOrderCustomNV *>(customSampleOrders.data()));
}

//=== VK_NV_ray_tracing ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::AccelerationStructureNV
Device::createAccelerationStructureNV(VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoNV const &createInfo,
                                      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::AccelerationStructureNV(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2KHR Device::getAccelerationStructureMemoryRequirementsNV(
    const VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsInfoNV &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetAccelerationStructureMemoryRequirementsNV &&
	                  "Function <vkGetAccelerationStructureMemoryRequirementsNV> needs extension <VK_NV_ray_tracing> enabled!");

	VULKAN_HPP_NAMESPACE::MemoryRequirements2KHR memoryRequirements;
	getDispatcher()->vkGetAccelerationStructureMemoryRequirementsNV(static_cast<VkDevice>(m_device),
	                                                                reinterpret_cast<const VkAccelerationStructureMemoryRequirementsInfoNV *>(&info),
	                                                                reinterpret_cast<VkMemoryRequirements2KHR *>(&memoryRequirements));
	return memoryRequirements;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...> Device::getAccelerationStructureMemoryRequirementsNV(
    const VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsInfoNV &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetAccelerationStructureMemoryRequirementsNV &&
	                  "Function <vkGetAccelerationStructureMemoryRequirementsNV> needs extension <VK_NV_ray_tracing> enabled!");

	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::MemoryRequirements2KHR &memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2KHR>();
	getDispatcher()->vkGetAccelerationStructureMemoryRequirementsNV(static_cast<VkDevice>(m_device),
	                                                                reinterpret_cast<const VkAccelerationStructureMemoryRequirementsInfoNV *>(&info),
	                                                                reinterpret_cast<VkMemoryRequirements2KHR *>(&memoryRequirements));
	return structureChain;
}

VULKAN_HPP_INLINE void
Device::bindAccelerationStructureMemoryNV(ArrayProxy<const VULKAN_HPP_NAMESPACE::BindAccelerationStructureMemoryInfoNV> const &bindInfos) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkBindAccelerationStructureMemoryNV &&
	                  "Function <vkBindAccelerationStructureMemoryNV> needs extension <VK_NV_ray_tracing> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkBindAccelerationStructureMemoryNV(
	    static_cast<VkDevice>(m_device), bindInfos.size(), reinterpret_cast<const VkBindAccelerationStructureMemoryInfoNV *>(bindInfos.data())));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::bindAccelerationStructureMemoryNV");
	}
}

VULKAN_HPP_INLINE void CommandBuffer::buildAccelerationStructureNV(const VULKAN_HPP_NAMESPACE::AccelerationStructureInfoNV &info,
                                                                   VULKAN_HPP_NAMESPACE::Buffer instanceData,
                                                                   VULKAN_HPP_NAMESPACE::DeviceSize instanceOffset,
                                                                   VULKAN_HPP_NAMESPACE::Bool32 update,
                                                                   VULKAN_HPP_NAMESPACE::AccelerationStructureNV dst,
                                                                   VULKAN_HPP_NAMESPACE::AccelerationStructureNV src,
                                                                   VULKAN_HPP_NAMESPACE::Buffer scratch,
                                                                   VULKAN_HPP_NAMESPACE::DeviceSize scratchOffset) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdBuildAccelerationStructureNV &&
	                  "Function <vkCmdBuildAccelerationStructureNV> needs extension <VK_NV_ray_tracing> enabled!");

	getDispatcher()->vkCmdBuildAccelerationStructureNV(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                                   reinterpret_cast<const VkAccelerationStructureInfoNV *>(&info),
	                                                   static_cast<VkBuffer>(instanceData),
	                                                   static_cast<VkDeviceSize>(instanceOffset),
	                                                   static_cast<VkBool32>(update),
	                                                   static_cast<VkAccelerationStructureNV>(dst),
	                                                   static_cast<VkAccelerationStructureNV>(src),
	                                                   static_cast<VkBuffer>(scratch),
	                                                   static_cast<VkDeviceSize>(scratchOffset));
}

VULKAN_HPP_INLINE void CommandBuffer::copyAccelerationStructureNV(VULKAN_HPP_NAMESPACE::AccelerationStructureNV dst,
                                                                  VULKAN_HPP_NAMESPACE::AccelerationStructureNV src,
                                                                  VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR mode) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdCopyAccelerationStructureNV &&
	                  "Function <vkCmdCopyAccelerationStructureNV> needs extension <VK_NV_ray_tracing> enabled!");

	getDispatcher()->vkCmdCopyAccelerationStructureNV(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                                  static_cast<VkAccelerationStructureNV>(dst),
	                                                  static_cast<VkAccelerationStructureNV>(src),
	                                                  static_cast<VkCopyAccelerationStructureModeKHR>(mode));
}

VULKAN_HPP_INLINE void CommandBuffer::traceRaysNV(VULKAN_HPP_NAMESPACE::Buffer raygenShaderBindingTableBuffer,
                                                  VULKAN_HPP_NAMESPACE::DeviceSize raygenShaderBindingOffset,
                                                  VULKAN_HPP_NAMESPACE::Buffer missShaderBindingTableBuffer,
                                                  VULKAN_HPP_NAMESPACE::DeviceSize missShaderBindingOffset,
                                                  VULKAN_HPP_NAMESPACE::DeviceSize missShaderBindingStride,
                                                  VULKAN_HPP_NAMESPACE::Buffer hitShaderBindingTableBuffer,
                                                  VULKAN_HPP_NAMESPACE::DeviceSize hitShaderBindingOffset,
                                                  VULKAN_HPP_NAMESPACE::DeviceSize hitShaderBindingStride,
                                                  VULKAN_HPP_NAMESPACE::Buffer callableShaderBindingTableBuffer,
                                                  VULKAN_HPP_NAMESPACE::DeviceSize callableShaderBindingOffset,
                                                  VULKAN_HPP_NAMESPACE::DeviceSize callableShaderBindingStride,
                                                  uint32_t width,
                                                  uint32_t height,
                                                  uint32_t depth) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdTraceRaysNV && "Function <vkCmdTraceRaysNV> needs extension <VK_NV_ray_tracing> enabled!");

	getDispatcher()->vkCmdTraceRaysNV(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                  static_cast<VkBuffer>(raygenShaderBindingTableBuffer),
	                                  static_cast<VkDeviceSize>(raygenShaderBindingOffset),
	                                  static_cast<VkBuffer>(missShaderBindingTableBuffer),
	                                  static_cast<VkDeviceSize>(missShaderBindingOffset),
	                                  static_cast<VkDeviceSize>(missShaderBindingStride),
	                                  static_cast<VkBuffer>(hitShaderBindingTableBuffer),
	                                  static_cast<VkDeviceSize>(hitShaderBindingOffset),
	                                  static_cast<VkDeviceSize>(hitShaderBindingStride),
	                                  static_cast<VkBuffer>(callableShaderBindingTableBuffer),
	                                  static_cast<VkDeviceSize>(callableShaderBindingOffset),
	                                  static_cast<VkDeviceSize>(callableShaderBindingStride),
	                                  width,
	                                  height,
	                                  depth);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_RAII_NAMESPACE::Pipeline> Device::createRayTracingPipelinesNV(
    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &pipelineCache,
    VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV> const &createInfos,
    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::Pipelines(*this, pipelineCache, createInfos, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::Pipeline Device::createRayTracingPipelineNV(
    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &pipelineCache,
    VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV const &createInfo,
    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::Pipeline(*this, pipelineCache, createInfo, allocator);
}

template<typename DataType>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<DataType>
Pipeline::getRayTracingShaderGroupHandlesNV(uint32_t firstGroup, uint32_t groupCount, size_t dataSize) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetRayTracingShaderGroupHandlesNV &&
	                  "Function <vkGetRayTracingShaderGroupHandlesNV> needs extension <VK_NV_ray_tracing> enabled!");

	VULKAN_HPP_ASSERT(dataSize % sizeof(DataType) == 0);
	std::vector<DataType> data(dataSize / sizeof(DataType));
	Result result = static_cast<Result>(getDispatcher()->vkGetRayTracingShaderGroupHandlesNV(static_cast<VkDevice>(m_device),
	                                                                                         static_cast<VkPipeline>(m_pipeline),
	                                                                                         firstGroup,
	                                                                                         groupCount,
	                                                                                         data.size() * sizeof(DataType),
	                                                                                         reinterpret_cast<void *>(data.data())));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Pipeline::getRayTracingShaderGroupHandlesNV");
	}
	return data;
}

template<typename DataType>
VULKAN_HPP_NODISCARD DataType Pipeline::getRayTracingShaderGroupHandleNV(uint32_t firstGroup, uint32_t groupCount) const
{
	DataType data;
	Result result = static_cast<Result>(getDispatcher()->vkGetRayTracingShaderGroupHandlesNV(static_cast<VkDevice>(m_device),
	                                                                                         static_cast<VkPipeline>(m_pipeline),
	                                                                                         firstGroup,
	                                                                                         groupCount,
	                                                                                         sizeof(DataType),
	                                                                                         reinterpret_cast<void *>(&data)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Pipeline::getRayTracingShaderGroupHandleNV");
	}
	return data;
}

template<typename DataType>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<DataType> AccelerationStructureNV::getHandle(size_t dataSize) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetAccelerationStructureHandleNV &&
	                  "Function <vkGetAccelerationStructureHandleNV> needs extension <VK_NV_ray_tracing> enabled!");

	VULKAN_HPP_ASSERT(dataSize % sizeof(DataType) == 0);
	std::vector<DataType> data(dataSize / sizeof(DataType));
	Result result =
	    static_cast<Result>(getDispatcher()->vkGetAccelerationStructureHandleNV(static_cast<VkDevice>(m_device),
	                                                                            static_cast<VkAccelerationStructureNV>(m_accelerationStructure),
	                                                                            data.size() * sizeof(DataType),
	                                                                            reinterpret_cast<void *>(data.data())));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::AccelerationStructureNV::getHandle");
	}
	return data;
}

template<typename DataType>
VULKAN_HPP_NODISCARD DataType AccelerationStructureNV::getHandle() const
{
	DataType data;
	Result result =
	    static_cast<Result>(getDispatcher()->vkGetAccelerationStructureHandleNV(static_cast<VkDevice>(m_device),
	                                                                            static_cast<VkAccelerationStructureNV>(m_accelerationStructure),
	                                                                            sizeof(DataType),
	                                                                            reinterpret_cast<void *>(&data)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::AccelerationStructureNV::getHandle");
	}
	return data;
}

VULKAN_HPP_INLINE void
CommandBuffer::writeAccelerationStructuresPropertiesNV(ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureNV> const &accelerationStructures,
                                                       VULKAN_HPP_NAMESPACE::QueryType queryType,
                                                       VULKAN_HPP_NAMESPACE::QueryPool queryPool,
                                                       uint32_t firstQuery) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdWriteAccelerationStructuresPropertiesNV &&
	                  "Function <vkCmdWriteAccelerationStructuresPropertiesNV> needs extension <VK_NV_ray_tracing> enabled!");

	getDispatcher()->vkCmdWriteAccelerationStructuresPropertiesNV(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                                              accelerationStructures.size(),
	                                                              reinterpret_cast<const VkAccelerationStructureNV *>(accelerationStructures.data()),
	                                                              static_cast<VkQueryType>(queryType),
	                                                              static_cast<VkQueryPool>(queryPool),
	                                                              firstQuery);
}

VULKAN_HPP_INLINE void Pipeline::compileDeferredNV(uint32_t shader) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCompileDeferredNV && "Function <vkCompileDeferredNV> needs extension <VK_NV_ray_tracing> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkCompileDeferredNV(static_cast<VkDevice>(m_device), static_cast<VkPipeline>(m_pipeline), shader));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Pipeline::compileDeferredNV");
	}
}

//=== VK_KHR_maintenance3 ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport
Device::getDescriptorSetLayoutSupportKHR(const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo &createInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetDescriptorSetLayoutSupportKHR &&
	                  "Function <vkGetDescriptorSetLayoutSupportKHR> needs extension <VK_KHR_maintenance3> enabled!");

	VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport support;
	getDispatcher()->vkGetDescriptorSetLayoutSupportKHR(static_cast<VkDevice>(m_device),
	                                                    reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>(&createInfo),
	                                                    reinterpret_cast<VkDescriptorSetLayoutSupport *>(&support));
	return support;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...>
Device::getDescriptorSetLayoutSupportKHR(const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo &createInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetDescriptorSetLayoutSupportKHR &&
	                  "Function <vkGetDescriptorSetLayoutSupportKHR> needs extension <VK_KHR_maintenance3> enabled!");

	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport &support = structureChain.template get<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport>();
	getDispatcher()->vkGetDescriptorSetLayoutSupportKHR(static_cast<VkDevice>(m_device),
	                                                    reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>(&createInfo),
	                                                    reinterpret_cast<VkDescriptorSetLayoutSupport *>(&support));
	return structureChain;
}

//=== VK_KHR_draw_indirect_count ===

VULKAN_HPP_INLINE void CommandBuffer::drawIndirectCountKHR(VULKAN_HPP_NAMESPACE::Buffer buffer,
                                                           VULKAN_HPP_NAMESPACE::DeviceSize offset,
                                                           VULKAN_HPP_NAMESPACE::Buffer countBuffer,
                                                           VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,
                                                           uint32_t maxDrawCount,
                                                           uint32_t stride) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdDrawIndirectCountKHR &&
	                  "Function <vkCmdDrawIndirectCountKHR> needs extension <VK_KHR_draw_indirect_count> enabled!");

	getDispatcher()->vkCmdDrawIndirectCountKHR(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                           static_cast<VkBuffer>(buffer),
	                                           static_cast<VkDeviceSize>(offset),
	                                           static_cast<VkBuffer>(countBuffer),
	                                           static_cast<VkDeviceSize>(countBufferOffset),
	                                           maxDrawCount,
	                                           stride);
}

VULKAN_HPP_INLINE void CommandBuffer::drawIndexedIndirectCountKHR(VULKAN_HPP_NAMESPACE::Buffer buffer,
                                                                  VULKAN_HPP_NAMESPACE::DeviceSize offset,
                                                                  VULKAN_HPP_NAMESPACE::Buffer countBuffer,
                                                                  VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,
                                                                  uint32_t maxDrawCount,
                                                                  uint32_t stride) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdDrawIndexedIndirectCountKHR &&
	                  "Function <vkCmdDrawIndexedIndirectCountKHR> needs extension <VK_KHR_draw_indirect_count> enabled!");

	getDispatcher()->vkCmdDrawIndexedIndirectCountKHR(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                                  static_cast<VkBuffer>(buffer),
	                                                  static_cast<VkDeviceSize>(offset),
	                                                  static_cast<VkBuffer>(countBuffer),
	                                                  static_cast<VkDeviceSize>(countBufferOffset),
	                                                  maxDrawCount,
	                                                  stride);
}

//=== VK_EXT_external_memory_host ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryHostPointerPropertiesEXT
Device::getMemoryHostPointerPropertiesEXT(VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType, const void *pHostPointer) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetMemoryHostPointerPropertiesEXT &&
	                  "Function <vkGetMemoryHostPointerPropertiesEXT> needs extension <VK_EXT_external_memory_host> enabled!");

	VULKAN_HPP_NAMESPACE::MemoryHostPointerPropertiesEXT memoryHostPointerProperties;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetMemoryHostPointerPropertiesEXT(static_cast<VkDevice>(m_device),
	                                                         static_cast<VkExternalMemoryHandleTypeFlagBits>(handleType),
	                                                         pHostPointer,
	                                                         reinterpret_cast<VkMemoryHostPointerPropertiesEXT *>(&memoryHostPointerProperties)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getMemoryHostPointerPropertiesEXT");
	}
	return memoryHostPointerProperties;
}

//=== VK_AMD_buffer_marker ===

VULKAN_HPP_INLINE void CommandBuffer::writeBufferMarkerAMD(VULKAN_HPP_NAMESPACE::PipelineStageFlagBits pipelineStage,
                                                           VULKAN_HPP_NAMESPACE::Buffer dstBuffer,
                                                           VULKAN_HPP_NAMESPACE::DeviceSize dstOffset,
                                                           uint32_t marker) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdWriteBufferMarkerAMD && "Function <vkCmdWriteBufferMarkerAMD> needs extension <VK_AMD_buffer_marker> enabled!");

	getDispatcher()->vkCmdWriteBufferMarkerAMD(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                           static_cast<VkPipelineStageFlagBits>(pipelineStage),
	                                           static_cast<VkBuffer>(dstBuffer),
	                                           static_cast<VkDeviceSize>(dstOffset),
	                                           marker);
}

//=== VK_EXT_calibrated_timestamps ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::TimeDomainEXT> PhysicalDevice::getCalibrateableTimeDomainsEXT() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceCalibrateableTimeDomainsEXT &&
	                  "Function <vkGetPhysicalDeviceCalibrateableTimeDomainsEXT> needs extension <VK_EXT_calibrated_timestamps> enabled!");

	std::vector<VULKAN_HPP_NAMESPACE::TimeDomainEXT> timeDomains;
	uint32_t timeDomainCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    getDispatcher()->vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(static_cast<VkPhysicalDevice>(m_physicalDevice), &timeDomainCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && timeDomainCount)
		{
			timeDomains.resize(timeDomainCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(
			    static_cast<VkPhysicalDevice>(m_physicalDevice), &timeDomainCount, reinterpret_cast<VkTimeDomainEXT *>(timeDomains.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getCalibrateableTimeDomainsEXT");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(timeDomainCount <= timeDomains.size());
		if(timeDomainCount < timeDomains.size())
		{
			timeDomains.resize(timeDomainCount);
		}
	}
	return timeDomains;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::pair<std::vector<uint64_t>, uint64_t>
Device::getCalibratedTimestampsEXT(ArrayProxy<const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoEXT> const &timestampInfos) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetCalibratedTimestampsEXT &&
	                  "Function <vkGetCalibratedTimestampsEXT> needs extension <VK_EXT_calibrated_timestamps> enabled!");

	std::pair<std::vector<uint64_t>, uint64_t> data(std::piecewise_construct, std::forward_as_tuple(timestampInfos.size()), std::forward_as_tuple(0));
	std::vector<uint64_t> &timestamps = data.first;
	uint64_t &maxDeviation = data.second;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetCalibratedTimestampsEXT(static_cast<VkDevice>(m_device),
	                                                  timestampInfos.size(),
	                                                  reinterpret_cast<const VkCalibratedTimestampInfoEXT *>(timestampInfos.data()),
	                                                  timestamps.data(),
	                                                  &maxDeviation));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getCalibratedTimestampsEXT");
	}
	return data;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::pair<uint64_t, uint64_t>
Device::getCalibratedTimestampEXT(const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoEXT &timestampInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetCalibratedTimestampsEXT &&
	                  "Function <vkGetCalibratedTimestampsEXT> needs extension <VK_EXT_calibrated_timestamps> enabled!");

	std::pair<uint64_t, uint64_t> data;
	uint64_t &timestamp = data.first;
	uint64_t &maxDeviation = data.second;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetCalibratedTimestampsEXT(
	    static_cast<VkDevice>(m_device), 1, reinterpret_cast<const VkCalibratedTimestampInfoEXT *>(&timestampInfo), &timestamp, &maxDeviation));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getCalibratedTimestampEXT");
	}
	return data;
}

//=== VK_NV_mesh_shader ===

VULKAN_HPP_INLINE void CommandBuffer::drawMeshTasksNV(uint32_t taskCount, uint32_t firstTask) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdDrawMeshTasksNV && "Function <vkCmdDrawMeshTasksNV> needs extension <VK_NV_mesh_shader> enabled!");

	getDispatcher()->vkCmdDrawMeshTasksNV(static_cast<VkCommandBuffer>(m_commandBuffer), taskCount, firstTask);
}

VULKAN_HPP_INLINE void CommandBuffer::drawMeshTasksIndirectNV(VULKAN_HPP_NAMESPACE::Buffer buffer,
                                                              VULKAN_HPP_NAMESPACE::DeviceSize offset,
                                                              uint32_t drawCount,
                                                              uint32_t stride) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdDrawMeshTasksIndirectNV &&
	                  "Function <vkCmdDrawMeshTasksIndirectNV> needs extension <VK_NV_mesh_shader> enabled!");

	getDispatcher()->vkCmdDrawMeshTasksIndirectNV(
	    static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkBuffer>(buffer), static_cast<VkDeviceSize>(offset), drawCount, stride);
}

VULKAN_HPP_INLINE void CommandBuffer::drawMeshTasksIndirectCountNV(VULKAN_HPP_NAMESPACE::Buffer buffer,
                                                                   VULKAN_HPP_NAMESPACE::DeviceSize offset,
                                                                   VULKAN_HPP_NAMESPACE::Buffer countBuffer,
                                                                   VULKAN_HPP_NAMESPACE::DeviceSize countBufferOffset,
                                                                   uint32_t maxDrawCount,
                                                                   uint32_t stride) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdDrawMeshTasksIndirectCountNV &&
	                  "Function <vkCmdDrawMeshTasksIndirectCountNV> needs extension <VK_NV_mesh_shader> enabled!");

	getDispatcher()->vkCmdDrawMeshTasksIndirectCountNV(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                                   static_cast<VkBuffer>(buffer),
	                                                   static_cast<VkDeviceSize>(offset),
	                                                   static_cast<VkBuffer>(countBuffer),
	                                                   static_cast<VkDeviceSize>(countBufferOffset),
	                                                   maxDrawCount,
	                                                   stride);
}

//=== VK_NV_scissor_exclusive ===

VULKAN_HPP_INLINE void
CommandBuffer::setExclusiveScissorNV(uint32_t firstExclusiveScissor,
                                     ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const &exclusiveScissors) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetExclusiveScissorNV &&
	                  "Function <vkCmdSetExclusiveScissorNV> needs extension <VK_NV_scissor_exclusive> enabled!");

	getDispatcher()->vkCmdSetExclusiveScissorNV(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                            firstExclusiveScissor,
	                                            exclusiveScissors.size(),
	                                            reinterpret_cast<const VkRect2D *>(exclusiveScissors.data()));
}

//=== VK_NV_device_diagnostic_checkpoints ===

template<typename CheckpointMarkerType>
VULKAN_HPP_INLINE void CommandBuffer::setCheckpointNV(CheckpointMarkerType const &checkpointMarker) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetCheckpointNV &&
	                  "Function <vkCmdSetCheckpointNV> needs extension <VK_NV_device_diagnostic_checkpoints> enabled!");

	getDispatcher()->vkCmdSetCheckpointNV(static_cast<VkCommandBuffer>(m_commandBuffer), reinterpret_cast<const void *>(&checkpointMarker));
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::CheckpointDataNV> Queue::getCheckpointDataNV() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetQueueCheckpointDataNV &&
	                  "Function <vkGetQueueCheckpointDataNV> needs extension <VK_NV_device_diagnostic_checkpoints> enabled!");

	uint32_t checkpointDataCount;
	getDispatcher()->vkGetQueueCheckpointDataNV(static_cast<VkQueue>(m_queue), &checkpointDataCount, nullptr);
	std::vector<VULKAN_HPP_NAMESPACE::CheckpointDataNV> checkpointData(checkpointDataCount);
	getDispatcher()->vkGetQueueCheckpointDataNV(
	    static_cast<VkQueue>(m_queue), &checkpointDataCount, reinterpret_cast<VkCheckpointDataNV *>(checkpointData.data()));
	VULKAN_HPP_ASSERT(checkpointDataCount == checkpointData.size());
	return checkpointData;
}

//=== VK_KHR_timeline_semaphore ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint64_t Semaphore::getCounterValueKHR() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetSemaphoreCounterValueKHR &&
	                  "Function <vkGetSemaphoreCounterValueKHR> needs extension <VK_KHR_timeline_semaphore> enabled!");

	uint64_t value;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetSemaphoreCounterValueKHR(static_cast<VkDevice>(m_device), static_cast<VkSemaphore>(m_semaphore), &value));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Semaphore::getCounterValueKHR");
	}
	return value;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result Device::waitSemaphoresKHR(const VULKAN_HPP_NAMESPACE::SemaphoreWaitInfo &waitInfo,
                                                                                              uint64_t timeout) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkWaitSemaphoresKHR && "Function <vkWaitSemaphoresKHR> needs extension <VK_KHR_timeline_semaphore> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkWaitSemaphoresKHR(static_cast<VkDevice>(m_device), reinterpret_cast<const VkSemaphoreWaitInfo *>(&waitInfo), timeout));
	if((result != VULKAN_HPP_NAMESPACE::Result::eSuccess) && (result != VULKAN_HPP_NAMESPACE::Result::eTimeout))
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::waitSemaphoresKHR");
	}
	return result;
}

VULKAN_HPP_INLINE void Device::signalSemaphoreKHR(const VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo &signalInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkSignalSemaphoreKHR && "Function <vkSignalSemaphoreKHR> needs extension <VK_KHR_timeline_semaphore> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkSignalSemaphoreKHR(static_cast<VkDevice>(m_device), reinterpret_cast<const VkSemaphoreSignalInfo *>(&signalInfo)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::signalSemaphoreKHR");
	}
}

//=== VK_INTEL_performance_query ===

VULKAN_HPP_INLINE void Device::initializePerformanceApiINTEL(const VULKAN_HPP_NAMESPACE::InitializePerformanceApiInfoINTEL &initializeInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkInitializePerformanceApiINTEL &&
	                  "Function <vkInitializePerformanceApiINTEL> needs extension <VK_INTEL_performance_query> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkInitializePerformanceApiINTEL(
	    static_cast<VkDevice>(m_device), reinterpret_cast<const VkInitializePerformanceApiInfoINTEL *>(&initializeInfo)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::initializePerformanceApiINTEL");
	}
}

VULKAN_HPP_INLINE void Device::uninitializePerformanceApiINTEL() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkUninitializePerformanceApiINTEL &&
	                  "Function <vkUninitializePerformanceApiINTEL> needs extension <VK_INTEL_performance_query> enabled!");

	getDispatcher()->vkUninitializePerformanceApiINTEL(static_cast<VkDevice>(m_device));
}

VULKAN_HPP_INLINE void CommandBuffer::setPerformanceMarkerINTEL(const VULKAN_HPP_NAMESPACE::PerformanceMarkerInfoINTEL &markerInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetPerformanceMarkerINTEL &&
	                  "Function <vkCmdSetPerformanceMarkerINTEL> needs extension <VK_INTEL_performance_query> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkCmdSetPerformanceMarkerINTEL(
	    static_cast<VkCommandBuffer>(m_commandBuffer), reinterpret_cast<const VkPerformanceMarkerInfoINTEL *>(&markerInfo)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::setPerformanceMarkerINTEL");
	}
}

VULKAN_HPP_INLINE void CommandBuffer::setPerformanceStreamMarkerINTEL(const VULKAN_HPP_NAMESPACE::PerformanceStreamMarkerInfoINTEL &markerInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetPerformanceStreamMarkerINTEL &&
	                  "Function <vkCmdSetPerformanceStreamMarkerINTEL> needs extension <VK_INTEL_performance_query> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkCmdSetPerformanceStreamMarkerINTEL(
	    static_cast<VkCommandBuffer>(m_commandBuffer), reinterpret_cast<const VkPerformanceStreamMarkerInfoINTEL *>(&markerInfo)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::setPerformanceStreamMarkerINTEL");
	}
}

VULKAN_HPP_INLINE void CommandBuffer::setPerformanceOverrideINTEL(const VULKAN_HPP_NAMESPACE::PerformanceOverrideInfoINTEL &overrideInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetPerformanceOverrideINTEL &&
	                  "Function <vkCmdSetPerformanceOverrideINTEL> needs extension <VK_INTEL_performance_query> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkCmdSetPerformanceOverrideINTEL(
	    static_cast<VkCommandBuffer>(m_commandBuffer), reinterpret_cast<const VkPerformanceOverrideInfoINTEL *>(&overrideInfo)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::setPerformanceOverrideINTEL");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::PerformanceConfigurationINTEL
Device::acquirePerformanceConfigurationINTEL(VULKAN_HPP_NAMESPACE::PerformanceConfigurationAcquireInfoINTEL const &acquireInfo) const
{
	return VULKAN_HPP_RAII_NAMESPACE::PerformanceConfigurationINTEL(*this, acquireInfo);
}

VULKAN_HPP_INLINE void Queue::setPerformanceConfigurationINTEL(VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkQueueSetPerformanceConfigurationINTEL &&
	                  "Function <vkQueueSetPerformanceConfigurationINTEL> needs extension <VK_INTEL_performance_query> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkQueueSetPerformanceConfigurationINTEL(
	    static_cast<VkQueue>(m_queue), static_cast<VkPerformanceConfigurationINTEL>(configuration)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Queue::setPerformanceConfigurationINTEL");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PerformanceValueINTEL
Device::getPerformanceParameterINTEL(VULKAN_HPP_NAMESPACE::PerformanceParameterTypeINTEL parameter) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPerformanceParameterINTEL &&
	                  "Function <vkGetPerformanceParameterINTEL> needs extension <VK_INTEL_performance_query> enabled!");

	VULKAN_HPP_NAMESPACE::PerformanceValueINTEL value;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetPerformanceParameterINTEL(
	    static_cast<VkDevice>(m_device), static_cast<VkPerformanceParameterTypeINTEL>(parameter), reinterpret_cast<VkPerformanceValueINTEL *>(&value)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getPerformanceParameterINTEL");
	}
	return value;
}

//=== VK_AMD_display_native_hdr ===

VULKAN_HPP_INLINE void SwapchainKHR::setLocalDimmingAMD(VULKAN_HPP_NAMESPACE::Bool32 localDimmingEnable) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkSetLocalDimmingAMD && "Function <vkSetLocalDimmingAMD> needs extension <VK_AMD_display_native_hdr> enabled!");

	getDispatcher()->vkSetLocalDimmingAMD(
	    static_cast<VkDevice>(m_device), static_cast<VkSwapchainKHR>(m_swapchain), static_cast<VkBool32>(localDimmingEnable));
}

#	if defined(VK_USE_PLATFORM_FUCHSIA)
//=== VK_FUCHSIA_imagepipe_surface ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
Instance::createImagePipeSurfaceFUCHSIA(VULKAN_HPP_NAMESPACE::ImagePipeSurfaceCreateInfoFUCHSIA const &createInfo,
                                        VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR(*this, createInfo, allocator);
}
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

#	if defined(VK_USE_PLATFORM_METAL_EXT)
//=== VK_EXT_metal_surface ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
Instance::createMetalSurfaceEXT(VULKAN_HPP_NAMESPACE::MetalSurfaceCreateInfoEXT const &createInfo,
                                VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR(*this, createInfo, allocator);
}
#	endif /*VK_USE_PLATFORM_METAL_EXT*/

//=== VK_KHR_fragment_shading_rate ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR>
PhysicalDevice::getFragmentShadingRatesKHR() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceFragmentShadingRatesKHR &&
	                  "Function <vkGetPhysicalDeviceFragmentShadingRatesKHR> needs extension <VK_KHR_fragment_shading_rate> enabled!");

	std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR> fragmentShadingRates;
	uint32_t fragmentShadingRateCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetPhysicalDeviceFragmentShadingRatesKHR(
		    static_cast<VkPhysicalDevice>(m_physicalDevice), &fragmentShadingRateCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && fragmentShadingRateCount)
		{
			fragmentShadingRates.resize(fragmentShadingRateCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetPhysicalDeviceFragmentShadingRatesKHR(
			    static_cast<VkPhysicalDevice>(m_physicalDevice),
			    &fragmentShadingRateCount,
			    reinterpret_cast<VkPhysicalDeviceFragmentShadingRateKHR *>(fragmentShadingRates.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getFragmentShadingRatesKHR");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(fragmentShadingRateCount <= fragmentShadingRates.size());
		if(fragmentShadingRateCount < fragmentShadingRates.size())
		{
			fragmentShadingRates.resize(fragmentShadingRateCount);
		}
	}
	return fragmentShadingRates;
}

VULKAN_HPP_INLINE void
CommandBuffer::setFragmentShadingRateKHR(const VULKAN_HPP_NAMESPACE::Extent2D &fragmentSize,
                                         const VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR combinerOps[2]) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetFragmentShadingRateKHR &&
	                  "Function <vkCmdSetFragmentShadingRateKHR> needs extension <VK_KHR_fragment_shading_rate> enabled!");

	getDispatcher()->vkCmdSetFragmentShadingRateKHR(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                                reinterpret_cast<const VkExtent2D *>(&fragmentSize),
	                                                reinterpret_cast<const VkFragmentShadingRateCombinerOpKHR *>(combinerOps));
}

//=== VK_EXT_buffer_device_address ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceAddress
Device::getBufferAddressEXT(const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetBufferDeviceAddressEXT &&
	                  "Function <vkGetBufferDeviceAddressEXT> needs extension <VK_EXT_buffer_device_address> enabled!");

	return static_cast<VULKAN_HPP_NAMESPACE::DeviceAddress>(
	    getDispatcher()->vkGetBufferDeviceAddressEXT(static_cast<VkDevice>(m_device), reinterpret_cast<const VkBufferDeviceAddressInfo *>(&info)));
}

//=== VK_EXT_tooling_info ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties> PhysicalDevice::getToolPropertiesEXT() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceToolPropertiesEXT &&
	                  "Function <vkGetPhysicalDeviceToolPropertiesEXT> needs extension <VK_EXT_tooling_info> enabled!");

	std::vector<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties> toolProperties;
	uint32_t toolCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    getDispatcher()->vkGetPhysicalDeviceToolPropertiesEXT(static_cast<VkPhysicalDevice>(m_physicalDevice), &toolCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && toolCount)
		{
			toolProperties.resize(toolCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetPhysicalDeviceToolPropertiesEXT(
			    static_cast<VkPhysicalDevice>(m_physicalDevice), &toolCount, reinterpret_cast<VkPhysicalDeviceToolProperties *>(toolProperties.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getToolPropertiesEXT");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(toolCount <= toolProperties.size());
		if(toolCount < toolProperties.size())
		{
			toolProperties.resize(toolCount);
		}
	}
	return toolProperties;
}

//=== VK_KHR_present_wait ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result SwapchainKHR::waitForPresent(uint64_t presentId, uint64_t timeout) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkWaitForPresentKHR && "Function <vkWaitForPresentKHR> needs extension <VK_KHR_present_wait> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkWaitForPresentKHR(static_cast<VkDevice>(m_device), static_cast<VkSwapchainKHR>(m_swapchain), presentId, timeout));
	if((result != VULKAN_HPP_NAMESPACE::Result::eSuccess) && (result != VULKAN_HPP_NAMESPACE::Result::eTimeout) &&
	   (result != VULKAN_HPP_NAMESPACE::Result::eSuboptimalKHR))
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::SwapchainKHR::waitForPresent");
	}
	return result;
}

//=== VK_NV_cooperative_matrix ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV>
PhysicalDevice::getCooperativeMatrixPropertiesNV() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceCooperativeMatrixPropertiesNV &&
	                  "Function <vkGetPhysicalDeviceCooperativeMatrixPropertiesNV> needs extension <VK_NV_cooperative_matrix> enabled!");

	std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV> properties;
	uint32_t propertyCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    getDispatcher()->vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(static_cast<VkPhysicalDevice>(m_physicalDevice), &propertyCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && propertyCount)
		{
			properties.resize(propertyCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(
			    static_cast<VkPhysicalDevice>(m_physicalDevice), &propertyCount, reinterpret_cast<VkCooperativeMatrixPropertiesNV *>(properties.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getCooperativeMatrixPropertiesNV");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(propertyCount <= properties.size());
		if(propertyCount < properties.size())
		{
			properties.resize(propertyCount);
		}
	}
	return properties;
}

//=== VK_NV_coverage_reduction_mode ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV>
PhysicalDevice::getSupportedFramebufferMixedSamplesCombinationsNV() const
{
	VULKAN_HPP_ASSERT(
	    getDispatcher()->vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV &&
	    "Function <vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV> needs extension <VK_NV_coverage_reduction_mode> enabled!");

	std::vector<VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV> combinations;
	uint32_t combinationCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(
		    static_cast<VkPhysicalDevice>(m_physicalDevice), &combinationCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && combinationCount)
		{
			combinations.resize(combinationCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(
			    static_cast<VkPhysicalDevice>(m_physicalDevice),
			    &combinationCount,
			    reinterpret_cast<VkFramebufferMixedSamplesCombinationNV *>(combinations.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getSupportedFramebufferMixedSamplesCombinationsNV");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(combinationCount <= combinations.size());
		if(combinationCount < combinations.size())
		{
			combinations.resize(combinationCount);
		}
	}
	return combinations;
}

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
//=== VK_EXT_full_screen_exclusive ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::PresentModeKHR>
PhysicalDevice::getSurfacePresentModes2EXT(const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR &surfaceInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceSurfacePresentModes2EXT &&
	                  "Function <vkGetPhysicalDeviceSurfacePresentModes2EXT> needs extension <VK_EXT_full_screen_exclusive> enabled!");

	std::vector<VULKAN_HPP_NAMESPACE::PresentModeKHR> presentModes;
	uint32_t presentModeCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    getDispatcher()->vkGetPhysicalDeviceSurfacePresentModes2EXT(static_cast<VkPhysicalDevice>(m_physicalDevice),
		                                                                reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>(&surfaceInfo),
		                                                                &presentModeCount,
		                                                                nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && presentModeCount)
		{
			presentModes.resize(presentModeCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
			    getDispatcher()->vkGetPhysicalDeviceSurfacePresentModes2EXT(static_cast<VkPhysicalDevice>(m_physicalDevice),
			                                                                reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>(&surfaceInfo),
			                                                                &presentModeCount,
			                                                                reinterpret_cast<VkPresentModeKHR *>(presentModes.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::getSurfacePresentModes2EXT");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(presentModeCount <= presentModes.size());
		if(presentModeCount < presentModes.size())
		{
			presentModes.resize(presentModeCount);
		}
	}
	return presentModes;
}

VULKAN_HPP_INLINE void SwapchainKHR::acquireFullScreenExclusiveModeEXT() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkAcquireFullScreenExclusiveModeEXT &&
	                  "Function <vkAcquireFullScreenExclusiveModeEXT> needs extension <VK_EXT_full_screen_exclusive> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkAcquireFullScreenExclusiveModeEXT(static_cast<VkDevice>(m_device), static_cast<VkSwapchainKHR>(m_swapchain)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::SwapchainKHR::acquireFullScreenExclusiveModeEXT");
	}
}

VULKAN_HPP_INLINE void SwapchainKHR::releaseFullScreenExclusiveModeEXT() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkReleaseFullScreenExclusiveModeEXT &&
	                  "Function <vkReleaseFullScreenExclusiveModeEXT> needs extension <VK_EXT_full_screen_exclusive> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkReleaseFullScreenExclusiveModeEXT(static_cast<VkDevice>(m_device), static_cast<VkSwapchainKHR>(m_swapchain)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::SwapchainKHR::releaseFullScreenExclusiveModeEXT");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR
Device::getGroupSurfacePresentModes2EXT(const VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR &surfaceInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetDeviceGroupSurfacePresentModes2EXT &&
	                  "Function <vkGetDeviceGroupSurfacePresentModes2EXT> needs extension <VK_EXT_full_screen_exclusive> enabled!");

	VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR modes;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetDeviceGroupSurfacePresentModes2EXT(static_cast<VkDevice>(m_device),
	                                                             reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>(&surfaceInfo),
	                                                             reinterpret_cast<VkDeviceGroupPresentModeFlagsKHR *>(&modes)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getGroupSurfacePresentModes2EXT");
	}
	return modes;
}
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

//=== VK_EXT_headless_surface ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
Instance::createHeadlessSurfaceEXT(VULKAN_HPP_NAMESPACE::HeadlessSurfaceCreateInfoEXT const &createInfo,
                                   VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR(*this, createInfo, allocator);
}

//=== VK_KHR_buffer_device_address ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceAddress
Device::getBufferAddressKHR(const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetBufferDeviceAddressKHR &&
	                  "Function <vkGetBufferDeviceAddressKHR> needs extension <VK_KHR_buffer_device_address> enabled!");

	return static_cast<VULKAN_HPP_NAMESPACE::DeviceAddress>(
	    getDispatcher()->vkGetBufferDeviceAddressKHR(static_cast<VkDevice>(m_device), reinterpret_cast<const VkBufferDeviceAddressInfo *>(&info)));
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint64_t
Device::getBufferOpaqueCaptureAddressKHR(const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetBufferOpaqueCaptureAddressKHR &&
	                  "Function <vkGetBufferOpaqueCaptureAddressKHR> needs extension <VK_KHR_buffer_device_address> enabled!");

	return getDispatcher()->vkGetBufferOpaqueCaptureAddressKHR(static_cast<VkDevice>(m_device),
	                                                           reinterpret_cast<const VkBufferDeviceAddressInfo *>(&info));
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint64_t
Device::getMemoryOpaqueCaptureAddressKHR(const VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetDeviceMemoryOpaqueCaptureAddressKHR &&
	                  "Function <vkGetDeviceMemoryOpaqueCaptureAddressKHR> needs extension <VK_KHR_buffer_device_address> enabled!");

	return getDispatcher()->vkGetDeviceMemoryOpaqueCaptureAddressKHR(static_cast<VkDevice>(m_device),
	                                                                 reinterpret_cast<const VkDeviceMemoryOpaqueCaptureAddressInfo *>(&info));
}

//=== VK_EXT_line_rasterization ===

VULKAN_HPP_INLINE void CommandBuffer::setLineStippleEXT(uint32_t lineStippleFactor, uint16_t lineStipplePattern) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetLineStippleEXT && "Function <vkCmdSetLineStippleEXT> needs extension <VK_EXT_line_rasterization> enabled!");

	getDispatcher()->vkCmdSetLineStippleEXT(static_cast<VkCommandBuffer>(m_commandBuffer), lineStippleFactor, lineStipplePattern);
}

//=== VK_EXT_host_query_reset ===

VULKAN_HPP_INLINE void QueryPool::resetEXT(uint32_t firstQuery, uint32_t queryCount) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkResetQueryPoolEXT && "Function <vkResetQueryPoolEXT> needs extension <VK_EXT_host_query_reset> enabled!");

	getDispatcher()->vkResetQueryPoolEXT(static_cast<VkDevice>(m_device), static_cast<VkQueryPool>(m_queryPool), firstQuery, queryCount);
}

//=== VK_EXT_extended_dynamic_state ===

VULKAN_HPP_INLINE void CommandBuffer::setCullModeEXT(VULKAN_HPP_NAMESPACE::CullModeFlags cullMode) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetCullModeEXT && "Function <vkCmdSetCullModeEXT> needs extension <VK_EXT_extended_dynamic_state> enabled!");

	getDispatcher()->vkCmdSetCullModeEXT(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkCullModeFlags>(cullMode));
}

VULKAN_HPP_INLINE void CommandBuffer::setFrontFaceEXT(VULKAN_HPP_NAMESPACE::FrontFace frontFace) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetFrontFaceEXT && "Function <vkCmdSetFrontFaceEXT> needs extension <VK_EXT_extended_dynamic_state> enabled!");

	getDispatcher()->vkCmdSetFrontFaceEXT(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkFrontFace>(frontFace));
}

VULKAN_HPP_INLINE void CommandBuffer::setPrimitiveTopologyEXT(VULKAN_HPP_NAMESPACE::PrimitiveTopology primitiveTopology) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetPrimitiveTopologyEXT &&
	                  "Function <vkCmdSetPrimitiveTopologyEXT> needs extension <VK_EXT_extended_dynamic_state> enabled!");

	getDispatcher()->vkCmdSetPrimitiveTopologyEXT(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkPrimitiveTopology>(primitiveTopology));
}

VULKAN_HPP_INLINE void
CommandBuffer::setViewportWithCountEXT(ArrayProxy<const VULKAN_HPP_NAMESPACE::Viewport> const &viewports) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetViewportWithCountEXT &&
	                  "Function <vkCmdSetViewportWithCountEXT> needs extension <VK_EXT_extended_dynamic_state> enabled!");

	getDispatcher()->vkCmdSetViewportWithCountEXT(
	    static_cast<VkCommandBuffer>(m_commandBuffer), viewports.size(), reinterpret_cast<const VkViewport *>(viewports.data()));
}

VULKAN_HPP_INLINE void CommandBuffer::setScissorWithCountEXT(ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const &scissors) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetScissorWithCountEXT &&
	                  "Function <vkCmdSetScissorWithCountEXT> needs extension <VK_EXT_extended_dynamic_state> enabled!");

	getDispatcher()->vkCmdSetScissorWithCountEXT(
	    static_cast<VkCommandBuffer>(m_commandBuffer), scissors.size(), reinterpret_cast<const VkRect2D *>(scissors.data()));
}

VULKAN_HPP_INLINE void CommandBuffer::bindVertexBuffers2EXT(uint32_t firstBinding,
                                                            ArrayProxy<const VULKAN_HPP_NAMESPACE::Buffer> const &buffers,
                                                            ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &offsets,
                                                            ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &sizes,
                                                            ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const &strides) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdBindVertexBuffers2EXT &&
	                  "Function <vkCmdBindVertexBuffers2EXT> needs extension <VK_EXT_extended_dynamic_state> enabled!");

	if(buffers.size() != offsets.size())
	{
		throw LogicError(VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::bindVertexBuffers2EXT: buffers.size() != offsets.size()");
	}
	if(!sizes.empty() && buffers.size() != sizes.size())
	{
		throw LogicError(VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::bindVertexBuffers2EXT: buffers.size() != sizes.size()");
	}
	if(!strides.empty() && buffers.size() != strides.size())
	{
		throw LogicError(VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::bindVertexBuffers2EXT: buffers.size() != strides.size()");
	}
	getDispatcher()->vkCmdBindVertexBuffers2EXT(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                            firstBinding,
	                                            buffers.size(),
	                                            reinterpret_cast<const VkBuffer *>(buffers.data()),
	                                            reinterpret_cast<const VkDeviceSize *>(offsets.data()),
	                                            reinterpret_cast<const VkDeviceSize *>(sizes.data()),
	                                            reinterpret_cast<const VkDeviceSize *>(strides.data()));
}

VULKAN_HPP_INLINE void CommandBuffer::setDepthTestEnableEXT(VULKAN_HPP_NAMESPACE::Bool32 depthTestEnable) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetDepthTestEnableEXT &&
	                  "Function <vkCmdSetDepthTestEnableEXT> needs extension <VK_EXT_extended_dynamic_state> enabled!");

	getDispatcher()->vkCmdSetDepthTestEnableEXT(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkBool32>(depthTestEnable));
}

VULKAN_HPP_INLINE void CommandBuffer::setDepthWriteEnableEXT(VULKAN_HPP_NAMESPACE::Bool32 depthWriteEnable) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetDepthWriteEnableEXT &&
	                  "Function <vkCmdSetDepthWriteEnableEXT> needs extension <VK_EXT_extended_dynamic_state> enabled!");

	getDispatcher()->vkCmdSetDepthWriteEnableEXT(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkBool32>(depthWriteEnable));
}

VULKAN_HPP_INLINE void CommandBuffer::setDepthCompareOpEXT(VULKAN_HPP_NAMESPACE::CompareOp depthCompareOp) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetDepthCompareOpEXT &&
	                  "Function <vkCmdSetDepthCompareOpEXT> needs extension <VK_EXT_extended_dynamic_state> enabled!");

	getDispatcher()->vkCmdSetDepthCompareOpEXT(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkCompareOp>(depthCompareOp));
}

VULKAN_HPP_INLINE void CommandBuffer::setDepthBoundsTestEnableEXT(VULKAN_HPP_NAMESPACE::Bool32 depthBoundsTestEnable) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetDepthBoundsTestEnableEXT &&
	                  "Function <vkCmdSetDepthBoundsTestEnableEXT> needs extension <VK_EXT_extended_dynamic_state> enabled!");

	getDispatcher()->vkCmdSetDepthBoundsTestEnableEXT(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkBool32>(depthBoundsTestEnable));
}

VULKAN_HPP_INLINE void CommandBuffer::setStencilTestEnableEXT(VULKAN_HPP_NAMESPACE::Bool32 stencilTestEnable) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetStencilTestEnableEXT &&
	                  "Function <vkCmdSetStencilTestEnableEXT> needs extension <VK_EXT_extended_dynamic_state> enabled!");

	getDispatcher()->vkCmdSetStencilTestEnableEXT(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkBool32>(stencilTestEnable));
}

VULKAN_HPP_INLINE void CommandBuffer::setStencilOpEXT(VULKAN_HPP_NAMESPACE::StencilFaceFlags faceMask,
                                                      VULKAN_HPP_NAMESPACE::StencilOp failOp,
                                                      VULKAN_HPP_NAMESPACE::StencilOp passOp,
                                                      VULKAN_HPP_NAMESPACE::StencilOp depthFailOp,
                                                      VULKAN_HPP_NAMESPACE::CompareOp compareOp) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetStencilOpEXT && "Function <vkCmdSetStencilOpEXT> needs extension <VK_EXT_extended_dynamic_state> enabled!");

	getDispatcher()->vkCmdSetStencilOpEXT(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                      static_cast<VkStencilFaceFlags>(faceMask),
	                                      static_cast<VkStencilOp>(failOp),
	                                      static_cast<VkStencilOp>(passOp),
	                                      static_cast<VkStencilOp>(depthFailOp),
	                                      static_cast<VkCompareOp>(compareOp));
}

//=== VK_KHR_deferred_host_operations ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::DeferredOperationKHR
Device::createDeferredOperationKHR(VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::DeferredOperationKHR(*this, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint32_t DeferredOperationKHR::getMaxConcurrency() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetDeferredOperationMaxConcurrencyKHR &&
	                  "Function <vkGetDeferredOperationMaxConcurrencyKHR> needs extension <VK_KHR_deferred_host_operations> enabled!");

	return getDispatcher()->vkGetDeferredOperationMaxConcurrencyKHR(static_cast<VkDevice>(m_device), static_cast<VkDeferredOperationKHR>(m_operation));
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result DeferredOperationKHR::getResult() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetDeferredOperationResultKHR &&
	                  "Function <vkGetDeferredOperationResultKHR> needs extension <VK_KHR_deferred_host_operations> enabled!");

	return static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetDeferredOperationResultKHR(static_cast<VkDevice>(m_device), static_cast<VkDeferredOperationKHR>(m_operation)));
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result DeferredOperationKHR::join() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkDeferredOperationJoinKHR &&
	                  "Function <vkDeferredOperationJoinKHR> needs extension <VK_KHR_deferred_host_operations> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkDeferredOperationJoinKHR(static_cast<VkDevice>(m_device), static_cast<VkDeferredOperationKHR>(m_operation)));
	if((result != VULKAN_HPP_NAMESPACE::Result::eSuccess) && (result != VULKAN_HPP_NAMESPACE::Result::eThreadDoneKHR) &&
	   (result != VULKAN_HPP_NAMESPACE::Result::eThreadIdleKHR))
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::DeferredOperationKHR::join");
	}
	return result;
}

//=== VK_KHR_pipeline_executable_properties ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR>
Device::getPipelineExecutablePropertiesKHR(const VULKAN_HPP_NAMESPACE::PipelineInfoKHR &pipelineInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPipelineExecutablePropertiesKHR &&
	                  "Function <vkGetPipelineExecutablePropertiesKHR> needs extension <VK_KHR_pipeline_executable_properties> enabled!");

	std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR> properties;
	uint32_t executableCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetPipelineExecutablePropertiesKHR(
		    static_cast<VkDevice>(m_device), reinterpret_cast<const VkPipelineInfoKHR *>(&pipelineInfo), &executableCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && executableCount)
		{
			properties.resize(executableCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
			    getDispatcher()->vkGetPipelineExecutablePropertiesKHR(static_cast<VkDevice>(m_device),
			                                                          reinterpret_cast<const VkPipelineInfoKHR *>(&pipelineInfo),
			                                                          &executableCount,
			                                                          reinterpret_cast<VkPipelineExecutablePropertiesKHR *>(properties.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getPipelineExecutablePropertiesKHR");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(executableCount <= properties.size());
		if(executableCount < properties.size())
		{
			properties.resize(executableCount);
		}
	}
	return properties;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR>
Device::getPipelineExecutableStatisticsKHR(const VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR &executableInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPipelineExecutableStatisticsKHR &&
	                  "Function <vkGetPipelineExecutableStatisticsKHR> needs extension <VK_KHR_pipeline_executable_properties> enabled!");

	std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR> statistics;
	uint32_t statisticCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetPipelineExecutableStatisticsKHR(
		    static_cast<VkDevice>(m_device), reinterpret_cast<const VkPipelineExecutableInfoKHR *>(&executableInfo), &statisticCount, nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && statisticCount)
		{
			statistics.resize(statisticCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
			    getDispatcher()->vkGetPipelineExecutableStatisticsKHR(static_cast<VkDevice>(m_device),
			                                                          reinterpret_cast<const VkPipelineExecutableInfoKHR *>(&executableInfo),
			                                                          &statisticCount,
			                                                          reinterpret_cast<VkPipelineExecutableStatisticKHR *>(statistics.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getPipelineExecutableStatisticsKHR");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(statisticCount <= statistics.size());
		if(statisticCount < statistics.size())
		{
			statistics.resize(statisticCount);
		}
	}
	return statistics;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR>
Device::getPipelineExecutableInternalRepresentationsKHR(const VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR &executableInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPipelineExecutableInternalRepresentationsKHR &&
	                  "Function <vkGetPipelineExecutableInternalRepresentationsKHR> needs extension <VK_KHR_pipeline_executable_properties> enabled!");

	std::vector<VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR> internalRepresentations;
	uint32_t internalRepresentationCount;
	VULKAN_HPP_NAMESPACE::Result result;
	do
	{
		result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
		    getDispatcher()->vkGetPipelineExecutableInternalRepresentationsKHR(static_cast<VkDevice>(m_device),
		                                                                       reinterpret_cast<const VkPipelineExecutableInfoKHR *>(&executableInfo),
		                                                                       &internalRepresentationCount,
		                                                                       nullptr));
		if((result == VULKAN_HPP_NAMESPACE::Result::eSuccess) && internalRepresentationCount)
		{
			internalRepresentations.resize(internalRepresentationCount);
			result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetPipelineExecutableInternalRepresentationsKHR(
			    static_cast<VkDevice>(m_device),
			    reinterpret_cast<const VkPipelineExecutableInfoKHR *>(&executableInfo),
			    &internalRepresentationCount,
			    reinterpret_cast<VkPipelineExecutableInternalRepresentationKHR *>(internalRepresentations.data())));
		}
	} while(result == VULKAN_HPP_NAMESPACE::Result::eIncomplete);
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getPipelineExecutableInternalRepresentationsKHR");
	}
	if(result == VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		VULKAN_HPP_ASSERT(internalRepresentationCount <= internalRepresentations.size());
		if(internalRepresentationCount < internalRepresentations.size())
		{
			internalRepresentations.resize(internalRepresentationCount);
		}
	}
	return internalRepresentations;
}

//=== VK_NV_device_generated_commands ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2
Device::getGeneratedCommandsMemoryRequirementsNV(const VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoNV &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetGeneratedCommandsMemoryRequirementsNV &&
	                  "Function <vkGetGeneratedCommandsMemoryRequirementsNV> needs extension <VK_NV_device_generated_commands> enabled!");

	VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;
	getDispatcher()->vkGetGeneratedCommandsMemoryRequirementsNV(static_cast<VkDevice>(m_device),
	                                                            reinterpret_cast<const VkGeneratedCommandsMemoryRequirementsInfoNV *>(&info),
	                                                            reinterpret_cast<VkMemoryRequirements2 *>(&memoryRequirements));
	return memoryRequirements;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...>
Device::getGeneratedCommandsMemoryRequirementsNV(const VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoNV &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetGeneratedCommandsMemoryRequirementsNV &&
	                  "Function <vkGetGeneratedCommandsMemoryRequirementsNV> needs extension <VK_NV_device_generated_commands> enabled!");

	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::MemoryRequirements2 &memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();
	getDispatcher()->vkGetGeneratedCommandsMemoryRequirementsNV(static_cast<VkDevice>(m_device),
	                                                            reinterpret_cast<const VkGeneratedCommandsMemoryRequirementsInfoNV *>(&info),
	                                                            reinterpret_cast<VkMemoryRequirements2 *>(&memoryRequirements));
	return structureChain;
}

VULKAN_HPP_INLINE void
CommandBuffer::preprocessGeneratedCommandsNV(const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV &generatedCommandsInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdPreprocessGeneratedCommandsNV &&
	                  "Function <vkCmdPreprocessGeneratedCommandsNV> needs extension <VK_NV_device_generated_commands> enabled!");

	getDispatcher()->vkCmdPreprocessGeneratedCommandsNV(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                                    reinterpret_cast<const VkGeneratedCommandsInfoNV *>(&generatedCommandsInfo));
}

VULKAN_HPP_INLINE void
CommandBuffer::executeGeneratedCommandsNV(VULKAN_HPP_NAMESPACE::Bool32 isPreprocessed,
                                          const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV &generatedCommandsInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdExecuteGeneratedCommandsNV &&
	                  "Function <vkCmdExecuteGeneratedCommandsNV> needs extension <VK_NV_device_generated_commands> enabled!");

	getDispatcher()->vkCmdExecuteGeneratedCommandsNV(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                                 static_cast<VkBool32>(isPreprocessed),
	                                                 reinterpret_cast<const VkGeneratedCommandsInfoNV *>(&generatedCommandsInfo));
}

VULKAN_HPP_INLINE void CommandBuffer::bindPipelineShaderGroupNV(VULKAN_HPP_NAMESPACE::PipelineBindPoint pipelineBindPoint,
                                                                VULKAN_HPP_NAMESPACE::Pipeline pipeline,
                                                                uint32_t groupIndex) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdBindPipelineShaderGroupNV &&
	                  "Function <vkCmdBindPipelineShaderGroupNV> needs extension <VK_NV_device_generated_commands> enabled!");

	getDispatcher()->vkCmdBindPipelineShaderGroupNV(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                                static_cast<VkPipelineBindPoint>(pipelineBindPoint),
	                                                static_cast<VkPipeline>(pipeline),
	                                                groupIndex);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::IndirectCommandsLayoutNV
Device::createIndirectCommandsLayoutNV(VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoNV const &createInfo,
                                       VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::IndirectCommandsLayoutNV(*this, createInfo, allocator);
}

//=== VK_EXT_acquire_drm_display ===

VULKAN_HPP_INLINE void PhysicalDevice::acquireDrmDisplayEXT(int32_t drmFd, VULKAN_HPP_NAMESPACE::DisplayKHR display) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkAcquireDrmDisplayEXT && "Function <vkAcquireDrmDisplayEXT> needs extension <VK_EXT_acquire_drm_display> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkAcquireDrmDisplayEXT(static_cast<VkPhysicalDevice>(m_physicalDevice), drmFd, static_cast<VkDisplayKHR>(display)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::acquireDrmDisplayEXT");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::DisplayKHR PhysicalDevice::getDrmDisplayEXT(int32_t drmFd, uint32_t connectorId) const
{
	return VULKAN_HPP_RAII_NAMESPACE::DisplayKHR(*this, drmFd, connectorId);
}

//=== VK_EXT_private_data ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::PrivateDataSlot
Device::createPrivateDataSlotEXT(VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo const &createInfo,
                                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::PrivateDataSlot(*this, createInfo, allocator);
}

VULKAN_HPP_INLINE void Device::destroyPrivateDataSlotEXT(VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,
                                                         Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkDestroyPrivateDataSlotEXT &&
	                  "Function <vkDestroyPrivateDataSlotEXT> needs extension <VK_EXT_private_data> enabled!");

	getDispatcher()->vkDestroyPrivateDataSlotEXT(
	    static_cast<VkDevice>(m_device),
	    static_cast<VkPrivateDataSlot>(privateDataSlot),
	    reinterpret_cast<const VkAllocationCallbacks *>(static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>(allocator)));
}

VULKAN_HPP_INLINE void Device::setPrivateDataEXT(VULKAN_HPP_NAMESPACE::ObjectType objectType_,
                                                 uint64_t objectHandle,
                                                 VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot,
                                                 uint64_t data) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkSetPrivateDataEXT && "Function <vkSetPrivateDataEXT> needs extension <VK_EXT_private_data> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkSetPrivateDataEXT(
	    static_cast<VkDevice>(m_device), static_cast<VkObjectType>(objectType_), objectHandle, static_cast<VkPrivateDataSlot>(privateDataSlot), data));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::setPrivateDataEXT");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint64_t Device::getPrivateDataEXT(VULKAN_HPP_NAMESPACE::ObjectType objectType_,
                                                                          uint64_t objectHandle,
                                                                          VULKAN_HPP_NAMESPACE::PrivateDataSlot privateDataSlot) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPrivateDataEXT && "Function <vkGetPrivateDataEXT> needs extension <VK_EXT_private_data> enabled!");

	uint64_t data;
	getDispatcher()->vkGetPrivateDataEXT(
	    static_cast<VkDevice>(m_device), static_cast<VkObjectType>(objectType_), objectHandle, static_cast<VkPrivateDataSlot>(privateDataSlot), &data);
	return data;
}

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
//=== VK_KHR_video_encode_queue ===

VULKAN_HPP_INLINE void CommandBuffer::encodeVideoKHR(const VULKAN_HPP_NAMESPACE::VideoEncodeInfoKHR &encodeInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdEncodeVideoKHR && "Function <vkCmdEncodeVideoKHR> needs extension <VK_KHR_video_encode_queue> enabled!");

	getDispatcher()->vkCmdEncodeVideoKHR(static_cast<VkCommandBuffer>(m_commandBuffer), reinterpret_cast<const VkVideoEncodeInfoKHR *>(&encodeInfo));
}
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

//=== VK_KHR_synchronization2 ===

VULKAN_HPP_INLINE void CommandBuffer::setEvent2KHR(VULKAN_HPP_NAMESPACE::Event event,
                                                   const VULKAN_HPP_NAMESPACE::DependencyInfo &dependencyInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetEvent2KHR && "Function <vkCmdSetEvent2KHR> needs extension <VK_KHR_synchronization2> enabled!");

	getDispatcher()->vkCmdSetEvent2KHR(
	    static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkEvent>(event), reinterpret_cast<const VkDependencyInfo *>(&dependencyInfo));
}

VULKAN_HPP_INLINE void CommandBuffer::resetEvent2KHR(VULKAN_HPP_NAMESPACE::Event event,
                                                     VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stageMask) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdResetEvent2KHR && "Function <vkCmdResetEvent2KHR> needs extension <VK_KHR_synchronization2> enabled!");

	getDispatcher()->vkCmdResetEvent2KHR(
	    static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkEvent>(event), static_cast<VkPipelineStageFlags2>(stageMask));
}

VULKAN_HPP_INLINE void CommandBuffer::waitEvents2KHR(ArrayProxy<const VULKAN_HPP_NAMESPACE::Event> const &events,
                                                     ArrayProxy<const VULKAN_HPP_NAMESPACE::DependencyInfo> const &dependencyInfos) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdWaitEvents2KHR && "Function <vkCmdWaitEvents2KHR> needs extension <VK_KHR_synchronization2> enabled!");

	if(events.size() != dependencyInfos.size())
	{
		throw LogicError(VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::waitEvents2KHR: events.size() != dependencyInfos.size()");
	}
	getDispatcher()->vkCmdWaitEvents2KHR(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                     events.size(),
	                                     reinterpret_cast<const VkEvent *>(events.data()),
	                                     reinterpret_cast<const VkDependencyInfo *>(dependencyInfos.data()));
}

VULKAN_HPP_INLINE void CommandBuffer::pipelineBarrier2KHR(const VULKAN_HPP_NAMESPACE::DependencyInfo &dependencyInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdPipelineBarrier2KHR &&
	                  "Function <vkCmdPipelineBarrier2KHR> needs extension <VK_KHR_synchronization2> enabled!");

	getDispatcher()->vkCmdPipelineBarrier2KHR(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                          reinterpret_cast<const VkDependencyInfo *>(&dependencyInfo));
}

VULKAN_HPP_INLINE void CommandBuffer::writeTimestamp2KHR(VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stage,
                                                         VULKAN_HPP_NAMESPACE::QueryPool queryPool,
                                                         uint32_t query) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdWriteTimestamp2KHR && "Function <vkCmdWriteTimestamp2KHR> needs extension <VK_KHR_synchronization2> enabled!");

	getDispatcher()->vkCmdWriteTimestamp2KHR(
	    static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkPipelineStageFlags2>(stage), static_cast<VkQueryPool>(queryPool), query);
}

VULKAN_HPP_INLINE void Queue::submit2KHR(ArrayProxy<const VULKAN_HPP_NAMESPACE::SubmitInfo2> const &submits, VULKAN_HPP_NAMESPACE::Fence fence) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkQueueSubmit2KHR && "Function <vkQueueSubmit2KHR> needs extension <VK_KHR_synchronization2> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkQueueSubmit2KHR(
	    static_cast<VkQueue>(m_queue), submits.size(), reinterpret_cast<const VkSubmitInfo2 *>(submits.data()), static_cast<VkFence>(fence)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Queue::submit2KHR");
	}
}

VULKAN_HPP_INLINE void CommandBuffer::writeBufferMarker2AMD(VULKAN_HPP_NAMESPACE::PipelineStageFlags2 stage,
                                                            VULKAN_HPP_NAMESPACE::Buffer dstBuffer,
                                                            VULKAN_HPP_NAMESPACE::DeviceSize dstOffset,
                                                            uint32_t marker) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdWriteBufferMarker2AMD &&
	                  "Function <vkCmdWriteBufferMarker2AMD> needs extension <VK_KHR_synchronization2> enabled!");

	getDispatcher()->vkCmdWriteBufferMarker2AMD(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                            static_cast<VkPipelineStageFlags2>(stage),
	                                            static_cast<VkBuffer>(dstBuffer),
	                                            static_cast<VkDeviceSize>(dstOffset),
	                                            marker);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::CheckpointData2NV> Queue::getCheckpointData2NV() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetQueueCheckpointData2NV &&
	                  "Function <vkGetQueueCheckpointData2NV> needs extension <VK_KHR_synchronization2> enabled!");

	uint32_t checkpointDataCount;
	getDispatcher()->vkGetQueueCheckpointData2NV(static_cast<VkQueue>(m_queue), &checkpointDataCount, nullptr);
	std::vector<VULKAN_HPP_NAMESPACE::CheckpointData2NV> checkpointData(checkpointDataCount);
	getDispatcher()->vkGetQueueCheckpointData2NV(
	    static_cast<VkQueue>(m_queue), &checkpointDataCount, reinterpret_cast<VkCheckpointData2NV *>(checkpointData.data()));
	VULKAN_HPP_ASSERT(checkpointDataCount == checkpointData.size());
	return checkpointData;
}

//=== VK_NV_fragment_shading_rate_enums ===

VULKAN_HPP_INLINE void
CommandBuffer::setFragmentShadingRateEnumNV(VULKAN_HPP_NAMESPACE::FragmentShadingRateNV shadingRate,
                                            const VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR combinerOps[2]) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetFragmentShadingRateEnumNV &&
	                  "Function <vkCmdSetFragmentShadingRateEnumNV> needs extension <VK_NV_fragment_shading_rate_enums> enabled!");

	getDispatcher()->vkCmdSetFragmentShadingRateEnumNV(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                                   static_cast<VkFragmentShadingRateNV>(shadingRate),
	                                                   reinterpret_cast<const VkFragmentShadingRateCombinerOpKHR *>(combinerOps));
}

//=== VK_KHR_copy_commands2 ===

VULKAN_HPP_INLINE void CommandBuffer::copyBuffer2KHR(const VULKAN_HPP_NAMESPACE::CopyBufferInfo2 &copyBufferInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdCopyBuffer2KHR && "Function <vkCmdCopyBuffer2KHR> needs extension <VK_KHR_copy_commands2> enabled!");

	getDispatcher()->vkCmdCopyBuffer2KHR(static_cast<VkCommandBuffer>(m_commandBuffer), reinterpret_cast<const VkCopyBufferInfo2 *>(&copyBufferInfo));
}

VULKAN_HPP_INLINE void CommandBuffer::copyImage2KHR(const VULKAN_HPP_NAMESPACE::CopyImageInfo2 &copyImageInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdCopyImage2KHR && "Function <vkCmdCopyImage2KHR> needs extension <VK_KHR_copy_commands2> enabled!");

	getDispatcher()->vkCmdCopyImage2KHR(static_cast<VkCommandBuffer>(m_commandBuffer), reinterpret_cast<const VkCopyImageInfo2 *>(&copyImageInfo));
}

VULKAN_HPP_INLINE void
CommandBuffer::copyBufferToImage2KHR(const VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2 &copyBufferToImageInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdCopyBufferToImage2KHR &&
	                  "Function <vkCmdCopyBufferToImage2KHR> needs extension <VK_KHR_copy_commands2> enabled!");

	getDispatcher()->vkCmdCopyBufferToImage2KHR(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                            reinterpret_cast<const VkCopyBufferToImageInfo2 *>(&copyBufferToImageInfo));
}

VULKAN_HPP_INLINE void
CommandBuffer::copyImageToBuffer2KHR(const VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2 &copyImageToBufferInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdCopyImageToBuffer2KHR &&
	                  "Function <vkCmdCopyImageToBuffer2KHR> needs extension <VK_KHR_copy_commands2> enabled!");

	getDispatcher()->vkCmdCopyImageToBuffer2KHR(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                            reinterpret_cast<const VkCopyImageToBufferInfo2 *>(&copyImageToBufferInfo));
}

VULKAN_HPP_INLINE void CommandBuffer::blitImage2KHR(const VULKAN_HPP_NAMESPACE::BlitImageInfo2 &blitImageInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdBlitImage2KHR && "Function <vkCmdBlitImage2KHR> needs extension <VK_KHR_copy_commands2> enabled!");

	getDispatcher()->vkCmdBlitImage2KHR(static_cast<VkCommandBuffer>(m_commandBuffer), reinterpret_cast<const VkBlitImageInfo2 *>(&blitImageInfo));
}

VULKAN_HPP_INLINE void CommandBuffer::resolveImage2KHR(const VULKAN_HPP_NAMESPACE::ResolveImageInfo2 &resolveImageInfo) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdResolveImage2KHR && "Function <vkCmdResolveImage2KHR> needs extension <VK_KHR_copy_commands2> enabled!");

	getDispatcher()->vkCmdResolveImage2KHR(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                       reinterpret_cast<const VkResolveImageInfo2 *>(&resolveImageInfo));
}

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
//=== VK_NV_acquire_winrt_display ===

VULKAN_HPP_INLINE void DisplayKHR::acquireWinrtNV() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkAcquireWinrtDisplayNV &&
	                  "Function <vkAcquireWinrtDisplayNV> needs extension <VK_NV_acquire_winrt_display> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkAcquireWinrtDisplayNV(static_cast<VkPhysicalDevice>(m_physicalDevice), static_cast<VkDisplayKHR>(m_display)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::DisplayKHR::acquireWinrtNV");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::DisplayKHR PhysicalDevice::getWinrtDisplayNV(uint32_t deviceRelativeId) const
{
	return VULKAN_HPP_RAII_NAMESPACE::DisplayKHR(*this, deviceRelativeId);
}
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

#	if defined(VK_USE_PLATFORM_DIRECTFB_EXT)
//=== VK_EXT_directfb_surface ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
Instance::createDirectFBSurfaceEXT(VULKAN_HPP_NAMESPACE::DirectFBSurfaceCreateInfoEXT const &createInfo,
                                   VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Bool32
PhysicalDevice::getDirectFBPresentationSupportEXT(uint32_t queueFamilyIndex, IDirectFB &dfb) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceDirectFBPresentationSupportEXT &&
	                  "Function <vkGetPhysicalDeviceDirectFBPresentationSupportEXT> needs extension <VK_EXT_directfb_surface> enabled!");

	return static_cast<VULKAN_HPP_NAMESPACE::Bool32>(
	    getDispatcher()->vkGetPhysicalDeviceDirectFBPresentationSupportEXT(static_cast<VkPhysicalDevice>(m_physicalDevice), queueFamilyIndex, &dfb));
}
#	endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/

//=== VK_KHR_ray_tracing_pipeline ===

VULKAN_HPP_INLINE void CommandBuffer::traceRaysKHR(const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR &raygenShaderBindingTable,
                                                   const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR &missShaderBindingTable,
                                                   const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR &hitShaderBindingTable,
                                                   const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR &callableShaderBindingTable,
                                                   uint32_t width,
                                                   uint32_t height,
                                                   uint32_t depth) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdTraceRaysKHR && "Function <vkCmdTraceRaysKHR> needs extension <VK_KHR_ray_tracing_pipeline> enabled!");

	getDispatcher()->vkCmdTraceRaysKHR(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                   reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>(&raygenShaderBindingTable),
	                                   reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>(&missShaderBindingTable),
	                                   reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>(&hitShaderBindingTable),
	                                   reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>(&callableShaderBindingTable),
	                                   width,
	                                   height,
	                                   depth);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_RAII_NAMESPACE::Pipeline> Device::createRayTracingPipelinesKHR(
    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeferredOperationKHR> const &deferredOperation,
    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &pipelineCache,
    VULKAN_HPP_NAMESPACE::ArrayProxy<VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR> const &createInfos,
    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::Pipelines(*this, deferredOperation, pipelineCache, createInfos, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::Pipeline Device::createRayTracingPipelineKHR(
    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeferredOperationKHR> const &deferredOperation,
    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::PipelineCache> const &pipelineCache,
    VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR const &createInfo,
    VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::Pipeline(*this, deferredOperation, pipelineCache, createInfo, allocator);
}

template<typename DataType>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<DataType>
Pipeline::getRayTracingShaderGroupHandlesKHR(uint32_t firstGroup, uint32_t groupCount, size_t dataSize) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetRayTracingShaderGroupHandlesKHR &&
	                  "Function <vkGetRayTracingShaderGroupHandlesKHR> needs extension <VK_KHR_ray_tracing_pipeline> enabled!");

	VULKAN_HPP_ASSERT(dataSize % sizeof(DataType) == 0);
	std::vector<DataType> data(dataSize / sizeof(DataType));
	Result result = static_cast<Result>(getDispatcher()->vkGetRayTracingShaderGroupHandlesKHR(static_cast<VkDevice>(m_device),
	                                                                                          static_cast<VkPipeline>(m_pipeline),
	                                                                                          firstGroup,
	                                                                                          groupCount,
	                                                                                          data.size() * sizeof(DataType),
	                                                                                          reinterpret_cast<void *>(data.data())));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Pipeline::getRayTracingShaderGroupHandlesKHR");
	}
	return data;
}

template<typename DataType>
VULKAN_HPP_NODISCARD DataType Pipeline::getRayTracingShaderGroupHandleKHR(uint32_t firstGroup, uint32_t groupCount) const
{
	DataType data;
	Result result = static_cast<Result>(getDispatcher()->vkGetRayTracingShaderGroupHandlesKHR(static_cast<VkDevice>(m_device),
	                                                                                          static_cast<VkPipeline>(m_pipeline),
	                                                                                          firstGroup,
	                                                                                          groupCount,
	                                                                                          sizeof(DataType),
	                                                                                          reinterpret_cast<void *>(&data)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Pipeline::getRayTracingShaderGroupHandleKHR");
	}
	return data;
}

template<typename DataType>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<DataType>
Pipeline::getRayTracingCaptureReplayShaderGroupHandlesKHR(uint32_t firstGroup, uint32_t groupCount, size_t dataSize) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetRayTracingCaptureReplayShaderGroupHandlesKHR &&
	                  "Function <vkGetRayTracingCaptureReplayShaderGroupHandlesKHR> needs extension <VK_KHR_ray_tracing_pipeline> enabled!");

	VULKAN_HPP_ASSERT(dataSize % sizeof(DataType) == 0);
	std::vector<DataType> data(dataSize / sizeof(DataType));
	Result result = static_cast<Result>(getDispatcher()->vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(static_cast<VkDevice>(m_device),
	                                                                                                       static_cast<VkPipeline>(m_pipeline),
	                                                                                                       firstGroup,
	                                                                                                       groupCount,
	                                                                                                       data.size() * sizeof(DataType),
	                                                                                                       reinterpret_cast<void *>(data.data())));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Pipeline::getRayTracingCaptureReplayShaderGroupHandlesKHR");
	}
	return data;
}

template<typename DataType>
VULKAN_HPP_NODISCARD DataType Pipeline::getRayTracingCaptureReplayShaderGroupHandleKHR(uint32_t firstGroup, uint32_t groupCount) const
{
	DataType data;
	Result result = static_cast<Result>(getDispatcher()->vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(static_cast<VkDevice>(m_device),
	                                                                                                       static_cast<VkPipeline>(m_pipeline),
	                                                                                                       firstGroup,
	                                                                                                       groupCount,
	                                                                                                       sizeof(DataType),
	                                                                                                       reinterpret_cast<void *>(&data)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Pipeline::getRayTracingCaptureReplayShaderGroupHandleKHR");
	}
	return data;
}

VULKAN_HPP_INLINE void CommandBuffer::traceRaysIndirectKHR(const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR &raygenShaderBindingTable,
                                                           const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR &missShaderBindingTable,
                                                           const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR &hitShaderBindingTable,
                                                           const VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR &callableShaderBindingTable,
                                                           VULKAN_HPP_NAMESPACE::DeviceAddress indirectDeviceAddress) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdTraceRaysIndirectKHR &&
	                  "Function <vkCmdTraceRaysIndirectKHR> needs extension <VK_KHR_ray_tracing_pipeline> enabled!");

	getDispatcher()->vkCmdTraceRaysIndirectKHR(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                           reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>(&raygenShaderBindingTable),
	                                           reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>(&missShaderBindingTable),
	                                           reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>(&hitShaderBindingTable),
	                                           reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>(&callableShaderBindingTable),
	                                           static_cast<VkDeviceAddress>(indirectDeviceAddress));
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DeviceSize
Pipeline::getRayTracingShaderGroupStackSizeKHR(uint32_t group, VULKAN_HPP_NAMESPACE::ShaderGroupShaderKHR groupShader) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetRayTracingShaderGroupStackSizeKHR &&
	                  "Function <vkGetRayTracingShaderGroupStackSizeKHR> needs extension <VK_KHR_ray_tracing_pipeline> enabled!");

	return static_cast<VULKAN_HPP_NAMESPACE::DeviceSize>(getDispatcher()->vkGetRayTracingShaderGroupStackSizeKHR(
	    static_cast<VkDevice>(m_device), static_cast<VkPipeline>(m_pipeline), group, static_cast<VkShaderGroupShaderKHR>(groupShader)));
}

VULKAN_HPP_INLINE void CommandBuffer::setRayTracingPipelineStackSizeKHR(uint32_t pipelineStackSize) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetRayTracingPipelineStackSizeKHR &&
	                  "Function <vkCmdSetRayTracingPipelineStackSizeKHR> needs extension <VK_KHR_ray_tracing_pipeline> enabled!");

	getDispatcher()->vkCmdSetRayTracingPipelineStackSizeKHR(static_cast<VkCommandBuffer>(m_commandBuffer), pipelineStackSize);
}

//=== VK_EXT_vertex_input_dynamic_state ===

VULKAN_HPP_INLINE void CommandBuffer::setVertexInputEXT(
    ArrayProxy<const VULKAN_HPP_NAMESPACE::VertexInputBindingDescription2EXT> const &vertexBindingDescriptions,
    ArrayProxy<const VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription2EXT> const &vertexAttributeDescriptions) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetVertexInputEXT &&
	                  "Function <vkCmdSetVertexInputEXT> needs extension <VK_EXT_vertex_input_dynamic_state> enabled!");

	getDispatcher()->vkCmdSetVertexInputEXT(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                        vertexBindingDescriptions.size(),
	                                        reinterpret_cast<const VkVertexInputBindingDescription2EXT *>(vertexBindingDescriptions.data()),
	                                        vertexAttributeDescriptions.size(),
	                                        reinterpret_cast<const VkVertexInputAttributeDescription2EXT *>(vertexAttributeDescriptions.data()));
}

#	if defined(VK_USE_PLATFORM_FUCHSIA)
//=== VK_FUCHSIA_external_memory ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE zx_handle_t
Device::getMemoryZirconHandleFUCHSIA(const VULKAN_HPP_NAMESPACE::MemoryGetZirconHandleInfoFUCHSIA &getZirconHandleInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetMemoryZirconHandleFUCHSIA &&
	                  "Function <vkGetMemoryZirconHandleFUCHSIA> needs extension <VK_FUCHSIA_external_memory> enabled!");

	zx_handle_t zirconHandle;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetMemoryZirconHandleFUCHSIA(
	    static_cast<VkDevice>(m_device), reinterpret_cast<const VkMemoryGetZirconHandleInfoFUCHSIA *>(&getZirconHandleInfo), &zirconHandle));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getMemoryZirconHandleFUCHSIA");
	}
	return zirconHandle;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryZirconHandlePropertiesFUCHSIA
Device::getMemoryZirconHandlePropertiesFUCHSIA(VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagBits handleType, zx_handle_t zirconHandle) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetMemoryZirconHandlePropertiesFUCHSIA &&
	                  "Function <vkGetMemoryZirconHandlePropertiesFUCHSIA> needs extension <VK_FUCHSIA_external_memory> enabled!");

	VULKAN_HPP_NAMESPACE::MemoryZirconHandlePropertiesFUCHSIA memoryZirconHandleProperties;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetMemoryZirconHandlePropertiesFUCHSIA(
	    static_cast<VkDevice>(m_device),
	    static_cast<VkExternalMemoryHandleTypeFlagBits>(handleType),
	    zirconHandle,
	    reinterpret_cast<VkMemoryZirconHandlePropertiesFUCHSIA *>(&memoryZirconHandleProperties)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getMemoryZirconHandlePropertiesFUCHSIA");
	}
	return memoryZirconHandleProperties;
}
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

#	if defined(VK_USE_PLATFORM_FUCHSIA)
//=== VK_FUCHSIA_external_semaphore ===

VULKAN_HPP_INLINE void
Device::importSemaphoreZirconHandleFUCHSIA(const VULKAN_HPP_NAMESPACE::ImportSemaphoreZirconHandleInfoFUCHSIA &importSemaphoreZirconHandleInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkImportSemaphoreZirconHandleFUCHSIA &&
	                  "Function <vkImportSemaphoreZirconHandleFUCHSIA> needs extension <VK_FUCHSIA_external_semaphore> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkImportSemaphoreZirconHandleFUCHSIA(
	    static_cast<VkDevice>(m_device), reinterpret_cast<const VkImportSemaphoreZirconHandleInfoFUCHSIA *>(&importSemaphoreZirconHandleInfo)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::importSemaphoreZirconHandleFUCHSIA");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE zx_handle_t
Device::getSemaphoreZirconHandleFUCHSIA(const VULKAN_HPP_NAMESPACE::SemaphoreGetZirconHandleInfoFUCHSIA &getZirconHandleInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetSemaphoreZirconHandleFUCHSIA &&
	                  "Function <vkGetSemaphoreZirconHandleFUCHSIA> needs extension <VK_FUCHSIA_external_semaphore> enabled!");

	zx_handle_t zirconHandle;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetSemaphoreZirconHandleFUCHSIA(
	    static_cast<VkDevice>(m_device), reinterpret_cast<const VkSemaphoreGetZirconHandleInfoFUCHSIA *>(&getZirconHandleInfo), &zirconHandle));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getSemaphoreZirconHandleFUCHSIA");
	}
	return zirconHandle;
}
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

#	if defined(VK_USE_PLATFORM_FUCHSIA)
//=== VK_FUCHSIA_buffer_collection ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::BufferCollectionFUCHSIA
Device::createBufferCollectionFUCHSIA(VULKAN_HPP_NAMESPACE::BufferCollectionCreateInfoFUCHSIA const &createInfo,
                                      VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::BufferCollectionFUCHSIA(*this, createInfo, allocator);
}

VULKAN_HPP_INLINE void BufferCollectionFUCHSIA::setImageConstraints(const VULKAN_HPP_NAMESPACE::ImageConstraintsInfoFUCHSIA &imageConstraintsInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkSetBufferCollectionImageConstraintsFUCHSIA &&
	                  "Function <vkSetBufferCollectionImageConstraintsFUCHSIA> needs extension <VK_FUCHSIA_buffer_collection> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkSetBufferCollectionImageConstraintsFUCHSIA(static_cast<VkDevice>(m_device),
	                                                                  static_cast<VkBufferCollectionFUCHSIA>(m_collection),
	                                                                  reinterpret_cast<const VkImageConstraintsInfoFUCHSIA *>(&imageConstraintsInfo)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::BufferCollectionFUCHSIA::setImageConstraints");
	}
}

VULKAN_HPP_INLINE void
BufferCollectionFUCHSIA::setBufferConstraints(const VULKAN_HPP_NAMESPACE::BufferConstraintsInfoFUCHSIA &bufferConstraintsInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkSetBufferCollectionBufferConstraintsFUCHSIA &&
	                  "Function <vkSetBufferCollectionBufferConstraintsFUCHSIA> needs extension <VK_FUCHSIA_buffer_collection> enabled!");

	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkSetBufferCollectionBufferConstraintsFUCHSIA(static_cast<VkDevice>(m_device),
	                                                                   static_cast<VkBufferCollectionFUCHSIA>(m_collection),
	                                                                   reinterpret_cast<const VkBufferConstraintsInfoFUCHSIA *>(&bufferConstraintsInfo)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::BufferCollectionFUCHSIA::setBufferConstraints");
	}
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::BufferCollectionPropertiesFUCHSIA BufferCollectionFUCHSIA::getProperties() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetBufferCollectionPropertiesFUCHSIA &&
	                  "Function <vkGetBufferCollectionPropertiesFUCHSIA> needs extension <VK_FUCHSIA_buffer_collection> enabled!");

	VULKAN_HPP_NAMESPACE::BufferCollectionPropertiesFUCHSIA properties;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetBufferCollectionPropertiesFUCHSIA(static_cast<VkDevice>(m_device),
	                                                            static_cast<VkBufferCollectionFUCHSIA>(m_collection),
	                                                            reinterpret_cast<VkBufferCollectionPropertiesFUCHSIA *>(&properties)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::BufferCollectionFUCHSIA::getProperties");
	}
	return properties;
}
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

//=== VK_HUAWEI_subpass_shading ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::pair<VULKAN_HPP_NAMESPACE::Result, VULKAN_HPP_NAMESPACE::Extent2D>
RenderPass::getSubpassShadingMaxWorkgroupSizeHUAWEI() const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI &&
	                  "Function <vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI> needs extension <VK_HUAWEI_subpass_shading> enabled!");

	VULKAN_HPP_NAMESPACE::Extent2D maxWorkgroupSize;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(getDispatcher()->vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(
	    static_cast<VkDevice>(m_device), static_cast<VkRenderPass>(m_renderPass), reinterpret_cast<VkExtent2D *>(&maxWorkgroupSize)));
	if((result != VULKAN_HPP_NAMESPACE::Result::eSuccess) && (result != VULKAN_HPP_NAMESPACE::Result::eIncomplete))
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::RenderPass::getSubpassShadingMaxWorkgroupSizeHUAWEI");
	}
	return std::make_pair(result, maxWorkgroupSize);
}

VULKAN_HPP_INLINE void CommandBuffer::subpassShadingHUAWEI() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSubpassShadingHUAWEI &&
	                  "Function <vkCmdSubpassShadingHUAWEI> needs extension <VK_HUAWEI_subpass_shading> enabled!");

	getDispatcher()->vkCmdSubpassShadingHUAWEI(static_cast<VkCommandBuffer>(m_commandBuffer));
}

//=== VK_HUAWEI_invocation_mask ===

VULKAN_HPP_INLINE void CommandBuffer::bindInvocationMaskHUAWEI(VULKAN_HPP_NAMESPACE::ImageView imageView,
                                                               VULKAN_HPP_NAMESPACE::ImageLayout imageLayout) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdBindInvocationMaskHUAWEI &&
	                  "Function <vkCmdBindInvocationMaskHUAWEI> needs extension <VK_HUAWEI_invocation_mask> enabled!");

	getDispatcher()->vkCmdBindInvocationMaskHUAWEI(
	    static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkImageView>(imageView), static_cast<VkImageLayout>(imageLayout));
}

//=== VK_NV_external_memory_rdma ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::RemoteAddressNV
Device::getMemoryRemoteAddressNV(const VULKAN_HPP_NAMESPACE::MemoryGetRemoteAddressInfoNV &memoryGetRemoteAddressInfo) const
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetMemoryRemoteAddressNV &&
	                  "Function <vkGetMemoryRemoteAddressNV> needs extension <VK_NV_external_memory_rdma> enabled!");

	VULKAN_HPP_NAMESPACE::RemoteAddressNV address;
	VULKAN_HPP_NAMESPACE::Result result = static_cast<VULKAN_HPP_NAMESPACE::Result>(
	    getDispatcher()->vkGetMemoryRemoteAddressNV(static_cast<VkDevice>(m_device),
	                                                reinterpret_cast<const VkMemoryGetRemoteAddressInfoNV *>(&memoryGetRemoteAddressInfo),
	                                                reinterpret_cast<VkRemoteAddressNV *>(&address)));
	if(result != VULKAN_HPP_NAMESPACE::Result::eSuccess)
	{
		throwResultException(result, VULKAN_HPP_NAMESPACE_STRING "::Device::getMemoryRemoteAddressNV");
	}
	return address;
}

//=== VK_EXT_extended_dynamic_state2 ===

VULKAN_HPP_INLINE void CommandBuffer::setPatchControlPointsEXT(uint32_t patchControlPoints) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetPatchControlPointsEXT &&
	                  "Function <vkCmdSetPatchControlPointsEXT> needs extension <VK_EXT_extended_dynamic_state2> enabled!");

	getDispatcher()->vkCmdSetPatchControlPointsEXT(static_cast<VkCommandBuffer>(m_commandBuffer), patchControlPoints);
}

VULKAN_HPP_INLINE void CommandBuffer::setRasterizerDiscardEnableEXT(VULKAN_HPP_NAMESPACE::Bool32 rasterizerDiscardEnable) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetRasterizerDiscardEnableEXT &&
	                  "Function <vkCmdSetRasterizerDiscardEnableEXT> needs extension <VK_EXT_extended_dynamic_state2> enabled!");

	getDispatcher()->vkCmdSetRasterizerDiscardEnableEXT(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkBool32>(rasterizerDiscardEnable));
}

VULKAN_HPP_INLINE void CommandBuffer::setDepthBiasEnableEXT(VULKAN_HPP_NAMESPACE::Bool32 depthBiasEnable) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetDepthBiasEnableEXT &&
	                  "Function <vkCmdSetDepthBiasEnableEXT> needs extension <VK_EXT_extended_dynamic_state2> enabled!");

	getDispatcher()->vkCmdSetDepthBiasEnableEXT(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkBool32>(depthBiasEnable));
}

VULKAN_HPP_INLINE void CommandBuffer::setLogicOpEXT(VULKAN_HPP_NAMESPACE::LogicOp logicOp) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetLogicOpEXT && "Function <vkCmdSetLogicOpEXT> needs extension <VK_EXT_extended_dynamic_state2> enabled!");

	getDispatcher()->vkCmdSetLogicOpEXT(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkLogicOp>(logicOp));
}

VULKAN_HPP_INLINE void CommandBuffer::setPrimitiveRestartEnableEXT(VULKAN_HPP_NAMESPACE::Bool32 primitiveRestartEnable) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetPrimitiveRestartEnableEXT &&
	                  "Function <vkCmdSetPrimitiveRestartEnableEXT> needs extension <VK_EXT_extended_dynamic_state2> enabled!");

	getDispatcher()->vkCmdSetPrimitiveRestartEnableEXT(static_cast<VkCommandBuffer>(m_commandBuffer), static_cast<VkBool32>(primitiveRestartEnable));
}

#	if defined(VK_USE_PLATFORM_SCREEN_QNX)
//=== VK_QNX_screen_surface ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR
Instance::createScreenSurfaceQNX(VULKAN_HPP_NAMESPACE::ScreenSurfaceCreateInfoQNX const &createInfo,
                                 VULKAN_HPP_NAMESPACE::Optional<const VULKAN_HPP_NAMESPACE::AllocationCallbacks> allocator) const
{
	return VULKAN_HPP_RAII_NAMESPACE::SurfaceKHR(*this, createInfo, allocator);
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Bool32
PhysicalDevice::getScreenPresentationSupportQNX(uint32_t queueFamilyIndex, struct _screen_window &window) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetPhysicalDeviceScreenPresentationSupportQNX &&
	                  "Function <vkGetPhysicalDeviceScreenPresentationSupportQNX> needs extension <VK_QNX_screen_surface> enabled!");

	return static_cast<VULKAN_HPP_NAMESPACE::Bool32>(
	    getDispatcher()->vkGetPhysicalDeviceScreenPresentationSupportQNX(static_cast<VkPhysicalDevice>(m_physicalDevice), queueFamilyIndex, &window));
}
#	endif /*VK_USE_PLATFORM_SCREEN_QNX*/

//=== VK_EXT_color_write_enable ===

VULKAN_HPP_INLINE void
CommandBuffer::setColorWriteEnableEXT(ArrayProxy<const VULKAN_HPP_NAMESPACE::Bool32> const &colorWriteEnables) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdSetColorWriteEnableEXT &&
	                  "Function <vkCmdSetColorWriteEnableEXT> needs extension <VK_EXT_color_write_enable> enabled!");

	getDispatcher()->vkCmdSetColorWriteEnableEXT(
	    static_cast<VkCommandBuffer>(m_commandBuffer), colorWriteEnables.size(), reinterpret_cast<const VkBool32 *>(colorWriteEnables.data()));
}

//=== VK_EXT_multi_draw ===

VULKAN_HPP_INLINE void CommandBuffer::drawMultiEXT(ArrayProxy<const VULKAN_HPP_NAMESPACE::MultiDrawInfoEXT> const &vertexInfo,
                                                   uint32_t instanceCount,
                                                   uint32_t firstInstance,
                                                   uint32_t stride) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdDrawMultiEXT && "Function <vkCmdDrawMultiEXT> needs extension <VK_EXT_multi_draw> enabled!");

	getDispatcher()->vkCmdDrawMultiEXT(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                   vertexInfo.size(),
	                                   reinterpret_cast<const VkMultiDrawInfoEXT *>(vertexInfo.data()),
	                                   instanceCount,
	                                   firstInstance,
	                                   stride);
}

VULKAN_HPP_INLINE void CommandBuffer::drawMultiIndexedEXT(ArrayProxy<const VULKAN_HPP_NAMESPACE::MultiDrawIndexedInfoEXT> const &indexInfo,
                                                          uint32_t instanceCount,
                                                          uint32_t firstInstance,
                                                          uint32_t stride,
                                                          Optional<const int32_t> vertexOffset) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkCmdDrawMultiIndexedEXT && "Function <vkCmdDrawMultiIndexedEXT> needs extension <VK_EXT_multi_draw> enabled!");

	getDispatcher()->vkCmdDrawMultiIndexedEXT(static_cast<VkCommandBuffer>(m_commandBuffer),
	                                          indexInfo.size(),
	                                          reinterpret_cast<const VkMultiDrawIndexedInfoEXT *>(indexInfo.data()),
	                                          instanceCount,
	                                          firstInstance,
	                                          stride,
	                                          static_cast<const int32_t *>(vertexOffset));
}

//=== VK_EXT_pageable_device_local_memory ===

VULKAN_HPP_INLINE void DeviceMemory::setPriorityEXT(float priority) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkSetDeviceMemoryPriorityEXT &&
	                  "Function <vkSetDeviceMemoryPriorityEXT> needs extension <VK_EXT_pageable_device_local_memory> enabled!");

	getDispatcher()->vkSetDeviceMemoryPriorityEXT(static_cast<VkDevice>(m_device), static_cast<VkDeviceMemory>(m_memory), priority);
}

//=== VK_KHR_maintenance4 ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2
Device::getBufferMemoryRequirementsKHR(const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetDeviceBufferMemoryRequirementsKHR &&
	                  "Function <vkGetDeviceBufferMemoryRequirementsKHR> needs extension <VK_KHR_maintenance4> enabled!");

	VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;
	getDispatcher()->vkGetDeviceBufferMemoryRequirementsKHR(static_cast<VkDevice>(m_device),
	                                                        reinterpret_cast<const VkDeviceBufferMemoryRequirements *>(&info),
	                                                        reinterpret_cast<VkMemoryRequirements2 *>(&memoryRequirements));
	return memoryRequirements;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...>
Device::getBufferMemoryRequirementsKHR(const VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetDeviceBufferMemoryRequirementsKHR &&
	                  "Function <vkGetDeviceBufferMemoryRequirementsKHR> needs extension <VK_KHR_maintenance4> enabled!");

	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::MemoryRequirements2 &memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();
	getDispatcher()->vkGetDeviceBufferMemoryRequirementsKHR(static_cast<VkDevice>(m_device),
	                                                        reinterpret_cast<const VkDeviceBufferMemoryRequirements *>(&info),
	                                                        reinterpret_cast<VkMemoryRequirements2 *>(&memoryRequirements));
	return structureChain;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::MemoryRequirements2
Device::getImageMemoryRequirementsKHR(const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetDeviceImageMemoryRequirementsKHR &&
	                  "Function <vkGetDeviceImageMemoryRequirementsKHR> needs extension <VK_KHR_maintenance4> enabled!");

	VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;
	getDispatcher()->vkGetDeviceImageMemoryRequirementsKHR(static_cast<VkDevice>(m_device),
	                                                       reinterpret_cast<const VkDeviceImageMemoryRequirements *>(&info),
	                                                       reinterpret_cast<VkMemoryRequirements2 *>(&memoryRequirements));
	return memoryRequirements;
}

template<typename X, typename Y, typename... Z>
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...>
Device::getImageMemoryRequirementsKHR(const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetDeviceImageMemoryRequirementsKHR &&
	                  "Function <vkGetDeviceImageMemoryRequirementsKHR> needs extension <VK_KHR_maintenance4> enabled!");

	StructureChain<X, Y, Z...> structureChain;
	VULKAN_HPP_NAMESPACE::MemoryRequirements2 &memoryRequirements = structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();
	getDispatcher()->vkGetDeviceImageMemoryRequirementsKHR(static_cast<VkDevice>(m_device),
	                                                       reinterpret_cast<const VkDeviceImageMemoryRequirements *>(&info),
	                                                       reinterpret_cast<VkMemoryRequirements2 *>(&memoryRequirements));
	return structureChain;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>
Device::getImageSparseMemoryRequirementsKHR(const VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements &info) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetDeviceImageSparseMemoryRequirementsKHR &&
	                  "Function <vkGetDeviceImageSparseMemoryRequirementsKHR> needs extension <VK_KHR_maintenance4> enabled!");

	uint32_t sparseMemoryRequirementCount;
	getDispatcher()->vkGetDeviceImageSparseMemoryRequirementsKHR(
	    static_cast<VkDevice>(m_device), reinterpret_cast<const VkDeviceImageMemoryRequirements *>(&info), &sparseMemoryRequirementCount, nullptr);
	std::vector<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2> sparseMemoryRequirements(sparseMemoryRequirementCount);
	getDispatcher()->vkGetDeviceImageSparseMemoryRequirementsKHR(static_cast<VkDevice>(m_device),
	                                                             reinterpret_cast<const VkDeviceImageMemoryRequirements *>(&info),
	                                                             &sparseMemoryRequirementCount,
	                                                             reinterpret_cast<VkSparseImageMemoryRequirements2 *>(sparseMemoryRequirements.data()));
	VULKAN_HPP_ASSERT(sparseMemoryRequirementCount == sparseMemoryRequirements.size());
	return sparseMemoryRequirements;
}

//=== VK_VALVE_descriptor_set_host_mapping ===

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::DescriptorSetLayoutHostMappingInfoVALVE Device::getDescriptorSetLayoutHostMappingInfoVALVE(
    const VULKAN_HPP_NAMESPACE::DescriptorSetBindingReferenceVALVE &bindingReference) const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetDescriptorSetLayoutHostMappingInfoVALVE &&
	                  "Function <vkGetDescriptorSetLayoutHostMappingInfoVALVE> needs extension <VK_VALVE_descriptor_set_host_mapping> enabled!");

	VULKAN_HPP_NAMESPACE::DescriptorSetLayoutHostMappingInfoVALVE hostMapping;
	getDispatcher()->vkGetDescriptorSetLayoutHostMappingInfoVALVE(static_cast<VkDevice>(m_device),
	                                                              reinterpret_cast<const VkDescriptorSetBindingReferenceVALVE *>(&bindingReference),
	                                                              reinterpret_cast<VkDescriptorSetLayoutHostMappingInfoVALVE *>(&hostMapping));
	return hostMapping;
}

VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE void *DescriptorSet::getHostMappingVALVE() const VULKAN_HPP_NOEXCEPT
{
	VULKAN_HPP_ASSERT(getDispatcher()->vkGetDescriptorSetHostMappingVALVE &&
	                  "Function <vkGetDescriptorSetHostMappingVALVE> needs extension <VK_VALVE_descriptor_set_host_mapping> enabled!");

	void *pData;
	getDispatcher()->vkGetDescriptorSetHostMappingVALVE(static_cast<VkDevice>(m_device), static_cast<VkDescriptorSet>(m_descriptorSet), &pData);
	return pData;
}

#endif
}  // namespace VULKAN_HPP_RAII_NAMESPACE
}  // namespace VULKAN_HPP_NAMESPACE
#endif
