// 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_HASH_HPP
#define VULKAN_HASH_HPP

#include <vulkan/vulkan.hpp>

namespace std {
//=======================================
//=== HASH structures for Flags types ===
//=======================================

template<typename BitType>
struct hash<VULKAN_HPP_NAMESPACE::Flags<BitType>>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::Flags<BitType> const &flags) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<typename std::underlying_type<BitType>::type>{}(static_cast<typename std::underlying_type<BitType>::type>(flags));
	}
};

//===================================
//=== HASH structures for handles ===
//===================================

//=== VK_VERSION_1_0 ===

template<>
struct hash<VULKAN_HPP_NAMESPACE::Instance>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::Instance const &instance) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkInstance>{}(static_cast<VkInstance>(instance));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevice>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDevice const &physicalDevice) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkPhysicalDevice>{}(static_cast<VkPhysicalDevice>(physicalDevice));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::Device>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::Device const &device) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkDevice>{}(static_cast<VkDevice>(device));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::Queue>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::Queue const &queue) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkQueue>{}(static_cast<VkQueue>(queue));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DeviceMemory>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DeviceMemory const &deviceMemory) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkDeviceMemory>{}(static_cast<VkDeviceMemory>(deviceMemory));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::Fence>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::Fence const &fence) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkFence>{}(static_cast<VkFence>(fence));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::Semaphore>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::Semaphore const &semaphore) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkSemaphore>{}(static_cast<VkSemaphore>(semaphore));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::Event>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::Event const &event) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkEvent>{}(static_cast<VkEvent>(event));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::QueryPool>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::QueryPool const &queryPool) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkQueryPool>{}(static_cast<VkQueryPool>(queryPool));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::Buffer>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::Buffer const &buffer) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkBuffer>{}(static_cast<VkBuffer>(buffer));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BufferView>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BufferView const &bufferView) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkBufferView>{}(static_cast<VkBufferView>(bufferView));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::Image>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::Image const &image) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkImage>{}(static_cast<VkImage>(image));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageView>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageView const &imageView) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkImageView>{}(static_cast<VkImageView>(imageView));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ShaderModule>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ShaderModule const &shaderModule) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkShaderModule>{}(static_cast<VkShaderModule>(shaderModule));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineCache>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineCache const &pipelineCache) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkPipelineCache>{}(static_cast<VkPipelineCache>(pipelineCache));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::Pipeline>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::Pipeline const &pipeline) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkPipeline>{}(static_cast<VkPipeline>(pipeline));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineLayout>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineLayout const &pipelineLayout) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkPipelineLayout>{}(static_cast<VkPipelineLayout>(pipelineLayout));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::Sampler>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::Sampler const &sampler) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkSampler>{}(static_cast<VkSampler>(sampler));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DescriptorPool>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DescriptorPool const &descriptorPool) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkDescriptorPool>{}(static_cast<VkDescriptorPool>(descriptorPool));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DescriptorSet>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DescriptorSet const &descriptorSet) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkDescriptorSet>{}(static_cast<VkDescriptorSet>(descriptorSet));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DescriptorSetLayout>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DescriptorSetLayout const &descriptorSetLayout) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkDescriptorSetLayout>{}(static_cast<VkDescriptorSetLayout>(descriptorSetLayout));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::Framebuffer>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::Framebuffer const &framebuffer) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkFramebuffer>{}(static_cast<VkFramebuffer>(framebuffer));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::RenderPass>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::RenderPass const &renderPass) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkRenderPass>{}(static_cast<VkRenderPass>(renderPass));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CommandPool>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CommandPool const &commandPool) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkCommandPool>{}(static_cast<VkCommandPool>(commandPool));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CommandBuffer>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CommandBuffer const &commandBuffer) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkCommandBuffer>{}(static_cast<VkCommandBuffer>(commandBuffer));
	}
};

//=== VK_VERSION_1_1 ===

template<>
struct hash<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion const &samplerYcbcrConversion) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkSamplerYcbcrConversion>{}(static_cast<VkSamplerYcbcrConversion>(samplerYcbcrConversion));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate const &descriptorUpdateTemplate) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkDescriptorUpdateTemplate>{}(static_cast<VkDescriptorUpdateTemplate>(descriptorUpdateTemplate));
	}
};

//=== VK_VERSION_1_3 ===

template<>
struct hash<VULKAN_HPP_NAMESPACE::PrivateDataSlot>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PrivateDataSlot const &privateDataSlot) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkPrivateDataSlot>{}(static_cast<VkPrivateDataSlot>(privateDataSlot));
	}
};

//=== VK_KHR_surface ===

template<>
struct hash<VULKAN_HPP_NAMESPACE::SurfaceKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SurfaceKHR const &surfaceKHR) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkSurfaceKHR>{}(static_cast<VkSurfaceKHR>(surfaceKHR));
	}
};

//=== VK_KHR_swapchain ===

template<>
struct hash<VULKAN_HPP_NAMESPACE::SwapchainKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SwapchainKHR const &swapchainKHR) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkSwapchainKHR>{}(static_cast<VkSwapchainKHR>(swapchainKHR));
	}
};

//=== VK_KHR_display ===

template<>
struct hash<VULKAN_HPP_NAMESPACE::DisplayKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DisplayKHR const &displayKHR) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkDisplayKHR>{}(static_cast<VkDisplayKHR>(displayKHR));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DisplayModeKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DisplayModeKHR const &displayModeKHR) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkDisplayModeKHR>{}(static_cast<VkDisplayModeKHR>(displayModeKHR));
	}
};

//=== VK_EXT_debug_report ===

template<>
struct hash<VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT const &debugReportCallbackEXT) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkDebugReportCallbackEXT>{}(static_cast<VkDebugReportCallbackEXT>(debugReportCallbackEXT));
	}
};

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

template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoSessionKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoSessionKHR const &videoSessionKHR) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkVideoSessionKHR>{}(static_cast<VkVideoSessionKHR>(videoSessionKHR));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR const &videoSessionParametersKHR) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkVideoSessionParametersKHR>{}(static_cast<VkVideoSessionParametersKHR>(videoSessionParametersKHR));
	}
};
#endif /*VK_ENABLE_BETA_EXTENSIONS*/

//=== VK_NVX_binary_import ===

template<>
struct hash<VULKAN_HPP_NAMESPACE::CuModuleNVX>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CuModuleNVX const &cuModuleNVX) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkCuModuleNVX>{}(static_cast<VkCuModuleNVX>(cuModuleNVX));
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CuFunctionNVX>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CuFunctionNVX const &cuFunctionNVX) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkCuFunctionNVX>{}(static_cast<VkCuFunctionNVX>(cuFunctionNVX));
	}
};

//=== VK_EXT_debug_utils ===

template<>
struct hash<VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT const &debugUtilsMessengerEXT) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkDebugUtilsMessengerEXT>{}(static_cast<VkDebugUtilsMessengerEXT>(debugUtilsMessengerEXT));
	}
};

//=== VK_KHR_acceleration_structure ===

template<>
struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AccelerationStructureKHR const &accelerationStructureKHR) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkAccelerationStructureKHR>{}(static_cast<VkAccelerationStructureKHR>(accelerationStructureKHR));
	}
};

//=== VK_EXT_validation_cache ===

template<>
struct hash<VULKAN_HPP_NAMESPACE::ValidationCacheEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ValidationCacheEXT const &validationCacheEXT) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkValidationCacheEXT>{}(static_cast<VkValidationCacheEXT>(validationCacheEXT));
	}
};

//=== VK_NV_ray_tracing ===

template<>
struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AccelerationStructureNV const &accelerationStructureNV) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkAccelerationStructureNV>{}(static_cast<VkAccelerationStructureNV>(accelerationStructureNV));
	}
};

//=== VK_INTEL_performance_query ===

template<>
struct hash<VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL const &performanceConfigurationINTEL) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkPerformanceConfigurationINTEL>{}(static_cast<VkPerformanceConfigurationINTEL>(performanceConfigurationINTEL));
	}
};

//=== VK_KHR_deferred_host_operations ===

template<>
struct hash<VULKAN_HPP_NAMESPACE::DeferredOperationKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DeferredOperationKHR const &deferredOperationKHR) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkDeferredOperationKHR>{}(static_cast<VkDeferredOperationKHR>(deferredOperationKHR));
	}
};

//=== VK_NV_device_generated_commands ===

template<>
struct hash<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV const &indirectCommandsLayoutNV) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkIndirectCommandsLayoutNV>{}(static_cast<VkIndirectCommandsLayoutNV>(indirectCommandsLayoutNV));
	}
};

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

template<>
struct hash<VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BufferCollectionFUCHSIA const &bufferCollectionFUCHSIA) const VULKAN_HPP_NOEXCEPT
	{
		return std::hash<VkBufferCollectionFUCHSIA>{}(static_cast<VkBufferCollectionFUCHSIA>(bufferCollectionFUCHSIA));
	}
};
#endif /*VK_USE_PLATFORM_FUCHSIA*/

#if 14 <= VULKAN_HPP_CPP_VERSION
//======================================
//=== HASH structures for structures ===
//======================================

#	if !defined(VULKAN_HPP_HASH_COMBINE)
#		define VULKAN_HPP_HASH_COMBINE(seed, value) \
			seed ^= std::hash<std::decay<decltype(value)>::type>{}(value) + 0x9e3779b9 + (seed << 6) + (seed >> 2)
#	endif

template<>
struct hash<VULKAN_HPP_NAMESPACE::AabbPositionsKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AabbPositionsKHR const &aabbPositionsKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, aabbPositionsKHR.minX);
		VULKAN_HPP_HASH_COMBINE(seed, aabbPositionsKHR.minY);
		VULKAN_HPP_HASH_COMBINE(seed, aabbPositionsKHR.minZ);
		VULKAN_HPP_HASH_COMBINE(seed, aabbPositionsKHR.maxX);
		VULKAN_HPP_HASH_COMBINE(seed, aabbPositionsKHR.maxY);
		VULKAN_HPP_HASH_COMBINE(seed, aabbPositionsKHR.maxZ);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR const &accelerationStructureBuildRangeInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureBuildRangeInfoKHR.primitiveCount);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureBuildRangeInfoKHR.primitiveOffset);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureBuildRangeInfoKHR.firstVertex);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureBuildRangeInfoKHR.transformOffset);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR const &accelerationStructureBuildSizesInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureBuildSizesInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureBuildSizesInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureBuildSizesInfoKHR.accelerationStructureSize);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureBuildSizesInfoKHR.updateScratchSize);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureBuildSizesInfoKHR.buildScratchSize);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoKHR const &accelerationStructureCreateInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureCreateInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureCreateInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureCreateInfoKHR.createFlags);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureCreateInfoKHR.buffer);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureCreateInfoKHR.offset);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureCreateInfoKHR.size);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureCreateInfoKHR.type);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureCreateInfoKHR.deviceAddress);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::GeometryTrianglesNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::GeometryTrianglesNV const &geometryTrianglesNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, geometryTrianglesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, geometryTrianglesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, geometryTrianglesNV.vertexData);
		VULKAN_HPP_HASH_COMBINE(seed, geometryTrianglesNV.vertexOffset);
		VULKAN_HPP_HASH_COMBINE(seed, geometryTrianglesNV.vertexCount);
		VULKAN_HPP_HASH_COMBINE(seed, geometryTrianglesNV.vertexStride);
		VULKAN_HPP_HASH_COMBINE(seed, geometryTrianglesNV.vertexFormat);
		VULKAN_HPP_HASH_COMBINE(seed, geometryTrianglesNV.indexData);
		VULKAN_HPP_HASH_COMBINE(seed, geometryTrianglesNV.indexOffset);
		VULKAN_HPP_HASH_COMBINE(seed, geometryTrianglesNV.indexCount);
		VULKAN_HPP_HASH_COMBINE(seed, geometryTrianglesNV.indexType);
		VULKAN_HPP_HASH_COMBINE(seed, geometryTrianglesNV.transformData);
		VULKAN_HPP_HASH_COMBINE(seed, geometryTrianglesNV.transformOffset);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::GeometryAABBNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::GeometryAABBNV const &geometryAABBNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, geometryAABBNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, geometryAABBNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, geometryAABBNV.aabbData);
		VULKAN_HPP_HASH_COMBINE(seed, geometryAABBNV.numAABBs);
		VULKAN_HPP_HASH_COMBINE(seed, geometryAABBNV.stride);
		VULKAN_HPP_HASH_COMBINE(seed, geometryAABBNV.offset);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::GeometryDataNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::GeometryDataNV const &geometryDataNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, geometryDataNV.triangles);
		VULKAN_HPP_HASH_COMBINE(seed, geometryDataNV.aabbs);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::GeometryNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::GeometryNV const &geometryNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, geometryNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, geometryNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, geometryNV.geometryType);
		VULKAN_HPP_HASH_COMBINE(seed, geometryNV.geometry);
		VULKAN_HPP_HASH_COMBINE(seed, geometryNV.flags);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureInfoNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AccelerationStructureInfoNV const &accelerationStructureInfoNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureInfoNV.type);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureInfoNV.flags);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureInfoNV.instanceCount);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureInfoNV.geometryCount);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureInfoNV.pGeometries);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AccelerationStructureCreateInfoNV const &accelerationStructureCreateInfoNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureCreateInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureCreateInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureCreateInfoNV.compactedSize);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureCreateInfoNV.info);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureDeviceAddressInfoKHR>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::AccelerationStructureDeviceAddressInfoKHR const &accelerationStructureDeviceAddressInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureDeviceAddressInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureDeviceAddressInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureDeviceAddressInfoKHR.accelerationStructure);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::TransformMatrixKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::TransformMatrixKHR const &transformMatrixKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		for(size_t i = 0; i < 3; ++i)
		{
			for(size_t j = 0; j < 4; ++j)
			{
				VULKAN_HPP_HASH_COMBINE(seed, transformMatrixKHR.matrix[i][j]);
			}
		}
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureInstanceKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AccelerationStructureInstanceKHR const &accelerationStructureInstanceKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureInstanceKHR.transform);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureInstanceKHR.instanceCustomIndex);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureInstanceKHR.mask);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureInstanceKHR.instanceShaderBindingTableRecordOffset);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureInstanceKHR.flags);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureInstanceKHR.accelerationStructureReference);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureMatrixMotionInstanceNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AccelerationStructureMatrixMotionInstanceNV const &accelerationStructureMatrixMotionInstanceNV) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureMatrixMotionInstanceNV.transformT0);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureMatrixMotionInstanceNV.transformT1);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureMatrixMotionInstanceNV.instanceCustomIndex);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureMatrixMotionInstanceNV.mask);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureMatrixMotionInstanceNV.instanceShaderBindingTableRecordOffset);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureMatrixMotionInstanceNV.flags);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureMatrixMotionInstanceNV.accelerationStructureReference);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsInfoNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AccelerationStructureMemoryRequirementsInfoNV const &accelerationStructureMemoryRequirementsInfoNV) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureMemoryRequirementsInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureMemoryRequirementsInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureMemoryRequirementsInfoNV.type);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureMemoryRequirementsInfoNV.accelerationStructure);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInfoNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInfoNV const &accelerationStructureMotionInfoNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureMotionInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureMotionInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureMotionInfoNV.maxInstances);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureMotionInfoNV.flags);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SRTDataNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SRTDataNV const &sRTDataNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, sRTDataNV.sx);
		VULKAN_HPP_HASH_COMBINE(seed, sRTDataNV.a);
		VULKAN_HPP_HASH_COMBINE(seed, sRTDataNV.b);
		VULKAN_HPP_HASH_COMBINE(seed, sRTDataNV.pvx);
		VULKAN_HPP_HASH_COMBINE(seed, sRTDataNV.sy);
		VULKAN_HPP_HASH_COMBINE(seed, sRTDataNV.c);
		VULKAN_HPP_HASH_COMBINE(seed, sRTDataNV.pvy);
		VULKAN_HPP_HASH_COMBINE(seed, sRTDataNV.sz);
		VULKAN_HPP_HASH_COMBINE(seed, sRTDataNV.pvz);
		VULKAN_HPP_HASH_COMBINE(seed, sRTDataNV.qx);
		VULKAN_HPP_HASH_COMBINE(seed, sRTDataNV.qy);
		VULKAN_HPP_HASH_COMBINE(seed, sRTDataNV.qz);
		VULKAN_HPP_HASH_COMBINE(seed, sRTDataNV.qw);
		VULKAN_HPP_HASH_COMBINE(seed, sRTDataNV.tx);
		VULKAN_HPP_HASH_COMBINE(seed, sRTDataNV.ty);
		VULKAN_HPP_HASH_COMBINE(seed, sRTDataNV.tz);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureSRTMotionInstanceNV>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::AccelerationStructureSRTMotionInstanceNV const &accelerationStructureSRTMotionInstanceNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureSRTMotionInstanceNV.transformT0);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureSRTMotionInstanceNV.transformT1);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureSRTMotionInstanceNV.instanceCustomIndex);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureSRTMotionInstanceNV.mask);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureSRTMotionInstanceNV.instanceShaderBindingTableRecordOffset);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureSRTMotionInstanceNV.flags);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureSRTMotionInstanceNV.accelerationStructureReference);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureVersionInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AccelerationStructureVersionInfoKHR const &accelerationStructureVersionInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureVersionInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureVersionInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, accelerationStructureVersionInfoKHR.pVersionData);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::AcquireNextImageInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AcquireNextImageInfoKHR const &acquireNextImageInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, acquireNextImageInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, acquireNextImageInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, acquireNextImageInfoKHR.swapchain);
		VULKAN_HPP_HASH_COMBINE(seed, acquireNextImageInfoKHR.timeout);
		VULKAN_HPP_HASH_COMBINE(seed, acquireNextImageInfoKHR.semaphore);
		VULKAN_HPP_HASH_COMBINE(seed, acquireNextImageInfoKHR.fence);
		VULKAN_HPP_HASH_COMBINE(seed, acquireNextImageInfoKHR.deviceMask);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::AcquireProfilingLockInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AcquireProfilingLockInfoKHR const &acquireProfilingLockInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, acquireProfilingLockInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, acquireProfilingLockInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, acquireProfilingLockInfoKHR.flags);
		VULKAN_HPP_HASH_COMBINE(seed, acquireProfilingLockInfoKHR.timeout);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::AllocationCallbacks>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AllocationCallbacks const &allocationCallbacks) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, allocationCallbacks.pUserData);
		VULKAN_HPP_HASH_COMBINE(seed, allocationCallbacks.pfnAllocation);
		VULKAN_HPP_HASH_COMBINE(seed, allocationCallbacks.pfnReallocation);
		VULKAN_HPP_HASH_COMBINE(seed, allocationCallbacks.pfnFree);
		VULKAN_HPP_HASH_COMBINE(seed, allocationCallbacks.pfnInternalAllocation);
		VULKAN_HPP_HASH_COMBINE(seed, allocationCallbacks.pfnInternalFree);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ComponentMapping>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ComponentMapping const &componentMapping) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, componentMapping.r);
		VULKAN_HPP_HASH_COMBINE(seed, componentMapping.g);
		VULKAN_HPP_HASH_COMBINE(seed, componentMapping.b);
		VULKAN_HPP_HASH_COMBINE(seed, componentMapping.a);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_ANDROID_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferFormatProperties2ANDROID>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AndroidHardwareBufferFormatProperties2ANDROID const &androidHardwareBufferFormatProperties2ANDROID) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferFormatProperties2ANDROID.sType);
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferFormatProperties2ANDROID.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferFormatProperties2ANDROID.format);
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferFormatProperties2ANDROID.externalFormat);
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferFormatProperties2ANDROID.formatFeatures);
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferFormatProperties2ANDROID.samplerYcbcrConversionComponents);
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferFormatProperties2ANDROID.suggestedYcbcrModel);
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferFormatProperties2ANDROID.suggestedYcbcrRange);
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferFormatProperties2ANDROID.suggestedXChromaOffset);
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferFormatProperties2ANDROID.suggestedYChromaOffset);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_ANDROID_KHR*/

#	if defined(VK_USE_PLATFORM_ANDROID_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferFormatPropertiesANDROID>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AndroidHardwareBufferFormatPropertiesANDROID const &androidHardwareBufferFormatPropertiesANDROID) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferFormatPropertiesANDROID.sType);
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferFormatPropertiesANDROID.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferFormatPropertiesANDROID.format);
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferFormatPropertiesANDROID.externalFormat);
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferFormatPropertiesANDROID.formatFeatures);
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferFormatPropertiesANDROID.samplerYcbcrConversionComponents);
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferFormatPropertiesANDROID.suggestedYcbcrModel);
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferFormatPropertiesANDROID.suggestedYcbcrRange);
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferFormatPropertiesANDROID.suggestedXChromaOffset);
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferFormatPropertiesANDROID.suggestedYChromaOffset);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_ANDROID_KHR*/

#	if defined(VK_USE_PLATFORM_ANDROID_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID const &androidHardwareBufferPropertiesANDROID) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferPropertiesANDROID.sType);
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferPropertiesANDROID.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferPropertiesANDROID.allocationSize);
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferPropertiesANDROID.memoryTypeBits);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_ANDROID_KHR*/

#	if defined(VK_USE_PLATFORM_ANDROID_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferUsageANDROID>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AndroidHardwareBufferUsageANDROID const &androidHardwareBufferUsageANDROID) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferUsageANDROID.sType);
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferUsageANDROID.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, androidHardwareBufferUsageANDROID.androidHardwareBufferUsage);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_ANDROID_KHR*/

#	if defined(VK_USE_PLATFORM_ANDROID_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::AndroidSurfaceCreateInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AndroidSurfaceCreateInfoKHR const &androidSurfaceCreateInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, androidSurfaceCreateInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, androidSurfaceCreateInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, androidSurfaceCreateInfoKHR.flags);
		VULKAN_HPP_HASH_COMBINE(seed, androidSurfaceCreateInfoKHR.window);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_ANDROID_KHR*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::ApplicationInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ApplicationInfo const &applicationInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, applicationInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, applicationInfo.pNext);
		for(const char *p = applicationInfo.pApplicationName; *p != '\0'; ++p)
		{
			VULKAN_HPP_HASH_COMBINE(seed, *p);
		}
		VULKAN_HPP_HASH_COMBINE(seed, applicationInfo.applicationVersion);
		for(const char *p = applicationInfo.pEngineName; *p != '\0'; ++p)
		{
			VULKAN_HPP_HASH_COMBINE(seed, *p);
		}
		VULKAN_HPP_HASH_COMBINE(seed, applicationInfo.engineVersion);
		VULKAN_HPP_HASH_COMBINE(seed, applicationInfo.apiVersion);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::AttachmentDescription>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AttachmentDescription const &attachmentDescription) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, attachmentDescription.flags);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentDescription.format);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentDescription.samples);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentDescription.loadOp);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentDescription.storeOp);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentDescription.stencilLoadOp);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentDescription.stencilStoreOp);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentDescription.initialLayout);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentDescription.finalLayout);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::AttachmentDescription2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AttachmentDescription2 const &attachmentDescription2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, attachmentDescription2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentDescription2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentDescription2.flags);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentDescription2.format);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentDescription2.samples);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentDescription2.loadOp);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentDescription2.storeOp);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentDescription2.stencilLoadOp);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentDescription2.stencilStoreOp);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentDescription2.initialLayout);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentDescription2.finalLayout);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::AttachmentDescriptionStencilLayout>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AttachmentDescriptionStencilLayout const &attachmentDescriptionStencilLayout) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, attachmentDescriptionStencilLayout.sType);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentDescriptionStencilLayout.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentDescriptionStencilLayout.stencilInitialLayout);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentDescriptionStencilLayout.stencilFinalLayout);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::AttachmentReference>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AttachmentReference const &attachmentReference) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, attachmentReference.attachment);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentReference.layout);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::AttachmentReference2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AttachmentReference2 const &attachmentReference2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, attachmentReference2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentReference2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentReference2.attachment);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentReference2.layout);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentReference2.aspectMask);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::AttachmentReferenceStencilLayout>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AttachmentReferenceStencilLayout const &attachmentReferenceStencilLayout) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, attachmentReferenceStencilLayout.sType);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentReferenceStencilLayout.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentReferenceStencilLayout.stencilLayout);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::AttachmentSampleCountInfoAMD>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AttachmentSampleCountInfoAMD const &attachmentSampleCountInfoAMD) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, attachmentSampleCountInfoAMD.sType);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentSampleCountInfoAMD.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentSampleCountInfoAMD.colorAttachmentCount);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentSampleCountInfoAMD.pColorAttachmentSamples);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentSampleCountInfoAMD.depthStencilAttachmentSamples);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::Extent2D>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::Extent2D const &extent2D) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, extent2D.width);
		VULKAN_HPP_HASH_COMBINE(seed, extent2D.height);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SampleLocationEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SampleLocationEXT const &sampleLocationEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, sampleLocationEXT.x);
		VULKAN_HPP_HASH_COMBINE(seed, sampleLocationEXT.y);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT const &sampleLocationsInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, sampleLocationsInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, sampleLocationsInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, sampleLocationsInfoEXT.sampleLocationsPerPixel);
		VULKAN_HPP_HASH_COMBINE(seed, sampleLocationsInfoEXT.sampleLocationGridSize);
		VULKAN_HPP_HASH_COMBINE(seed, sampleLocationsInfoEXT.sampleLocationsCount);
		VULKAN_HPP_HASH_COMBINE(seed, sampleLocationsInfoEXT.pSampleLocations);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::AttachmentSampleLocationsEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::AttachmentSampleLocationsEXT const &attachmentSampleLocationsEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, attachmentSampleLocationsEXT.attachmentIndex);
		VULKAN_HPP_HASH_COMBINE(seed, attachmentSampleLocationsEXT.sampleLocationsInfo);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BaseInStructure>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BaseInStructure const &baseInStructure) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, baseInStructure.sType);
		VULKAN_HPP_HASH_COMBINE(seed, baseInStructure.pNext);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BaseOutStructure>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BaseOutStructure const &baseOutStructure) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, baseOutStructure.sType);
		VULKAN_HPP_HASH_COMBINE(seed, baseOutStructure.pNext);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BindAccelerationStructureMemoryInfoNV>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::BindAccelerationStructureMemoryInfoNV const &bindAccelerationStructureMemoryInfoNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bindAccelerationStructureMemoryInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, bindAccelerationStructureMemoryInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, bindAccelerationStructureMemoryInfoNV.accelerationStructure);
		VULKAN_HPP_HASH_COMBINE(seed, bindAccelerationStructureMemoryInfoNV.memory);
		VULKAN_HPP_HASH_COMBINE(seed, bindAccelerationStructureMemoryInfoNV.memoryOffset);
		VULKAN_HPP_HASH_COMBINE(seed, bindAccelerationStructureMemoryInfoNV.deviceIndexCount);
		VULKAN_HPP_HASH_COMBINE(seed, bindAccelerationStructureMemoryInfoNV.pDeviceIndices);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BindBufferMemoryDeviceGroupInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BindBufferMemoryDeviceGroupInfo const &bindBufferMemoryDeviceGroupInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bindBufferMemoryDeviceGroupInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, bindBufferMemoryDeviceGroupInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, bindBufferMemoryDeviceGroupInfo.deviceIndexCount);
		VULKAN_HPP_HASH_COMBINE(seed, bindBufferMemoryDeviceGroupInfo.pDeviceIndices);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo const &bindBufferMemoryInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bindBufferMemoryInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, bindBufferMemoryInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, bindBufferMemoryInfo.buffer);
		VULKAN_HPP_HASH_COMBINE(seed, bindBufferMemoryInfo.memory);
		VULKAN_HPP_HASH_COMBINE(seed, bindBufferMemoryInfo.memoryOffset);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::Offset2D>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::Offset2D const &offset2D) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, offset2D.x);
		VULKAN_HPP_HASH_COMBINE(seed, offset2D.y);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::Rect2D>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::Rect2D const &rect2D) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, rect2D.offset);
		VULKAN_HPP_HASH_COMBINE(seed, rect2D.extent);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BindImageMemoryDeviceGroupInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BindImageMemoryDeviceGroupInfo const &bindImageMemoryDeviceGroupInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bindImageMemoryDeviceGroupInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, bindImageMemoryDeviceGroupInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, bindImageMemoryDeviceGroupInfo.deviceIndexCount);
		VULKAN_HPP_HASH_COMBINE(seed, bindImageMemoryDeviceGroupInfo.pDeviceIndices);
		VULKAN_HPP_HASH_COMBINE(seed, bindImageMemoryDeviceGroupInfo.splitInstanceBindRegionCount);
		VULKAN_HPP_HASH_COMBINE(seed, bindImageMemoryDeviceGroupInfo.pSplitInstanceBindRegions);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BindImageMemoryInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BindImageMemoryInfo const &bindImageMemoryInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bindImageMemoryInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, bindImageMemoryInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, bindImageMemoryInfo.image);
		VULKAN_HPP_HASH_COMBINE(seed, bindImageMemoryInfo.memory);
		VULKAN_HPP_HASH_COMBINE(seed, bindImageMemoryInfo.memoryOffset);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BindImageMemorySwapchainInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BindImageMemorySwapchainInfoKHR const &bindImageMemorySwapchainInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bindImageMemorySwapchainInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, bindImageMemorySwapchainInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, bindImageMemorySwapchainInfoKHR.swapchain);
		VULKAN_HPP_HASH_COMBINE(seed, bindImageMemorySwapchainInfoKHR.imageIndex);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BindImagePlaneMemoryInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BindImagePlaneMemoryInfo const &bindImagePlaneMemoryInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bindImagePlaneMemoryInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, bindImagePlaneMemoryInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, bindImagePlaneMemoryInfo.planeAspect);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BindIndexBufferIndirectCommandNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BindIndexBufferIndirectCommandNV const &bindIndexBufferIndirectCommandNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bindIndexBufferIndirectCommandNV.bufferAddress);
		VULKAN_HPP_HASH_COMBINE(seed, bindIndexBufferIndirectCommandNV.size);
		VULKAN_HPP_HASH_COMBINE(seed, bindIndexBufferIndirectCommandNV.indexType);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BindShaderGroupIndirectCommandNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BindShaderGroupIndirectCommandNV const &bindShaderGroupIndirectCommandNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bindShaderGroupIndirectCommandNV.groupIndex);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SparseMemoryBind>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SparseMemoryBind const &sparseMemoryBind) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, sparseMemoryBind.resourceOffset);
		VULKAN_HPP_HASH_COMBINE(seed, sparseMemoryBind.size);
		VULKAN_HPP_HASH_COMBINE(seed, sparseMemoryBind.memory);
		VULKAN_HPP_HASH_COMBINE(seed, sparseMemoryBind.memoryOffset);
		VULKAN_HPP_HASH_COMBINE(seed, sparseMemoryBind.flags);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SparseBufferMemoryBindInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SparseBufferMemoryBindInfo const &sparseBufferMemoryBindInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, sparseBufferMemoryBindInfo.buffer);
		VULKAN_HPP_HASH_COMBINE(seed, sparseBufferMemoryBindInfo.bindCount);
		VULKAN_HPP_HASH_COMBINE(seed, sparseBufferMemoryBindInfo.pBinds);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SparseImageOpaqueMemoryBindInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SparseImageOpaqueMemoryBindInfo const &sparseImageOpaqueMemoryBindInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageOpaqueMemoryBindInfo.image);
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageOpaqueMemoryBindInfo.bindCount);
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageOpaqueMemoryBindInfo.pBinds);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageSubresource>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageSubresource const &imageSubresource) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageSubresource.aspectMask);
		VULKAN_HPP_HASH_COMBINE(seed, imageSubresource.mipLevel);
		VULKAN_HPP_HASH_COMBINE(seed, imageSubresource.arrayLayer);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::Offset3D>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::Offset3D const &offset3D) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, offset3D.x);
		VULKAN_HPP_HASH_COMBINE(seed, offset3D.y);
		VULKAN_HPP_HASH_COMBINE(seed, offset3D.z);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::Extent3D>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::Extent3D const &extent3D) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, extent3D.width);
		VULKAN_HPP_HASH_COMBINE(seed, extent3D.height);
		VULKAN_HPP_HASH_COMBINE(seed, extent3D.depth);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SparseImageMemoryBind>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SparseImageMemoryBind const &sparseImageMemoryBind) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageMemoryBind.subresource);
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageMemoryBind.offset);
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageMemoryBind.extent);
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageMemoryBind.memory);
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageMemoryBind.memoryOffset);
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageMemoryBind.flags);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SparseImageMemoryBindInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SparseImageMemoryBindInfo const &sparseImageMemoryBindInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageMemoryBindInfo.image);
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageMemoryBindInfo.bindCount);
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageMemoryBindInfo.pBinds);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BindSparseInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BindSparseInfo const &bindSparseInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bindSparseInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, bindSparseInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, bindSparseInfo.waitSemaphoreCount);
		VULKAN_HPP_HASH_COMBINE(seed, bindSparseInfo.pWaitSemaphores);
		VULKAN_HPP_HASH_COMBINE(seed, bindSparseInfo.bufferBindCount);
		VULKAN_HPP_HASH_COMBINE(seed, bindSparseInfo.pBufferBinds);
		VULKAN_HPP_HASH_COMBINE(seed, bindSparseInfo.imageOpaqueBindCount);
		VULKAN_HPP_HASH_COMBINE(seed, bindSparseInfo.pImageOpaqueBinds);
		VULKAN_HPP_HASH_COMBINE(seed, bindSparseInfo.imageBindCount);
		VULKAN_HPP_HASH_COMBINE(seed, bindSparseInfo.pImageBinds);
		VULKAN_HPP_HASH_COMBINE(seed, bindSparseInfo.signalSemaphoreCount);
		VULKAN_HPP_HASH_COMBINE(seed, bindSparseInfo.pSignalSemaphores);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BindVertexBufferIndirectCommandNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BindVertexBufferIndirectCommandNV const &bindVertexBufferIndirectCommandNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bindVertexBufferIndirectCommandNV.bufferAddress);
		VULKAN_HPP_HASH_COMBINE(seed, bindVertexBufferIndirectCommandNV.size);
		VULKAN_HPP_HASH_COMBINE(seed, bindVertexBufferIndirectCommandNV.stride);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageSubresourceLayers>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const &imageSubresourceLayers) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageSubresourceLayers.aspectMask);
		VULKAN_HPP_HASH_COMBINE(seed, imageSubresourceLayers.mipLevel);
		VULKAN_HPP_HASH_COMBINE(seed, imageSubresourceLayers.baseArrayLayer);
		VULKAN_HPP_HASH_COMBINE(seed, imageSubresourceLayers.layerCount);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageBlit2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageBlit2 const &imageBlit2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageBlit2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imageBlit2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imageBlit2.srcSubresource);
		for(size_t i = 0; i < 2; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, imageBlit2.srcOffsets[i]);
		}
		VULKAN_HPP_HASH_COMBINE(seed, imageBlit2.dstSubresource);
		for(size_t i = 0; i < 2; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, imageBlit2.dstOffsets[i]);
		}
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BlitImageInfo2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BlitImageInfo2 const &blitImageInfo2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, blitImageInfo2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, blitImageInfo2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, blitImageInfo2.srcImage);
		VULKAN_HPP_HASH_COMBINE(seed, blitImageInfo2.srcImageLayout);
		VULKAN_HPP_HASH_COMBINE(seed, blitImageInfo2.dstImage);
		VULKAN_HPP_HASH_COMBINE(seed, blitImageInfo2.dstImageLayout);
		VULKAN_HPP_HASH_COMBINE(seed, blitImageInfo2.regionCount);
		VULKAN_HPP_HASH_COMBINE(seed, blitImageInfo2.pRegions);
		VULKAN_HPP_HASH_COMBINE(seed, blitImageInfo2.filter);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_FUCHSIA)
template<>
struct hash<VULKAN_HPP_NAMESPACE::BufferCollectionBufferCreateInfoFUCHSIA>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::BufferCollectionBufferCreateInfoFUCHSIA const &bufferCollectionBufferCreateInfoFUCHSIA) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionBufferCreateInfoFUCHSIA.sType);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionBufferCreateInfoFUCHSIA.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionBufferCreateInfoFUCHSIA.collection);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionBufferCreateInfoFUCHSIA.index);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

#	if defined(VK_USE_PLATFORM_FUCHSIA)
template<>
struct hash<VULKAN_HPP_NAMESPACE::BufferCollectionConstraintsInfoFUCHSIA>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::BufferCollectionConstraintsInfoFUCHSIA const &bufferCollectionConstraintsInfoFUCHSIA) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionConstraintsInfoFUCHSIA.sType);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionConstraintsInfoFUCHSIA.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionConstraintsInfoFUCHSIA.minBufferCount);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionConstraintsInfoFUCHSIA.maxBufferCount);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionConstraintsInfoFUCHSIA.minBufferCountForCamping);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionConstraintsInfoFUCHSIA.minBufferCountForDedicatedSlack);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionConstraintsInfoFUCHSIA.minBufferCountForSharedSlack);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

#	if defined(VK_USE_PLATFORM_FUCHSIA)
template<>
struct hash<VULKAN_HPP_NAMESPACE::BufferCollectionCreateInfoFUCHSIA>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BufferCollectionCreateInfoFUCHSIA const &bufferCollectionCreateInfoFUCHSIA) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionCreateInfoFUCHSIA.sType);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionCreateInfoFUCHSIA.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionCreateInfoFUCHSIA.collectionToken);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

#	if defined(VK_USE_PLATFORM_FUCHSIA)
template<>
struct hash<VULKAN_HPP_NAMESPACE::BufferCollectionImageCreateInfoFUCHSIA>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::BufferCollectionImageCreateInfoFUCHSIA const &bufferCollectionImageCreateInfoFUCHSIA) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionImageCreateInfoFUCHSIA.sType);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionImageCreateInfoFUCHSIA.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionImageCreateInfoFUCHSIA.collection);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionImageCreateInfoFUCHSIA.index);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

#	if defined(VK_USE_PLATFORM_FUCHSIA)
template<>
struct hash<VULKAN_HPP_NAMESPACE::SysmemColorSpaceFUCHSIA>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SysmemColorSpaceFUCHSIA const &sysmemColorSpaceFUCHSIA) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, sysmemColorSpaceFUCHSIA.sType);
		VULKAN_HPP_HASH_COMBINE(seed, sysmemColorSpaceFUCHSIA.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, sysmemColorSpaceFUCHSIA.colorSpace);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

#	if defined(VK_USE_PLATFORM_FUCHSIA)
template<>
struct hash<VULKAN_HPP_NAMESPACE::BufferCollectionPropertiesFUCHSIA>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BufferCollectionPropertiesFUCHSIA const &bufferCollectionPropertiesFUCHSIA) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionPropertiesFUCHSIA.sType);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionPropertiesFUCHSIA.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionPropertiesFUCHSIA.memoryTypeBits);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionPropertiesFUCHSIA.bufferCount);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionPropertiesFUCHSIA.createInfoIndex);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionPropertiesFUCHSIA.sysmemPixelFormat);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionPropertiesFUCHSIA.formatFeatures);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionPropertiesFUCHSIA.sysmemColorSpaceIndex);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionPropertiesFUCHSIA.samplerYcbcrConversionComponents);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionPropertiesFUCHSIA.suggestedYcbcrModel);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionPropertiesFUCHSIA.suggestedYcbcrRange);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionPropertiesFUCHSIA.suggestedXChromaOffset);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCollectionPropertiesFUCHSIA.suggestedYChromaOffset);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::BufferCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BufferCreateInfo const &bufferCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bufferCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCreateInfo.size);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCreateInfo.usage);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCreateInfo.sharingMode);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCreateInfo.queueFamilyIndexCount);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCreateInfo.pQueueFamilyIndices);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_FUCHSIA)
template<>
struct hash<VULKAN_HPP_NAMESPACE::BufferConstraintsInfoFUCHSIA>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BufferConstraintsInfoFUCHSIA const &bufferConstraintsInfoFUCHSIA) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bufferConstraintsInfoFUCHSIA.sType);
		VULKAN_HPP_HASH_COMBINE(seed, bufferConstraintsInfoFUCHSIA.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, bufferConstraintsInfoFUCHSIA.createInfo);
		VULKAN_HPP_HASH_COMBINE(seed, bufferConstraintsInfoFUCHSIA.requiredFormatFeatures);
		VULKAN_HPP_HASH_COMBINE(seed, bufferConstraintsInfoFUCHSIA.bufferCollectionConstraints);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::BufferCopy>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BufferCopy const &bufferCopy) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bufferCopy.srcOffset);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCopy.dstOffset);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCopy.size);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BufferCopy2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BufferCopy2 const &bufferCopy2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bufferCopy2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCopy2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCopy2.srcOffset);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCopy2.dstOffset);
		VULKAN_HPP_HASH_COMBINE(seed, bufferCopy2.size);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BufferDeviceAddressCreateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BufferDeviceAddressCreateInfoEXT const &bufferDeviceAddressCreateInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bufferDeviceAddressCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, bufferDeviceAddressCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, bufferDeviceAddressCreateInfoEXT.deviceAddress);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo const &bufferDeviceAddressInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bufferDeviceAddressInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, bufferDeviceAddressInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, bufferDeviceAddressInfo.buffer);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BufferImageCopy>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BufferImageCopy const &bufferImageCopy) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bufferImageCopy.bufferOffset);
		VULKAN_HPP_HASH_COMBINE(seed, bufferImageCopy.bufferRowLength);
		VULKAN_HPP_HASH_COMBINE(seed, bufferImageCopy.bufferImageHeight);
		VULKAN_HPP_HASH_COMBINE(seed, bufferImageCopy.imageSubresource);
		VULKAN_HPP_HASH_COMBINE(seed, bufferImageCopy.imageOffset);
		VULKAN_HPP_HASH_COMBINE(seed, bufferImageCopy.imageExtent);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BufferImageCopy2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BufferImageCopy2 const &bufferImageCopy2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bufferImageCopy2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, bufferImageCopy2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, bufferImageCopy2.bufferOffset);
		VULKAN_HPP_HASH_COMBINE(seed, bufferImageCopy2.bufferRowLength);
		VULKAN_HPP_HASH_COMBINE(seed, bufferImageCopy2.bufferImageHeight);
		VULKAN_HPP_HASH_COMBINE(seed, bufferImageCopy2.imageSubresource);
		VULKAN_HPP_HASH_COMBINE(seed, bufferImageCopy2.imageOffset);
		VULKAN_HPP_HASH_COMBINE(seed, bufferImageCopy2.imageExtent);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BufferMemoryBarrier>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BufferMemoryBarrier const &bufferMemoryBarrier) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bufferMemoryBarrier.sType);
		VULKAN_HPP_HASH_COMBINE(seed, bufferMemoryBarrier.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, bufferMemoryBarrier.srcAccessMask);
		VULKAN_HPP_HASH_COMBINE(seed, bufferMemoryBarrier.dstAccessMask);
		VULKAN_HPP_HASH_COMBINE(seed, bufferMemoryBarrier.srcQueueFamilyIndex);
		VULKAN_HPP_HASH_COMBINE(seed, bufferMemoryBarrier.dstQueueFamilyIndex);
		VULKAN_HPP_HASH_COMBINE(seed, bufferMemoryBarrier.buffer);
		VULKAN_HPP_HASH_COMBINE(seed, bufferMemoryBarrier.offset);
		VULKAN_HPP_HASH_COMBINE(seed, bufferMemoryBarrier.size);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BufferMemoryBarrier2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BufferMemoryBarrier2 const &bufferMemoryBarrier2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bufferMemoryBarrier2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, bufferMemoryBarrier2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, bufferMemoryBarrier2.srcStageMask);
		VULKAN_HPP_HASH_COMBINE(seed, bufferMemoryBarrier2.srcAccessMask);
		VULKAN_HPP_HASH_COMBINE(seed, bufferMemoryBarrier2.dstStageMask);
		VULKAN_HPP_HASH_COMBINE(seed, bufferMemoryBarrier2.dstAccessMask);
		VULKAN_HPP_HASH_COMBINE(seed, bufferMemoryBarrier2.srcQueueFamilyIndex);
		VULKAN_HPP_HASH_COMBINE(seed, bufferMemoryBarrier2.dstQueueFamilyIndex);
		VULKAN_HPP_HASH_COMBINE(seed, bufferMemoryBarrier2.buffer);
		VULKAN_HPP_HASH_COMBINE(seed, bufferMemoryBarrier2.offset);
		VULKAN_HPP_HASH_COMBINE(seed, bufferMemoryBarrier2.size);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BufferMemoryRequirementsInfo2 const &bufferMemoryRequirementsInfo2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bufferMemoryRequirementsInfo2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, bufferMemoryRequirementsInfo2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, bufferMemoryRequirementsInfo2.buffer);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BufferOpaqueCaptureAddressCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BufferOpaqueCaptureAddressCreateInfo const &bufferOpaqueCaptureAddressCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bufferOpaqueCaptureAddressCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, bufferOpaqueCaptureAddressCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, bufferOpaqueCaptureAddressCreateInfo.opaqueCaptureAddress);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::BufferViewCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::BufferViewCreateInfo const &bufferViewCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, bufferViewCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, bufferViewCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, bufferViewCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, bufferViewCreateInfo.buffer);
		VULKAN_HPP_HASH_COMBINE(seed, bufferViewCreateInfo.format);
		VULKAN_HPP_HASH_COMBINE(seed, bufferViewCreateInfo.offset);
		VULKAN_HPP_HASH_COMBINE(seed, bufferViewCreateInfo.range);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoEXT const &calibratedTimestampInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, calibratedTimestampInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, calibratedTimestampInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, calibratedTimestampInfoEXT.timeDomain);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CheckpointData2NV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CheckpointData2NV const &checkpointData2NV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, checkpointData2NV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, checkpointData2NV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, checkpointData2NV.stage);
		VULKAN_HPP_HASH_COMBINE(seed, checkpointData2NV.pCheckpointMarker);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CheckpointDataNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CheckpointDataNV const &checkpointDataNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, checkpointDataNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, checkpointDataNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, checkpointDataNV.stage);
		VULKAN_HPP_HASH_COMBINE(seed, checkpointDataNV.pCheckpointMarker);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ClearDepthStencilValue>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ClearDepthStencilValue const &clearDepthStencilValue) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, clearDepthStencilValue.depth);
		VULKAN_HPP_HASH_COMBINE(seed, clearDepthStencilValue.stencil);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ClearRect>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ClearRect const &clearRect) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, clearRect.rect);
		VULKAN_HPP_HASH_COMBINE(seed, clearRect.baseArrayLayer);
		VULKAN_HPP_HASH_COMBINE(seed, clearRect.layerCount);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CoarseSampleLocationNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CoarseSampleLocationNV const &coarseSampleLocationNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, coarseSampleLocationNV.pixelX);
		VULKAN_HPP_HASH_COMBINE(seed, coarseSampleLocationNV.pixelY);
		VULKAN_HPP_HASH_COMBINE(seed, coarseSampleLocationNV.sample);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV const &coarseSampleOrderCustomNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, coarseSampleOrderCustomNV.shadingRate);
		VULKAN_HPP_HASH_COMBINE(seed, coarseSampleOrderCustomNV.sampleCount);
		VULKAN_HPP_HASH_COMBINE(seed, coarseSampleOrderCustomNV.sampleLocationCount);
		VULKAN_HPP_HASH_COMBINE(seed, coarseSampleOrderCustomNV.pSampleLocations);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CommandBufferAllocateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CommandBufferAllocateInfo const &commandBufferAllocateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferAllocateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferAllocateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferAllocateInfo.commandPool);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferAllocateInfo.level);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferAllocateInfo.commandBufferCount);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CommandBufferInheritanceInfo const &commandBufferInheritanceInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceInfo.renderPass);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceInfo.subpass);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceInfo.framebuffer);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceInfo.occlusionQueryEnable);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceInfo.queryFlags);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceInfo.pipelineStatistics);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CommandBufferBeginInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CommandBufferBeginInfo const &commandBufferBeginInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferBeginInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferBeginInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferBeginInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferBeginInfo.pInheritanceInfo);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceConditionalRenderingInfoEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::CommandBufferInheritanceConditionalRenderingInfoEXT const &commandBufferInheritanceConditionalRenderingInfoEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceConditionalRenderingInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceConditionalRenderingInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceConditionalRenderingInfoEXT.conditionalRenderingEnable);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceRenderPassTransformInfoQCOM>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::CommandBufferInheritanceRenderPassTransformInfoQCOM const &commandBufferInheritanceRenderPassTransformInfoQCOM) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceRenderPassTransformInfoQCOM.sType);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceRenderPassTransformInfoQCOM.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceRenderPassTransformInfoQCOM.transform);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceRenderPassTransformInfoQCOM.renderArea);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceRenderingInfo>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::CommandBufferInheritanceRenderingInfo const &commandBufferInheritanceRenderingInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceRenderingInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceRenderingInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceRenderingInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceRenderingInfo.viewMask);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceRenderingInfo.colorAttachmentCount);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceRenderingInfo.pColorAttachmentFormats);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceRenderingInfo.depthAttachmentFormat);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceRenderingInfo.stencilAttachmentFormat);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceRenderingInfo.rasterizationSamples);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::Viewport>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::Viewport const &viewport) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, viewport.x);
		VULKAN_HPP_HASH_COMBINE(seed, viewport.y);
		VULKAN_HPP_HASH_COMBINE(seed, viewport.width);
		VULKAN_HPP_HASH_COMBINE(seed, viewport.height);
		VULKAN_HPP_HASH_COMBINE(seed, viewport.minDepth);
		VULKAN_HPP_HASH_COMBINE(seed, viewport.maxDepth);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CommandBufferInheritanceViewportScissorInfoNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CommandBufferInheritanceViewportScissorInfoNV const &commandBufferInheritanceViewportScissorInfoNV) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceViewportScissorInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceViewportScissorInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceViewportScissorInfoNV.viewportScissor2D);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceViewportScissorInfoNV.viewportDepthCount);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferInheritanceViewportScissorInfoNV.pViewportDepths);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CommandBufferSubmitInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CommandBufferSubmitInfo const &commandBufferSubmitInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferSubmitInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferSubmitInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferSubmitInfo.commandBuffer);
		VULKAN_HPP_HASH_COMBINE(seed, commandBufferSubmitInfo.deviceMask);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CommandPoolCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CommandPoolCreateInfo const &commandPoolCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, commandPoolCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, commandPoolCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, commandPoolCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, commandPoolCreateInfo.queueFamilyIndex);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SpecializationMapEntry>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SpecializationMapEntry const &specializationMapEntry) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, specializationMapEntry.constantID);
		VULKAN_HPP_HASH_COMBINE(seed, specializationMapEntry.offset);
		VULKAN_HPP_HASH_COMBINE(seed, specializationMapEntry.size);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SpecializationInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SpecializationInfo const &specializationInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, specializationInfo.mapEntryCount);
		VULKAN_HPP_HASH_COMBINE(seed, specializationInfo.pMapEntries);
		VULKAN_HPP_HASH_COMBINE(seed, specializationInfo.dataSize);
		VULKAN_HPP_HASH_COMBINE(seed, specializationInfo.pData);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo const &pipelineShaderStageCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineShaderStageCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineShaderStageCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineShaderStageCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineShaderStageCreateInfo.stage);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineShaderStageCreateInfo.module);
		for(const char *p = pipelineShaderStageCreateInfo.pName; *p != '\0'; ++p)
		{
			VULKAN_HPP_HASH_COMBINE(seed, *p);
		}
		VULKAN_HPP_HASH_COMBINE(seed, pipelineShaderStageCreateInfo.pSpecializationInfo);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ComputePipelineCreateInfo const &computePipelineCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, computePipelineCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, computePipelineCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, computePipelineCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, computePipelineCreateInfo.stage);
		VULKAN_HPP_HASH_COMBINE(seed, computePipelineCreateInfo.layout);
		VULKAN_HPP_HASH_COMBINE(seed, computePipelineCreateInfo.basePipelineHandle);
		VULKAN_HPP_HASH_COMBINE(seed, computePipelineCreateInfo.basePipelineIndex);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ConditionalRenderingBeginInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ConditionalRenderingBeginInfoEXT const &conditionalRenderingBeginInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, conditionalRenderingBeginInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, conditionalRenderingBeginInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, conditionalRenderingBeginInfoEXT.buffer);
		VULKAN_HPP_HASH_COMBINE(seed, conditionalRenderingBeginInfoEXT.offset);
		VULKAN_HPP_HASH_COMBINE(seed, conditionalRenderingBeginInfoEXT.flags);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ConformanceVersion>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ConformanceVersion const &conformanceVersion) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, conformanceVersion.major);
		VULKAN_HPP_HASH_COMBINE(seed, conformanceVersion.minor);
		VULKAN_HPP_HASH_COMBINE(seed, conformanceVersion.subminor);
		VULKAN_HPP_HASH_COMBINE(seed, conformanceVersion.patch);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV const &cooperativeMatrixPropertiesNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, cooperativeMatrixPropertiesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, cooperativeMatrixPropertiesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, cooperativeMatrixPropertiesNV.MSize);
		VULKAN_HPP_HASH_COMBINE(seed, cooperativeMatrixPropertiesNV.NSize);
		VULKAN_HPP_HASH_COMBINE(seed, cooperativeMatrixPropertiesNV.KSize);
		VULKAN_HPP_HASH_COMBINE(seed, cooperativeMatrixPropertiesNV.AType);
		VULKAN_HPP_HASH_COMBINE(seed, cooperativeMatrixPropertiesNV.BType);
		VULKAN_HPP_HASH_COMBINE(seed, cooperativeMatrixPropertiesNV.CType);
		VULKAN_HPP_HASH_COMBINE(seed, cooperativeMatrixPropertiesNV.DType);
		VULKAN_HPP_HASH_COMBINE(seed, cooperativeMatrixPropertiesNV.scope);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR const &copyAccelerationStructureInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, copyAccelerationStructureInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, copyAccelerationStructureInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, copyAccelerationStructureInfoKHR.src);
		VULKAN_HPP_HASH_COMBINE(seed, copyAccelerationStructureInfoKHR.dst);
		VULKAN_HPP_HASH_COMBINE(seed, copyAccelerationStructureInfoKHR.mode);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CopyBufferInfo2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CopyBufferInfo2 const &copyBufferInfo2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, copyBufferInfo2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, copyBufferInfo2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, copyBufferInfo2.srcBuffer);
		VULKAN_HPP_HASH_COMBINE(seed, copyBufferInfo2.dstBuffer);
		VULKAN_HPP_HASH_COMBINE(seed, copyBufferInfo2.regionCount);
		VULKAN_HPP_HASH_COMBINE(seed, copyBufferInfo2.pRegions);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2 const &copyBufferToImageInfo2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, copyBufferToImageInfo2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, copyBufferToImageInfo2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, copyBufferToImageInfo2.srcBuffer);
		VULKAN_HPP_HASH_COMBINE(seed, copyBufferToImageInfo2.dstImage);
		VULKAN_HPP_HASH_COMBINE(seed, copyBufferToImageInfo2.dstImageLayout);
		VULKAN_HPP_HASH_COMBINE(seed, copyBufferToImageInfo2.regionCount);
		VULKAN_HPP_HASH_COMBINE(seed, copyBufferToImageInfo2.pRegions);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CopyCommandTransformInfoQCOM>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CopyCommandTransformInfoQCOM const &copyCommandTransformInfoQCOM) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, copyCommandTransformInfoQCOM.sType);
		VULKAN_HPP_HASH_COMBINE(seed, copyCommandTransformInfoQCOM.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, copyCommandTransformInfoQCOM.transform);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CopyDescriptorSet>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CopyDescriptorSet const &copyDescriptorSet) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, copyDescriptorSet.sType);
		VULKAN_HPP_HASH_COMBINE(seed, copyDescriptorSet.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, copyDescriptorSet.srcSet);
		VULKAN_HPP_HASH_COMBINE(seed, copyDescriptorSet.srcBinding);
		VULKAN_HPP_HASH_COMBINE(seed, copyDescriptorSet.srcArrayElement);
		VULKAN_HPP_HASH_COMBINE(seed, copyDescriptorSet.dstSet);
		VULKAN_HPP_HASH_COMBINE(seed, copyDescriptorSet.dstBinding);
		VULKAN_HPP_HASH_COMBINE(seed, copyDescriptorSet.dstArrayElement);
		VULKAN_HPP_HASH_COMBINE(seed, copyDescriptorSet.descriptorCount);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageCopy2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageCopy2 const &imageCopy2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageCopy2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imageCopy2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imageCopy2.srcSubresource);
		VULKAN_HPP_HASH_COMBINE(seed, imageCopy2.srcOffset);
		VULKAN_HPP_HASH_COMBINE(seed, imageCopy2.dstSubresource);
		VULKAN_HPP_HASH_COMBINE(seed, imageCopy2.dstOffset);
		VULKAN_HPP_HASH_COMBINE(seed, imageCopy2.extent);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CopyImageInfo2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CopyImageInfo2 const &copyImageInfo2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, copyImageInfo2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, copyImageInfo2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, copyImageInfo2.srcImage);
		VULKAN_HPP_HASH_COMBINE(seed, copyImageInfo2.srcImageLayout);
		VULKAN_HPP_HASH_COMBINE(seed, copyImageInfo2.dstImage);
		VULKAN_HPP_HASH_COMBINE(seed, copyImageInfo2.dstImageLayout);
		VULKAN_HPP_HASH_COMBINE(seed, copyImageInfo2.regionCount);
		VULKAN_HPP_HASH_COMBINE(seed, copyImageInfo2.pRegions);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2 const &copyImageToBufferInfo2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, copyImageToBufferInfo2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, copyImageToBufferInfo2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, copyImageToBufferInfo2.srcImage);
		VULKAN_HPP_HASH_COMBINE(seed, copyImageToBufferInfo2.srcImageLayout);
		VULKAN_HPP_HASH_COMBINE(seed, copyImageToBufferInfo2.dstBuffer);
		VULKAN_HPP_HASH_COMBINE(seed, copyImageToBufferInfo2.regionCount);
		VULKAN_HPP_HASH_COMBINE(seed, copyImageToBufferInfo2.pRegions);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CuFunctionCreateInfoNVX>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CuFunctionCreateInfoNVX const &cuFunctionCreateInfoNVX) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, cuFunctionCreateInfoNVX.sType);
		VULKAN_HPP_HASH_COMBINE(seed, cuFunctionCreateInfoNVX.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, cuFunctionCreateInfoNVX.module);
		for(const char *p = cuFunctionCreateInfoNVX.pName; *p != '\0'; ++p)
		{
			VULKAN_HPP_HASH_COMBINE(seed, *p);
		}
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CuLaunchInfoNVX>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CuLaunchInfoNVX const &cuLaunchInfoNVX) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, cuLaunchInfoNVX.sType);
		VULKAN_HPP_HASH_COMBINE(seed, cuLaunchInfoNVX.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, cuLaunchInfoNVX.function);
		VULKAN_HPP_HASH_COMBINE(seed, cuLaunchInfoNVX.gridDimX);
		VULKAN_HPP_HASH_COMBINE(seed, cuLaunchInfoNVX.gridDimY);
		VULKAN_HPP_HASH_COMBINE(seed, cuLaunchInfoNVX.gridDimZ);
		VULKAN_HPP_HASH_COMBINE(seed, cuLaunchInfoNVX.blockDimX);
		VULKAN_HPP_HASH_COMBINE(seed, cuLaunchInfoNVX.blockDimY);
		VULKAN_HPP_HASH_COMBINE(seed, cuLaunchInfoNVX.blockDimZ);
		VULKAN_HPP_HASH_COMBINE(seed, cuLaunchInfoNVX.sharedMemBytes);
		VULKAN_HPP_HASH_COMBINE(seed, cuLaunchInfoNVX.paramCount);
		VULKAN_HPP_HASH_COMBINE(seed, cuLaunchInfoNVX.pParams);
		VULKAN_HPP_HASH_COMBINE(seed, cuLaunchInfoNVX.extraCount);
		VULKAN_HPP_HASH_COMBINE(seed, cuLaunchInfoNVX.pExtras);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::CuModuleCreateInfoNVX>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::CuModuleCreateInfoNVX const &cuModuleCreateInfoNVX) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, cuModuleCreateInfoNVX.sType);
		VULKAN_HPP_HASH_COMBINE(seed, cuModuleCreateInfoNVX.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, cuModuleCreateInfoNVX.dataSize);
		VULKAN_HPP_HASH_COMBINE(seed, cuModuleCreateInfoNVX.pData);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::D3D12FenceSubmitInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::D3D12FenceSubmitInfoKHR const &d3D12FenceSubmitInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, d3D12FenceSubmitInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, d3D12FenceSubmitInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, d3D12FenceSubmitInfoKHR.waitSemaphoreValuesCount);
		VULKAN_HPP_HASH_COMBINE(seed, d3D12FenceSubmitInfoKHR.pWaitSemaphoreValues);
		VULKAN_HPP_HASH_COMBINE(seed, d3D12FenceSubmitInfoKHR.signalSemaphoreValuesCount);
		VULKAN_HPP_HASH_COMBINE(seed, d3D12FenceSubmitInfoKHR.pSignalSemaphoreValues);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT const &debugMarkerMarkerInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, debugMarkerMarkerInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, debugMarkerMarkerInfoEXT.pNext);
		for(const char *p = debugMarkerMarkerInfoEXT.pMarkerName; *p != '\0'; ++p)
		{
			VULKAN_HPP_HASH_COMBINE(seed, *p);
		}
		for(size_t i = 0; i < 4; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, debugMarkerMarkerInfoEXT.color[i]);
		}
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DebugMarkerObjectNameInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DebugMarkerObjectNameInfoEXT const &debugMarkerObjectNameInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, debugMarkerObjectNameInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, debugMarkerObjectNameInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, debugMarkerObjectNameInfoEXT.objectType);
		VULKAN_HPP_HASH_COMBINE(seed, debugMarkerObjectNameInfoEXT.object);
		for(const char *p = debugMarkerObjectNameInfoEXT.pObjectName; *p != '\0'; ++p)
		{
			VULKAN_HPP_HASH_COMBINE(seed, *p);
		}
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DebugMarkerObjectTagInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DebugMarkerObjectTagInfoEXT const &debugMarkerObjectTagInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, debugMarkerObjectTagInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, debugMarkerObjectTagInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, debugMarkerObjectTagInfoEXT.objectType);
		VULKAN_HPP_HASH_COMBINE(seed, debugMarkerObjectTagInfoEXT.object);
		VULKAN_HPP_HASH_COMBINE(seed, debugMarkerObjectTagInfoEXT.tagName);
		VULKAN_HPP_HASH_COMBINE(seed, debugMarkerObjectTagInfoEXT.tagSize);
		VULKAN_HPP_HASH_COMBINE(seed, debugMarkerObjectTagInfoEXT.pTag);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DebugReportCallbackCreateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DebugReportCallbackCreateInfoEXT const &debugReportCallbackCreateInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, debugReportCallbackCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, debugReportCallbackCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, debugReportCallbackCreateInfoEXT.flags);
		VULKAN_HPP_HASH_COMBINE(seed, debugReportCallbackCreateInfoEXT.pfnCallback);
		VULKAN_HPP_HASH_COMBINE(seed, debugReportCallbackCreateInfoEXT.pUserData);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT const &debugUtilsLabelEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsLabelEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsLabelEXT.pNext);
		for(const char *p = debugUtilsLabelEXT.pLabelName; *p != '\0'; ++p)
		{
			VULKAN_HPP_HASH_COMBINE(seed, *p);
		}
		for(size_t i = 0; i < 4; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, debugUtilsLabelEXT.color[i]);
		}
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DebugUtilsObjectNameInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DebugUtilsObjectNameInfoEXT const &debugUtilsObjectNameInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsObjectNameInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsObjectNameInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsObjectNameInfoEXT.objectType);
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsObjectNameInfoEXT.objectHandle);
		for(const char *p = debugUtilsObjectNameInfoEXT.pObjectName; *p != '\0'; ++p)
		{
			VULKAN_HPP_HASH_COMBINE(seed, *p);
		}
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCallbackDataEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCallbackDataEXT const &debugUtilsMessengerCallbackDataEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsMessengerCallbackDataEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsMessengerCallbackDataEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsMessengerCallbackDataEXT.flags);
		for(const char *p = debugUtilsMessengerCallbackDataEXT.pMessageIdName; *p != '\0'; ++p)
		{
			VULKAN_HPP_HASH_COMBINE(seed, *p);
		}
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsMessengerCallbackDataEXT.messageIdNumber);
		for(const char *p = debugUtilsMessengerCallbackDataEXT.pMessage; *p != '\0'; ++p)
		{
			VULKAN_HPP_HASH_COMBINE(seed, *p);
		}
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsMessengerCallbackDataEXT.queueLabelCount);
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsMessengerCallbackDataEXT.pQueueLabels);
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsMessengerCallbackDataEXT.cmdBufLabelCount);
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsMessengerCallbackDataEXT.pCmdBufLabels);
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsMessengerCallbackDataEXT.objectCount);
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsMessengerCallbackDataEXT.pObjects);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCreateInfoEXT const &debugUtilsMessengerCreateInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsMessengerCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsMessengerCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsMessengerCreateInfoEXT.flags);
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsMessengerCreateInfoEXT.messageSeverity);
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsMessengerCreateInfoEXT.messageType);
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsMessengerCreateInfoEXT.pfnUserCallback);
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsMessengerCreateInfoEXT.pUserData);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DebugUtilsObjectTagInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DebugUtilsObjectTagInfoEXT const &debugUtilsObjectTagInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsObjectTagInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsObjectTagInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsObjectTagInfoEXT.objectType);
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsObjectTagInfoEXT.objectHandle);
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsObjectTagInfoEXT.tagName);
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsObjectTagInfoEXT.tagSize);
		VULKAN_HPP_HASH_COMBINE(seed, debugUtilsObjectTagInfoEXT.pTag);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DedicatedAllocationBufferCreateInfoNV>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::DedicatedAllocationBufferCreateInfoNV const &dedicatedAllocationBufferCreateInfoNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, dedicatedAllocationBufferCreateInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, dedicatedAllocationBufferCreateInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, dedicatedAllocationBufferCreateInfoNV.dedicatedAllocation);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DedicatedAllocationImageCreateInfoNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DedicatedAllocationImageCreateInfoNV const &dedicatedAllocationImageCreateInfoNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, dedicatedAllocationImageCreateInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, dedicatedAllocationImageCreateInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, dedicatedAllocationImageCreateInfoNV.dedicatedAllocation);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DedicatedAllocationMemoryAllocateInfoNV>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::DedicatedAllocationMemoryAllocateInfoNV const &dedicatedAllocationMemoryAllocateInfoNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, dedicatedAllocationMemoryAllocateInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, dedicatedAllocationMemoryAllocateInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, dedicatedAllocationMemoryAllocateInfoNV.image);
		VULKAN_HPP_HASH_COMBINE(seed, dedicatedAllocationMemoryAllocateInfoNV.buffer);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::MemoryBarrier2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MemoryBarrier2 const &memoryBarrier2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, memoryBarrier2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, memoryBarrier2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, memoryBarrier2.srcStageMask);
		VULKAN_HPP_HASH_COMBINE(seed, memoryBarrier2.srcAccessMask);
		VULKAN_HPP_HASH_COMBINE(seed, memoryBarrier2.dstStageMask);
		VULKAN_HPP_HASH_COMBINE(seed, memoryBarrier2.dstAccessMask);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageSubresourceRange>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageSubresourceRange const &imageSubresourceRange) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageSubresourceRange.aspectMask);
		VULKAN_HPP_HASH_COMBINE(seed, imageSubresourceRange.baseMipLevel);
		VULKAN_HPP_HASH_COMBINE(seed, imageSubresourceRange.levelCount);
		VULKAN_HPP_HASH_COMBINE(seed, imageSubresourceRange.baseArrayLayer);
		VULKAN_HPP_HASH_COMBINE(seed, imageSubresourceRange.layerCount);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageMemoryBarrier2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageMemoryBarrier2 const &imageMemoryBarrier2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryBarrier2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryBarrier2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryBarrier2.srcStageMask);
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryBarrier2.srcAccessMask);
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryBarrier2.dstStageMask);
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryBarrier2.dstAccessMask);
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryBarrier2.oldLayout);
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryBarrier2.newLayout);
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryBarrier2.srcQueueFamilyIndex);
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryBarrier2.dstQueueFamilyIndex);
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryBarrier2.image);
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryBarrier2.subresourceRange);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DependencyInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DependencyInfo const &dependencyInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, dependencyInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, dependencyInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, dependencyInfo.dependencyFlags);
		VULKAN_HPP_HASH_COMBINE(seed, dependencyInfo.memoryBarrierCount);
		VULKAN_HPP_HASH_COMBINE(seed, dependencyInfo.pMemoryBarriers);
		VULKAN_HPP_HASH_COMBINE(seed, dependencyInfo.bufferMemoryBarrierCount);
		VULKAN_HPP_HASH_COMBINE(seed, dependencyInfo.pBufferMemoryBarriers);
		VULKAN_HPP_HASH_COMBINE(seed, dependencyInfo.imageMemoryBarrierCount);
		VULKAN_HPP_HASH_COMBINE(seed, dependencyInfo.pImageMemoryBarriers);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DescriptorBufferInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DescriptorBufferInfo const &descriptorBufferInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, descriptorBufferInfo.buffer);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorBufferInfo.offset);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorBufferInfo.range);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DescriptorImageInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DescriptorImageInfo const &descriptorImageInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, descriptorImageInfo.sampler);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorImageInfo.imageView);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorImageInfo.imageLayout);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DescriptorPoolSize>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DescriptorPoolSize const &descriptorPoolSize) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, descriptorPoolSize.type);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorPoolSize.descriptorCount);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DescriptorPoolCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DescriptorPoolCreateInfo const &descriptorPoolCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, descriptorPoolCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorPoolCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorPoolCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorPoolCreateInfo.maxSets);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorPoolCreateInfo.poolSizeCount);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorPoolCreateInfo.pPoolSizes);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DescriptorPoolInlineUniformBlockCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DescriptorPoolInlineUniformBlockCreateInfo const &descriptorPoolInlineUniformBlockCreateInfo) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, descriptorPoolInlineUniformBlockCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorPoolInlineUniformBlockCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorPoolInlineUniformBlockCreateInfo.maxInlineUniformBlockBindings);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DescriptorSetAllocateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DescriptorSetAllocateInfo const &descriptorSetAllocateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetAllocateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetAllocateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetAllocateInfo.descriptorPool);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetAllocateInfo.descriptorSetCount);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetAllocateInfo.pSetLayouts);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DescriptorSetBindingReferenceVALVE>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DescriptorSetBindingReferenceVALVE const &descriptorSetBindingReferenceVALVE) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetBindingReferenceVALVE.sType);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetBindingReferenceVALVE.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetBindingReferenceVALVE.descriptorSetLayout);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetBindingReferenceVALVE.binding);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutBinding>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DescriptorSetLayoutBinding const &descriptorSetLayoutBinding) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetLayoutBinding.binding);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetLayoutBinding.descriptorType);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetLayoutBinding.descriptorCount);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetLayoutBinding.stageFlags);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetLayoutBinding.pImmutableSamplers);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutBindingFlagsCreateInfo>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::DescriptorSetLayoutBindingFlagsCreateInfo const &descriptorSetLayoutBindingFlagsCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetLayoutBindingFlagsCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetLayoutBindingFlagsCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetLayoutBindingFlagsCreateInfo.bindingCount);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetLayoutBindingFlagsCreateInfo.pBindingFlags);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DescriptorSetLayoutCreateInfo const &descriptorSetLayoutCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetLayoutCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetLayoutCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetLayoutCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetLayoutCreateInfo.bindingCount);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetLayoutCreateInfo.pBindings);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutHostMappingInfoVALVE>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::DescriptorSetLayoutHostMappingInfoVALVE const &descriptorSetLayoutHostMappingInfoVALVE) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetLayoutHostMappingInfoVALVE.sType);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetLayoutHostMappingInfoVALVE.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetLayoutHostMappingInfoVALVE.descriptorOffset);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetLayoutHostMappingInfoVALVE.descriptorSize);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport const &descriptorSetLayoutSupport) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetLayoutSupport.sType);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetLayoutSupport.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetLayoutSupport.supported);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DescriptorSetVariableDescriptorCountAllocateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DescriptorSetVariableDescriptorCountAllocateInfo const &descriptorSetVariableDescriptorCountAllocateInfo)
	    const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetVariableDescriptorCountAllocateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetVariableDescriptorCountAllocateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetVariableDescriptorCountAllocateInfo.descriptorSetCount);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetVariableDescriptorCountAllocateInfo.pDescriptorCounts);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DescriptorSetVariableDescriptorCountLayoutSupport>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DescriptorSetVariableDescriptorCountLayoutSupport const &descriptorSetVariableDescriptorCountLayoutSupport)
	    const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetVariableDescriptorCountLayoutSupport.sType);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetVariableDescriptorCountLayoutSupport.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorSetVariableDescriptorCountLayoutSupport.maxVariableDescriptorCount);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateEntry>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateEntry const &descriptorUpdateTemplateEntry) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, descriptorUpdateTemplateEntry.dstBinding);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorUpdateTemplateEntry.dstArrayElement);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorUpdateTemplateEntry.descriptorCount);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorUpdateTemplateEntry.descriptorType);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorUpdateTemplateEntry.offset);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorUpdateTemplateEntry.stride);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateCreateInfo const &descriptorUpdateTemplateCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, descriptorUpdateTemplateCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorUpdateTemplateCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorUpdateTemplateCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorUpdateTemplateCreateInfo.descriptorUpdateEntryCount);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorUpdateTemplateCreateInfo.pDescriptorUpdateEntries);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorUpdateTemplateCreateInfo.templateType);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorUpdateTemplateCreateInfo.descriptorSetLayout);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorUpdateTemplateCreateInfo.pipelineBindPoint);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorUpdateTemplateCreateInfo.pipelineLayout);
		VULKAN_HPP_HASH_COMBINE(seed, descriptorUpdateTemplateCreateInfo.set);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DeviceBufferMemoryRequirements const &deviceBufferMemoryRequirements) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, deviceBufferMemoryRequirements.sType);
		VULKAN_HPP_HASH_COMBINE(seed, deviceBufferMemoryRequirements.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, deviceBufferMemoryRequirements.pCreateInfo);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DeviceQueueCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DeviceQueueCreateInfo const &deviceQueueCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, deviceQueueCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, deviceQueueCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, deviceQueueCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, deviceQueueCreateInfo.queueFamilyIndex);
		VULKAN_HPP_HASH_COMBINE(seed, deviceQueueCreateInfo.queueCount);
		VULKAN_HPP_HASH_COMBINE(seed, deviceQueueCreateInfo.pQueuePriorities);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures const &physicalDeviceFeatures) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.robustBufferAccess);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.fullDrawIndexUint32);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.imageCubeArray);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.independentBlend);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.geometryShader);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.tessellationShader);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.sampleRateShading);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.dualSrcBlend);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.logicOp);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.multiDrawIndirect);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.drawIndirectFirstInstance);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.depthClamp);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.depthBiasClamp);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.fillModeNonSolid);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.depthBounds);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.wideLines);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.largePoints);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.alphaToOne);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.multiViewport);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.samplerAnisotropy);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.textureCompressionETC2);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.textureCompressionASTC_LDR);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.textureCompressionBC);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.occlusionQueryPrecise);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.pipelineStatisticsQuery);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.vertexPipelineStoresAndAtomics);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.fragmentStoresAndAtomics);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.shaderTessellationAndGeometryPointSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.shaderImageGatherExtended);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.shaderStorageImageExtendedFormats);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.shaderStorageImageMultisample);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.shaderStorageImageReadWithoutFormat);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.shaderStorageImageWriteWithoutFormat);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.shaderUniformBufferArrayDynamicIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.shaderSampledImageArrayDynamicIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.shaderStorageBufferArrayDynamicIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.shaderStorageImageArrayDynamicIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.shaderClipDistance);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.shaderCullDistance);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.shaderFloat64);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.shaderInt64);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.shaderInt16);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.shaderResourceResidency);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.shaderResourceMinLod);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.sparseBinding);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.sparseResidencyBuffer);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.sparseResidencyImage2D);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.sparseResidencyImage3D);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.sparseResidency2Samples);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.sparseResidency4Samples);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.sparseResidency8Samples);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.sparseResidency16Samples);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.sparseResidencyAliased);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.variableMultisampleRate);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures.inheritedQueries);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DeviceCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DeviceCreateInfo const &deviceCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, deviceCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, deviceCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, deviceCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, deviceCreateInfo.queueCreateInfoCount);
		VULKAN_HPP_HASH_COMBINE(seed, deviceCreateInfo.pQueueCreateInfos);
		VULKAN_HPP_HASH_COMBINE(seed, deviceCreateInfo.enabledLayerCount);
		for(size_t i = 0; i < deviceCreateInfo.enabledLayerCount; ++i)
		{
			for(const char *p = deviceCreateInfo.ppEnabledLayerNames[i]; *p != '\0'; ++p)
			{
				VULKAN_HPP_HASH_COMBINE(seed, *p);
			}
		}
		VULKAN_HPP_HASH_COMBINE(seed, deviceCreateInfo.enabledExtensionCount);
		for(size_t i = 0; i < deviceCreateInfo.enabledExtensionCount; ++i)
		{
			for(const char *p = deviceCreateInfo.ppEnabledExtensionNames[i]; *p != '\0'; ++p)
			{
				VULKAN_HPP_HASH_COMBINE(seed, *p);
			}
		}
		VULKAN_HPP_HASH_COMBINE(seed, deviceCreateInfo.pEnabledFeatures);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DeviceDeviceMemoryReportCreateInfoEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::DeviceDeviceMemoryReportCreateInfoEXT const &deviceDeviceMemoryReportCreateInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, deviceDeviceMemoryReportCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, deviceDeviceMemoryReportCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, deviceDeviceMemoryReportCreateInfoEXT.flags);
		VULKAN_HPP_HASH_COMBINE(seed, deviceDeviceMemoryReportCreateInfoEXT.pfnUserCallback);
		VULKAN_HPP_HASH_COMBINE(seed, deviceDeviceMemoryReportCreateInfoEXT.pUserData);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DeviceDiagnosticsConfigCreateInfoNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DeviceDiagnosticsConfigCreateInfoNV const &deviceDiagnosticsConfigCreateInfoNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, deviceDiagnosticsConfigCreateInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, deviceDiagnosticsConfigCreateInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, deviceDiagnosticsConfigCreateInfoNV.flags);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DeviceEventInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DeviceEventInfoEXT const &deviceEventInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, deviceEventInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, deviceEventInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, deviceEventInfoEXT.deviceEvent);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DeviceGroupBindSparseInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DeviceGroupBindSparseInfo const &deviceGroupBindSparseInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupBindSparseInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupBindSparseInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupBindSparseInfo.resourceDeviceIndex);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupBindSparseInfo.memoryDeviceIndex);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DeviceGroupCommandBufferBeginInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DeviceGroupCommandBufferBeginInfo const &deviceGroupCommandBufferBeginInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupCommandBufferBeginInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupCommandBufferBeginInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupCommandBufferBeginInfo.deviceMask);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DeviceGroupDeviceCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DeviceGroupDeviceCreateInfo const &deviceGroupDeviceCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupDeviceCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupDeviceCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupDeviceCreateInfo.physicalDeviceCount);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupDeviceCreateInfo.pPhysicalDevices);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DeviceGroupPresentCapabilitiesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DeviceGroupPresentCapabilitiesKHR const &deviceGroupPresentCapabilitiesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupPresentCapabilitiesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupPresentCapabilitiesKHR.pNext);
		for(size_t i = 0; i < VK_MAX_DEVICE_GROUP_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, deviceGroupPresentCapabilitiesKHR.presentMask[i]);
		}
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupPresentCapabilitiesKHR.modes);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DeviceGroupPresentInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DeviceGroupPresentInfoKHR const &deviceGroupPresentInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupPresentInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupPresentInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupPresentInfoKHR.swapchainCount);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupPresentInfoKHR.pDeviceMasks);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupPresentInfoKHR.mode);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DeviceGroupRenderPassBeginInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DeviceGroupRenderPassBeginInfo const &deviceGroupRenderPassBeginInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupRenderPassBeginInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupRenderPassBeginInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupRenderPassBeginInfo.deviceMask);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupRenderPassBeginInfo.deviceRenderAreaCount);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupRenderPassBeginInfo.pDeviceRenderAreas);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DeviceGroupSubmitInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DeviceGroupSubmitInfo const &deviceGroupSubmitInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupSubmitInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupSubmitInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupSubmitInfo.waitSemaphoreCount);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupSubmitInfo.pWaitSemaphoreDeviceIndices);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupSubmitInfo.commandBufferCount);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupSubmitInfo.pCommandBufferDeviceMasks);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupSubmitInfo.signalSemaphoreCount);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupSubmitInfo.pSignalSemaphoreDeviceIndices);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DeviceGroupSwapchainCreateInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DeviceGroupSwapchainCreateInfoKHR const &deviceGroupSwapchainCreateInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupSwapchainCreateInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupSwapchainCreateInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, deviceGroupSwapchainCreateInfoKHR.modes);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageCreateInfo const &imageCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imageCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imageCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, imageCreateInfo.imageType);
		VULKAN_HPP_HASH_COMBINE(seed, imageCreateInfo.format);
		VULKAN_HPP_HASH_COMBINE(seed, imageCreateInfo.extent);
		VULKAN_HPP_HASH_COMBINE(seed, imageCreateInfo.mipLevels);
		VULKAN_HPP_HASH_COMBINE(seed, imageCreateInfo.arrayLayers);
		VULKAN_HPP_HASH_COMBINE(seed, imageCreateInfo.samples);
		VULKAN_HPP_HASH_COMBINE(seed, imageCreateInfo.tiling);
		VULKAN_HPP_HASH_COMBINE(seed, imageCreateInfo.usage);
		VULKAN_HPP_HASH_COMBINE(seed, imageCreateInfo.sharingMode);
		VULKAN_HPP_HASH_COMBINE(seed, imageCreateInfo.queueFamilyIndexCount);
		VULKAN_HPP_HASH_COMBINE(seed, imageCreateInfo.pQueueFamilyIndices);
		VULKAN_HPP_HASH_COMBINE(seed, imageCreateInfo.initialLayout);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DeviceImageMemoryRequirements const &deviceImageMemoryRequirements) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, deviceImageMemoryRequirements.sType);
		VULKAN_HPP_HASH_COMBINE(seed, deviceImageMemoryRequirements.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, deviceImageMemoryRequirements.pCreateInfo);
		VULKAN_HPP_HASH_COMBINE(seed, deviceImageMemoryRequirements.planeAspect);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo const &deviceMemoryOpaqueCaptureAddressInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, deviceMemoryOpaqueCaptureAddressInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, deviceMemoryOpaqueCaptureAddressInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, deviceMemoryOpaqueCaptureAddressInfo.memory);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DeviceMemoryOverallocationCreateInfoAMD>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::DeviceMemoryOverallocationCreateInfoAMD const &deviceMemoryOverallocationCreateInfoAMD) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, deviceMemoryOverallocationCreateInfoAMD.sType);
		VULKAN_HPP_HASH_COMBINE(seed, deviceMemoryOverallocationCreateInfoAMD.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, deviceMemoryOverallocationCreateInfoAMD.overallocationBehavior);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DeviceMemoryReportCallbackDataEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DeviceMemoryReportCallbackDataEXT const &deviceMemoryReportCallbackDataEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, deviceMemoryReportCallbackDataEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, deviceMemoryReportCallbackDataEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, deviceMemoryReportCallbackDataEXT.flags);
		VULKAN_HPP_HASH_COMBINE(seed, deviceMemoryReportCallbackDataEXT.type);
		VULKAN_HPP_HASH_COMBINE(seed, deviceMemoryReportCallbackDataEXT.memoryObjectId);
		VULKAN_HPP_HASH_COMBINE(seed, deviceMemoryReportCallbackDataEXT.size);
		VULKAN_HPP_HASH_COMBINE(seed, deviceMemoryReportCallbackDataEXT.objectType);
		VULKAN_HPP_HASH_COMBINE(seed, deviceMemoryReportCallbackDataEXT.objectHandle);
		VULKAN_HPP_HASH_COMBINE(seed, deviceMemoryReportCallbackDataEXT.heapIndex);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DevicePrivateDataCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DevicePrivateDataCreateInfo const &devicePrivateDataCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, devicePrivateDataCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, devicePrivateDataCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, devicePrivateDataCreateInfo.privateDataSlotRequestCount);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DeviceQueueGlobalPriorityCreateInfoKHR>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::DeviceQueueGlobalPriorityCreateInfoKHR const &deviceQueueGlobalPriorityCreateInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, deviceQueueGlobalPriorityCreateInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, deviceQueueGlobalPriorityCreateInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, deviceQueueGlobalPriorityCreateInfoKHR.globalPriority);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DeviceQueueInfo2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DeviceQueueInfo2 const &deviceQueueInfo2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, deviceQueueInfo2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, deviceQueueInfo2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, deviceQueueInfo2.flags);
		VULKAN_HPP_HASH_COMBINE(seed, deviceQueueInfo2.queueFamilyIndex);
		VULKAN_HPP_HASH_COMBINE(seed, deviceQueueInfo2.queueIndex);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_DIRECTFB_EXT)
template<>
struct hash<VULKAN_HPP_NAMESPACE::DirectFBSurfaceCreateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DirectFBSurfaceCreateInfoEXT const &directFBSurfaceCreateInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, directFBSurfaceCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, directFBSurfaceCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, directFBSurfaceCreateInfoEXT.flags);
		VULKAN_HPP_HASH_COMBINE(seed, directFBSurfaceCreateInfoEXT.dfb);
		VULKAN_HPP_HASH_COMBINE(seed, directFBSurfaceCreateInfoEXT.surface);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::DispatchIndirectCommand>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DispatchIndirectCommand const &dispatchIndirectCommand) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, dispatchIndirectCommand.x);
		VULKAN_HPP_HASH_COMBINE(seed, dispatchIndirectCommand.y);
		VULKAN_HPP_HASH_COMBINE(seed, dispatchIndirectCommand.z);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DisplayEventInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DisplayEventInfoEXT const &displayEventInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, displayEventInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, displayEventInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, displayEventInfoEXT.displayEvent);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DisplayModeParametersKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DisplayModeParametersKHR const &displayModeParametersKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, displayModeParametersKHR.visibleRegion);
		VULKAN_HPP_HASH_COMBINE(seed, displayModeParametersKHR.refreshRate);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DisplayModeCreateInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DisplayModeCreateInfoKHR const &displayModeCreateInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, displayModeCreateInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, displayModeCreateInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, displayModeCreateInfoKHR.flags);
		VULKAN_HPP_HASH_COMBINE(seed, displayModeCreateInfoKHR.parameters);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR const &displayModePropertiesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, displayModePropertiesKHR.displayMode);
		VULKAN_HPP_HASH_COMBINE(seed, displayModePropertiesKHR.parameters);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR const &displayModeProperties2KHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, displayModeProperties2KHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, displayModeProperties2KHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, displayModeProperties2KHR.displayModeProperties);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DisplayNativeHdrSurfaceCapabilitiesAMD>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::DisplayNativeHdrSurfaceCapabilitiesAMD const &displayNativeHdrSurfaceCapabilitiesAMD) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, displayNativeHdrSurfaceCapabilitiesAMD.sType);
		VULKAN_HPP_HASH_COMBINE(seed, displayNativeHdrSurfaceCapabilitiesAMD.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, displayNativeHdrSurfaceCapabilitiesAMD.localDimmingSupport);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilitiesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilitiesKHR const &displayPlaneCapabilitiesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, displayPlaneCapabilitiesKHR.supportedAlpha);
		VULKAN_HPP_HASH_COMBINE(seed, displayPlaneCapabilitiesKHR.minSrcPosition);
		VULKAN_HPP_HASH_COMBINE(seed, displayPlaneCapabilitiesKHR.maxSrcPosition);
		VULKAN_HPP_HASH_COMBINE(seed, displayPlaneCapabilitiesKHR.minSrcExtent);
		VULKAN_HPP_HASH_COMBINE(seed, displayPlaneCapabilitiesKHR.maxSrcExtent);
		VULKAN_HPP_HASH_COMBINE(seed, displayPlaneCapabilitiesKHR.minDstPosition);
		VULKAN_HPP_HASH_COMBINE(seed, displayPlaneCapabilitiesKHR.maxDstPosition);
		VULKAN_HPP_HASH_COMBINE(seed, displayPlaneCapabilitiesKHR.minDstExtent);
		VULKAN_HPP_HASH_COMBINE(seed, displayPlaneCapabilitiesKHR.maxDstExtent);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilities2KHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilities2KHR const &displayPlaneCapabilities2KHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, displayPlaneCapabilities2KHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, displayPlaneCapabilities2KHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, displayPlaneCapabilities2KHR.capabilities);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DisplayPlaneInfo2KHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DisplayPlaneInfo2KHR const &displayPlaneInfo2KHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, displayPlaneInfo2KHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, displayPlaneInfo2KHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, displayPlaneInfo2KHR.mode);
		VULKAN_HPP_HASH_COMBINE(seed, displayPlaneInfo2KHR.planeIndex);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR const &displayPlanePropertiesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, displayPlanePropertiesKHR.currentDisplay);
		VULKAN_HPP_HASH_COMBINE(seed, displayPlanePropertiesKHR.currentStackIndex);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR const &displayPlaneProperties2KHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, displayPlaneProperties2KHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, displayPlaneProperties2KHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, displayPlaneProperties2KHR.displayPlaneProperties);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DisplayPowerInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DisplayPowerInfoEXT const &displayPowerInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, displayPowerInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, displayPowerInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, displayPowerInfoEXT.powerState);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DisplayPresentInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DisplayPresentInfoKHR const &displayPresentInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, displayPresentInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, displayPresentInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, displayPresentInfoKHR.srcRect);
		VULKAN_HPP_HASH_COMBINE(seed, displayPresentInfoKHR.dstRect);
		VULKAN_HPP_HASH_COMBINE(seed, displayPresentInfoKHR.persistent);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR const &displayPropertiesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, displayPropertiesKHR.display);
		for(const char *p = displayPropertiesKHR.displayName; *p != '\0'; ++p)
		{
			VULKAN_HPP_HASH_COMBINE(seed, *p);
		}
		VULKAN_HPP_HASH_COMBINE(seed, displayPropertiesKHR.physicalDimensions);
		VULKAN_HPP_HASH_COMBINE(seed, displayPropertiesKHR.physicalResolution);
		VULKAN_HPP_HASH_COMBINE(seed, displayPropertiesKHR.supportedTransforms);
		VULKAN_HPP_HASH_COMBINE(seed, displayPropertiesKHR.planeReorderPossible);
		VULKAN_HPP_HASH_COMBINE(seed, displayPropertiesKHR.persistentContent);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DisplayProperties2KHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DisplayProperties2KHR const &displayProperties2KHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, displayProperties2KHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, displayProperties2KHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, displayProperties2KHR.displayProperties);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DisplaySurfaceCreateInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DisplaySurfaceCreateInfoKHR const &displaySurfaceCreateInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, displaySurfaceCreateInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, displaySurfaceCreateInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, displaySurfaceCreateInfoKHR.flags);
		VULKAN_HPP_HASH_COMBINE(seed, displaySurfaceCreateInfoKHR.displayMode);
		VULKAN_HPP_HASH_COMBINE(seed, displaySurfaceCreateInfoKHR.planeIndex);
		VULKAN_HPP_HASH_COMBINE(seed, displaySurfaceCreateInfoKHR.planeStackIndex);
		VULKAN_HPP_HASH_COMBINE(seed, displaySurfaceCreateInfoKHR.transform);
		VULKAN_HPP_HASH_COMBINE(seed, displaySurfaceCreateInfoKHR.globalAlpha);
		VULKAN_HPP_HASH_COMBINE(seed, displaySurfaceCreateInfoKHR.alphaMode);
		VULKAN_HPP_HASH_COMBINE(seed, displaySurfaceCreateInfoKHR.imageExtent);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DrawIndexedIndirectCommand>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DrawIndexedIndirectCommand const &drawIndexedIndirectCommand) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, drawIndexedIndirectCommand.indexCount);
		VULKAN_HPP_HASH_COMBINE(seed, drawIndexedIndirectCommand.instanceCount);
		VULKAN_HPP_HASH_COMBINE(seed, drawIndexedIndirectCommand.firstIndex);
		VULKAN_HPP_HASH_COMBINE(seed, drawIndexedIndirectCommand.vertexOffset);
		VULKAN_HPP_HASH_COMBINE(seed, drawIndexedIndirectCommand.firstInstance);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DrawIndirectCommand>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DrawIndirectCommand const &drawIndirectCommand) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, drawIndirectCommand.vertexCount);
		VULKAN_HPP_HASH_COMBINE(seed, drawIndirectCommand.instanceCount);
		VULKAN_HPP_HASH_COMBINE(seed, drawIndirectCommand.firstVertex);
		VULKAN_HPP_HASH_COMBINE(seed, drawIndirectCommand.firstInstance);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DrawMeshTasksIndirectCommandNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DrawMeshTasksIndirectCommandNV const &drawMeshTasksIndirectCommandNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, drawMeshTasksIndirectCommandNV.taskCount);
		VULKAN_HPP_HASH_COMBINE(seed, drawMeshTasksIndirectCommandNV.firstTask);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DrmFormatModifierProperties2EXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DrmFormatModifierProperties2EXT const &drmFormatModifierProperties2EXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, drmFormatModifierProperties2EXT.drmFormatModifier);
		VULKAN_HPP_HASH_COMBINE(seed, drmFormatModifierProperties2EXT.drmFormatModifierPlaneCount);
		VULKAN_HPP_HASH_COMBINE(seed, drmFormatModifierProperties2EXT.drmFormatModifierTilingFeatures);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesEXT const &drmFormatModifierPropertiesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, drmFormatModifierPropertiesEXT.drmFormatModifier);
		VULKAN_HPP_HASH_COMBINE(seed, drmFormatModifierPropertiesEXT.drmFormatModifierPlaneCount);
		VULKAN_HPP_HASH_COMBINE(seed, drmFormatModifierPropertiesEXT.drmFormatModifierTilingFeatures);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesList2EXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesList2EXT const &drmFormatModifierPropertiesList2EXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, drmFormatModifierPropertiesList2EXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, drmFormatModifierPropertiesList2EXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, drmFormatModifierPropertiesList2EXT.drmFormatModifierCount);
		VULKAN_HPP_HASH_COMBINE(seed, drmFormatModifierPropertiesList2EXT.pDrmFormatModifierProperties);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesListEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::DrmFormatModifierPropertiesListEXT const &drmFormatModifierPropertiesListEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, drmFormatModifierPropertiesListEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, drmFormatModifierPropertiesListEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, drmFormatModifierPropertiesListEXT.drmFormatModifierCount);
		VULKAN_HPP_HASH_COMBINE(seed, drmFormatModifierPropertiesListEXT.pDrmFormatModifierProperties);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::EventCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::EventCreateInfo const &eventCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, eventCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, eventCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, eventCreateInfo.flags);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ExportFenceCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ExportFenceCreateInfo const &exportFenceCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, exportFenceCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, exportFenceCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, exportFenceCreateInfo.handleTypes);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::ExportFenceWin32HandleInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ExportFenceWin32HandleInfoKHR const &exportFenceWin32HandleInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, exportFenceWin32HandleInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, exportFenceWin32HandleInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, exportFenceWin32HandleInfoKHR.pAttributes);
		VULKAN_HPP_HASH_COMBINE(seed, exportFenceWin32HandleInfoKHR.dwAccess);
		VULKAN_HPP_HASH_COMBINE(seed, exportFenceWin32HandleInfoKHR.name);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::ExportMemoryAllocateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ExportMemoryAllocateInfo const &exportMemoryAllocateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, exportMemoryAllocateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, exportMemoryAllocateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, exportMemoryAllocateInfo.handleTypes);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ExportMemoryAllocateInfoNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ExportMemoryAllocateInfoNV const &exportMemoryAllocateInfoNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, exportMemoryAllocateInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, exportMemoryAllocateInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, exportMemoryAllocateInfoNV.handleTypes);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::ExportMemoryWin32HandleInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ExportMemoryWin32HandleInfoKHR const &exportMemoryWin32HandleInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, exportMemoryWin32HandleInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, exportMemoryWin32HandleInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, exportMemoryWin32HandleInfoKHR.pAttributes);
		VULKAN_HPP_HASH_COMBINE(seed, exportMemoryWin32HandleInfoKHR.dwAccess);
		VULKAN_HPP_HASH_COMBINE(seed, exportMemoryWin32HandleInfoKHR.name);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::ExportMemoryWin32HandleInfoNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ExportMemoryWin32HandleInfoNV const &exportMemoryWin32HandleInfoNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, exportMemoryWin32HandleInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, exportMemoryWin32HandleInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, exportMemoryWin32HandleInfoNV.pAttributes);
		VULKAN_HPP_HASH_COMBINE(seed, exportMemoryWin32HandleInfoNV.dwAccess);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::ExportSemaphoreCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ExportSemaphoreCreateInfo const &exportSemaphoreCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, exportSemaphoreCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, exportSemaphoreCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, exportSemaphoreCreateInfo.handleTypes);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::ExportSemaphoreWin32HandleInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ExportSemaphoreWin32HandleInfoKHR const &exportSemaphoreWin32HandleInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, exportSemaphoreWin32HandleInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, exportSemaphoreWin32HandleInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, exportSemaphoreWin32HandleInfoKHR.pAttributes);
		VULKAN_HPP_HASH_COMBINE(seed, exportSemaphoreWin32HandleInfoKHR.dwAccess);
		VULKAN_HPP_HASH_COMBINE(seed, exportSemaphoreWin32HandleInfoKHR.name);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::ExtensionProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ExtensionProperties const &extensionProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		for(size_t i = 0; i < VK_MAX_EXTENSION_NAME_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, extensionProperties.extensionName[i]);
		}
		VULKAN_HPP_HASH_COMBINE(seed, extensionProperties.specVersion);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ExternalMemoryProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ExternalMemoryProperties const &externalMemoryProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, externalMemoryProperties.externalMemoryFeatures);
		VULKAN_HPP_HASH_COMBINE(seed, externalMemoryProperties.exportFromImportedHandleTypes);
		VULKAN_HPP_HASH_COMBINE(seed, externalMemoryProperties.compatibleHandleTypes);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ExternalBufferProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ExternalBufferProperties const &externalBufferProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, externalBufferProperties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, externalBufferProperties.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, externalBufferProperties.externalMemoryProperties);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ExternalFenceProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ExternalFenceProperties const &externalFenceProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, externalFenceProperties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, externalFenceProperties.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, externalFenceProperties.exportFromImportedHandleTypes);
		VULKAN_HPP_HASH_COMBINE(seed, externalFenceProperties.compatibleHandleTypes);
		VULKAN_HPP_HASH_COMBINE(seed, externalFenceProperties.externalFenceFeatures);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_ANDROID_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::ExternalFormatANDROID>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ExternalFormatANDROID const &externalFormatANDROID) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, externalFormatANDROID.sType);
		VULKAN_HPP_HASH_COMBINE(seed, externalFormatANDROID.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, externalFormatANDROID.externalFormat);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_ANDROID_KHR*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::ExternalImageFormatProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ExternalImageFormatProperties const &externalImageFormatProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, externalImageFormatProperties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, externalImageFormatProperties.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, externalImageFormatProperties.externalMemoryProperties);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageFormatProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageFormatProperties const &imageFormatProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageFormatProperties.maxExtent);
		VULKAN_HPP_HASH_COMBINE(seed, imageFormatProperties.maxMipLevels);
		VULKAN_HPP_HASH_COMBINE(seed, imageFormatProperties.maxArrayLayers);
		VULKAN_HPP_HASH_COMBINE(seed, imageFormatProperties.sampleCounts);
		VULKAN_HPP_HASH_COMBINE(seed, imageFormatProperties.maxResourceSize);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ExternalImageFormatPropertiesNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ExternalImageFormatPropertiesNV const &externalImageFormatPropertiesNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, externalImageFormatPropertiesNV.imageFormatProperties);
		VULKAN_HPP_HASH_COMBINE(seed, externalImageFormatPropertiesNV.externalMemoryFeatures);
		VULKAN_HPP_HASH_COMBINE(seed, externalImageFormatPropertiesNV.exportFromImportedHandleTypes);
		VULKAN_HPP_HASH_COMBINE(seed, externalImageFormatPropertiesNV.compatibleHandleTypes);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ExternalMemoryBufferCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ExternalMemoryBufferCreateInfo const &externalMemoryBufferCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, externalMemoryBufferCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, externalMemoryBufferCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, externalMemoryBufferCreateInfo.handleTypes);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ExternalMemoryImageCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ExternalMemoryImageCreateInfo const &externalMemoryImageCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, externalMemoryImageCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, externalMemoryImageCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, externalMemoryImageCreateInfo.handleTypes);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ExternalMemoryImageCreateInfoNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ExternalMemoryImageCreateInfoNV const &externalMemoryImageCreateInfoNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, externalMemoryImageCreateInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, externalMemoryImageCreateInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, externalMemoryImageCreateInfoNV.handleTypes);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties const &externalSemaphoreProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, externalSemaphoreProperties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, externalSemaphoreProperties.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, externalSemaphoreProperties.exportFromImportedHandleTypes);
		VULKAN_HPP_HASH_COMBINE(seed, externalSemaphoreProperties.compatibleHandleTypes);
		VULKAN_HPP_HASH_COMBINE(seed, externalSemaphoreProperties.externalSemaphoreFeatures);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::FenceCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::FenceCreateInfo const &fenceCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, fenceCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, fenceCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, fenceCreateInfo.flags);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::FenceGetFdInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::FenceGetFdInfoKHR const &fenceGetFdInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, fenceGetFdInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, fenceGetFdInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, fenceGetFdInfoKHR.fence);
		VULKAN_HPP_HASH_COMBINE(seed, fenceGetFdInfoKHR.handleType);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::FenceGetWin32HandleInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::FenceGetWin32HandleInfoKHR const &fenceGetWin32HandleInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, fenceGetWin32HandleInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, fenceGetWin32HandleInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, fenceGetWin32HandleInfoKHR.fence);
		VULKAN_HPP_HASH_COMBINE(seed, fenceGetWin32HandleInfoKHR.handleType);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::FilterCubicImageViewImageFormatPropertiesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::FilterCubicImageViewImageFormatPropertiesEXT const &filterCubicImageViewImageFormatPropertiesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, filterCubicImageViewImageFormatPropertiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, filterCubicImageViewImageFormatPropertiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, filterCubicImageViewImageFormatPropertiesEXT.filterCubic);
		VULKAN_HPP_HASH_COMBINE(seed, filterCubicImageViewImageFormatPropertiesEXT.filterCubicMinmax);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::FormatProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::FormatProperties const &formatProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, formatProperties.linearTilingFeatures);
		VULKAN_HPP_HASH_COMBINE(seed, formatProperties.optimalTilingFeatures);
		VULKAN_HPP_HASH_COMBINE(seed, formatProperties.bufferFeatures);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::FormatProperties2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::FormatProperties2 const &formatProperties2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, formatProperties2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, formatProperties2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, formatProperties2.formatProperties);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::FormatProperties3>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::FormatProperties3 const &formatProperties3) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, formatProperties3.sType);
		VULKAN_HPP_HASH_COMBINE(seed, formatProperties3.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, formatProperties3.linearTilingFeatures);
		VULKAN_HPP_HASH_COMBINE(seed, formatProperties3.optimalTilingFeatures);
		VULKAN_HPP_HASH_COMBINE(seed, formatProperties3.bufferFeatures);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::FragmentShadingRateAttachmentInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::FragmentShadingRateAttachmentInfoKHR const &fragmentShadingRateAttachmentInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, fragmentShadingRateAttachmentInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, fragmentShadingRateAttachmentInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, fragmentShadingRateAttachmentInfoKHR.pFragmentShadingRateAttachment);
		VULKAN_HPP_HASH_COMBINE(seed, fragmentShadingRateAttachmentInfoKHR.shadingRateAttachmentTexelSize);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::FramebufferAttachmentImageInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::FramebufferAttachmentImageInfo const &framebufferAttachmentImageInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, framebufferAttachmentImageInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, framebufferAttachmentImageInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, framebufferAttachmentImageInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, framebufferAttachmentImageInfo.usage);
		VULKAN_HPP_HASH_COMBINE(seed, framebufferAttachmentImageInfo.width);
		VULKAN_HPP_HASH_COMBINE(seed, framebufferAttachmentImageInfo.height);
		VULKAN_HPP_HASH_COMBINE(seed, framebufferAttachmentImageInfo.layerCount);
		VULKAN_HPP_HASH_COMBINE(seed, framebufferAttachmentImageInfo.viewFormatCount);
		VULKAN_HPP_HASH_COMBINE(seed, framebufferAttachmentImageInfo.pViewFormats);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::FramebufferAttachmentsCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::FramebufferAttachmentsCreateInfo const &framebufferAttachmentsCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, framebufferAttachmentsCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, framebufferAttachmentsCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, framebufferAttachmentsCreateInfo.attachmentImageInfoCount);
		VULKAN_HPP_HASH_COMBINE(seed, framebufferAttachmentsCreateInfo.pAttachmentImageInfos);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::FramebufferCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::FramebufferCreateInfo const &framebufferCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, framebufferCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, framebufferCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, framebufferCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, framebufferCreateInfo.renderPass);
		VULKAN_HPP_HASH_COMBINE(seed, framebufferCreateInfo.attachmentCount);
		VULKAN_HPP_HASH_COMBINE(seed, framebufferCreateInfo.pAttachments);
		VULKAN_HPP_HASH_COMBINE(seed, framebufferCreateInfo.width);
		VULKAN_HPP_HASH_COMBINE(seed, framebufferCreateInfo.height);
		VULKAN_HPP_HASH_COMBINE(seed, framebufferCreateInfo.layers);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV const &framebufferMixedSamplesCombinationNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, framebufferMixedSamplesCombinationNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, framebufferMixedSamplesCombinationNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, framebufferMixedSamplesCombinationNV.coverageReductionMode);
		VULKAN_HPP_HASH_COMBINE(seed, framebufferMixedSamplesCombinationNV.rasterizationSamples);
		VULKAN_HPP_HASH_COMBINE(seed, framebufferMixedSamplesCombinationNV.depthStencilSamples);
		VULKAN_HPP_HASH_COMBINE(seed, framebufferMixedSamplesCombinationNV.colorSamples);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::IndirectCommandsStreamNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::IndirectCommandsStreamNV const &indirectCommandsStreamNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsStreamNV.buffer);
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsStreamNV.offset);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV const &generatedCommandsInfoNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, generatedCommandsInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, generatedCommandsInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, generatedCommandsInfoNV.pipelineBindPoint);
		VULKAN_HPP_HASH_COMBINE(seed, generatedCommandsInfoNV.pipeline);
		VULKAN_HPP_HASH_COMBINE(seed, generatedCommandsInfoNV.indirectCommandsLayout);
		VULKAN_HPP_HASH_COMBINE(seed, generatedCommandsInfoNV.streamCount);
		VULKAN_HPP_HASH_COMBINE(seed, generatedCommandsInfoNV.pStreams);
		VULKAN_HPP_HASH_COMBINE(seed, generatedCommandsInfoNV.sequencesCount);
		VULKAN_HPP_HASH_COMBINE(seed, generatedCommandsInfoNV.preprocessBuffer);
		VULKAN_HPP_HASH_COMBINE(seed, generatedCommandsInfoNV.preprocessOffset);
		VULKAN_HPP_HASH_COMBINE(seed, generatedCommandsInfoNV.preprocessSize);
		VULKAN_HPP_HASH_COMBINE(seed, generatedCommandsInfoNV.sequencesCountBuffer);
		VULKAN_HPP_HASH_COMBINE(seed, generatedCommandsInfoNV.sequencesCountOffset);
		VULKAN_HPP_HASH_COMBINE(seed, generatedCommandsInfoNV.sequencesIndexBuffer);
		VULKAN_HPP_HASH_COMBINE(seed, generatedCommandsInfoNV.sequencesIndexOffset);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoNV>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::GeneratedCommandsMemoryRequirementsInfoNV const &generatedCommandsMemoryRequirementsInfoNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, generatedCommandsMemoryRequirementsInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, generatedCommandsMemoryRequirementsInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, generatedCommandsMemoryRequirementsInfoNV.pipelineBindPoint);
		VULKAN_HPP_HASH_COMBINE(seed, generatedCommandsMemoryRequirementsInfoNV.pipeline);
		VULKAN_HPP_HASH_COMBINE(seed, generatedCommandsMemoryRequirementsInfoNV.indirectCommandsLayout);
		VULKAN_HPP_HASH_COMBINE(seed, generatedCommandsMemoryRequirementsInfoNV.maxSequencesCount);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::VertexInputBindingDescription>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VertexInputBindingDescription const &vertexInputBindingDescription) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, vertexInputBindingDescription.binding);
		VULKAN_HPP_HASH_COMBINE(seed, vertexInputBindingDescription.stride);
		VULKAN_HPP_HASH_COMBINE(seed, vertexInputBindingDescription.inputRate);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription const &vertexInputAttributeDescription) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, vertexInputAttributeDescription.location);
		VULKAN_HPP_HASH_COMBINE(seed, vertexInputAttributeDescription.binding);
		VULKAN_HPP_HASH_COMBINE(seed, vertexInputAttributeDescription.format);
		VULKAN_HPP_HASH_COMBINE(seed, vertexInputAttributeDescription.offset);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateInfo const &pipelineVertexInputStateCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineVertexInputStateCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineVertexInputStateCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineVertexInputStateCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineVertexInputStateCreateInfo.pVertexBindingDescriptions);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineInputAssemblyStateCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineInputAssemblyStateCreateInfo const &pipelineInputAssemblyStateCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineInputAssemblyStateCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineInputAssemblyStateCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineInputAssemblyStateCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineInputAssemblyStateCreateInfo.topology);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineInputAssemblyStateCreateInfo.primitiveRestartEnable);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineTessellationStateCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineTessellationStateCreateInfo const &pipelineTessellationStateCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineTessellationStateCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineTessellationStateCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineTessellationStateCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineTessellationStateCreateInfo.patchControlPoints);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineViewportStateCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineViewportStateCreateInfo const &pipelineViewportStateCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportStateCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportStateCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportStateCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportStateCreateInfo.viewportCount);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportStateCreateInfo.pViewports);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportStateCreateInfo.scissorCount);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportStateCreateInfo.pScissors);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineRasterizationStateCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineRasterizationStateCreateInfo const &pipelineRasterizationStateCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationStateCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationStateCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationStateCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationStateCreateInfo.depthClampEnable);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationStateCreateInfo.rasterizerDiscardEnable);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationStateCreateInfo.polygonMode);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationStateCreateInfo.cullMode);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationStateCreateInfo.frontFace);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationStateCreateInfo.depthBiasEnable);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationStateCreateInfo.depthBiasConstantFactor);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationStateCreateInfo.depthBiasClamp);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationStateCreateInfo.depthBiasSlopeFactor);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationStateCreateInfo.lineWidth);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineMultisampleStateCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineMultisampleStateCreateInfo const &pipelineMultisampleStateCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineMultisampleStateCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineMultisampleStateCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineMultisampleStateCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineMultisampleStateCreateInfo.rasterizationSamples);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineMultisampleStateCreateInfo.sampleShadingEnable);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineMultisampleStateCreateInfo.minSampleShading);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineMultisampleStateCreateInfo.pSampleMask);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineMultisampleStateCreateInfo.alphaToCoverageEnable);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineMultisampleStateCreateInfo.alphaToOneEnable);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::StencilOpState>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::StencilOpState const &stencilOpState) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, stencilOpState.failOp);
		VULKAN_HPP_HASH_COMBINE(seed, stencilOpState.passOp);
		VULKAN_HPP_HASH_COMBINE(seed, stencilOpState.depthFailOp);
		VULKAN_HPP_HASH_COMBINE(seed, stencilOpState.compareOp);
		VULKAN_HPP_HASH_COMBINE(seed, stencilOpState.compareMask);
		VULKAN_HPP_HASH_COMBINE(seed, stencilOpState.writeMask);
		VULKAN_HPP_HASH_COMBINE(seed, stencilOpState.reference);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineDepthStencilStateCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineDepthStencilStateCreateInfo const &pipelineDepthStencilStateCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineDepthStencilStateCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineDepthStencilStateCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineDepthStencilStateCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineDepthStencilStateCreateInfo.depthTestEnable);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineDepthStencilStateCreateInfo.depthWriteEnable);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineDepthStencilStateCreateInfo.depthCompareOp);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineDepthStencilStateCreateInfo.depthBoundsTestEnable);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineDepthStencilStateCreateInfo.stencilTestEnable);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineDepthStencilStateCreateInfo.front);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineDepthStencilStateCreateInfo.back);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineDepthStencilStateCreateInfo.minDepthBounds);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineDepthStencilStateCreateInfo.maxDepthBounds);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineColorBlendAttachmentState>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineColorBlendAttachmentState const &pipelineColorBlendAttachmentState) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineColorBlendAttachmentState.blendEnable);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineColorBlendAttachmentState.srcColorBlendFactor);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineColorBlendAttachmentState.dstColorBlendFactor);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineColorBlendAttachmentState.colorBlendOp);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineColorBlendAttachmentState.srcAlphaBlendFactor);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineColorBlendAttachmentState.dstAlphaBlendFactor);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineColorBlendAttachmentState.alphaBlendOp);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineColorBlendAttachmentState.colorWriteMask);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineColorBlendStateCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineColorBlendStateCreateInfo const &pipelineColorBlendStateCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineColorBlendStateCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineColorBlendStateCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineColorBlendStateCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineColorBlendStateCreateInfo.logicOpEnable);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineColorBlendStateCreateInfo.logicOp);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineColorBlendStateCreateInfo.attachmentCount);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineColorBlendStateCreateInfo.pAttachments);
		for(size_t i = 0; i < 4; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, pipelineColorBlendStateCreateInfo.blendConstants[i]);
		}
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineDynamicStateCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineDynamicStateCreateInfo const &pipelineDynamicStateCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineDynamicStateCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineDynamicStateCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineDynamicStateCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineDynamicStateCreateInfo.dynamicStateCount);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineDynamicStateCreateInfo.pDynamicStates);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::GraphicsPipelineCreateInfo const &graphicsPipelineCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineCreateInfo.stageCount);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineCreateInfo.pStages);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineCreateInfo.pVertexInputState);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineCreateInfo.pInputAssemblyState);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineCreateInfo.pTessellationState);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineCreateInfo.pViewportState);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineCreateInfo.pRasterizationState);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineCreateInfo.pMultisampleState);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineCreateInfo.pDepthStencilState);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineCreateInfo.pColorBlendState);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineCreateInfo.pDynamicState);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineCreateInfo.layout);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineCreateInfo.renderPass);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineCreateInfo.subpass);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineCreateInfo.basePipelineHandle);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineCreateInfo.basePipelineIndex);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::GraphicsPipelineLibraryCreateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::GraphicsPipelineLibraryCreateInfoEXT const &graphicsPipelineLibraryCreateInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineLibraryCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineLibraryCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineLibraryCreateInfoEXT.flags);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::GraphicsShaderGroupCreateInfoNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::GraphicsShaderGroupCreateInfoNV const &graphicsShaderGroupCreateInfoNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, graphicsShaderGroupCreateInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsShaderGroupCreateInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsShaderGroupCreateInfoNV.stageCount);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsShaderGroupCreateInfoNV.pStages);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsShaderGroupCreateInfoNV.pVertexInputState);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsShaderGroupCreateInfoNV.pTessellationState);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::GraphicsPipelineShaderGroupsCreateInfoNV>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::GraphicsPipelineShaderGroupsCreateInfoNV const &graphicsPipelineShaderGroupsCreateInfoNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineShaderGroupsCreateInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineShaderGroupsCreateInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineShaderGroupsCreateInfoNV.groupCount);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineShaderGroupsCreateInfoNV.pGroups);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineShaderGroupsCreateInfoNV.pipelineCount);
		VULKAN_HPP_HASH_COMBINE(seed, graphicsPipelineShaderGroupsCreateInfoNV.pPipelines);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::XYColorEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::XYColorEXT const &xYColorEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, xYColorEXT.x);
		VULKAN_HPP_HASH_COMBINE(seed, xYColorEXT.y);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::HdrMetadataEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::HdrMetadataEXT const &hdrMetadataEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, hdrMetadataEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, hdrMetadataEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, hdrMetadataEXT.displayPrimaryRed);
		VULKAN_HPP_HASH_COMBINE(seed, hdrMetadataEXT.displayPrimaryGreen);
		VULKAN_HPP_HASH_COMBINE(seed, hdrMetadataEXT.displayPrimaryBlue);
		VULKAN_HPP_HASH_COMBINE(seed, hdrMetadataEXT.whitePoint);
		VULKAN_HPP_HASH_COMBINE(seed, hdrMetadataEXT.maxLuminance);
		VULKAN_HPP_HASH_COMBINE(seed, hdrMetadataEXT.minLuminance);
		VULKAN_HPP_HASH_COMBINE(seed, hdrMetadataEXT.maxContentLightLevel);
		VULKAN_HPP_HASH_COMBINE(seed, hdrMetadataEXT.maxFrameAverageLightLevel);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::HeadlessSurfaceCreateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::HeadlessSurfaceCreateInfoEXT const &headlessSurfaceCreateInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, headlessSurfaceCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, headlessSurfaceCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, headlessSurfaceCreateInfoEXT.flags);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_IOS_MVK)
template<>
struct hash<VULKAN_HPP_NAMESPACE::IOSSurfaceCreateInfoMVK>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::IOSSurfaceCreateInfoMVK const &iOSSurfaceCreateInfoMVK) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, iOSSurfaceCreateInfoMVK.sType);
		VULKAN_HPP_HASH_COMBINE(seed, iOSSurfaceCreateInfoMVK.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, iOSSurfaceCreateInfoMVK.flags);
		VULKAN_HPP_HASH_COMBINE(seed, iOSSurfaceCreateInfoMVK.pView);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_IOS_MVK*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageBlit>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageBlit const &imageBlit) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageBlit.srcSubresource);
		for(size_t i = 0; i < 2; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, imageBlit.srcOffsets[i]);
		}
		VULKAN_HPP_HASH_COMBINE(seed, imageBlit.dstSubresource);
		for(size_t i = 0; i < 2; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, imageBlit.dstOffsets[i]);
		}
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_FUCHSIA)
template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageFormatConstraintsInfoFUCHSIA>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageFormatConstraintsInfoFUCHSIA const &imageFormatConstraintsInfoFUCHSIA) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageFormatConstraintsInfoFUCHSIA.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imageFormatConstraintsInfoFUCHSIA.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imageFormatConstraintsInfoFUCHSIA.imageCreateInfo);
		VULKAN_HPP_HASH_COMBINE(seed, imageFormatConstraintsInfoFUCHSIA.requiredFormatFeatures);
		VULKAN_HPP_HASH_COMBINE(seed, imageFormatConstraintsInfoFUCHSIA.flags);
		VULKAN_HPP_HASH_COMBINE(seed, imageFormatConstraintsInfoFUCHSIA.sysmemPixelFormat);
		VULKAN_HPP_HASH_COMBINE(seed, imageFormatConstraintsInfoFUCHSIA.colorSpaceCount);
		VULKAN_HPP_HASH_COMBINE(seed, imageFormatConstraintsInfoFUCHSIA.pColorSpaces);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

#	if defined(VK_USE_PLATFORM_FUCHSIA)
template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageConstraintsInfoFUCHSIA>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageConstraintsInfoFUCHSIA const &imageConstraintsInfoFUCHSIA) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageConstraintsInfoFUCHSIA.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imageConstraintsInfoFUCHSIA.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imageConstraintsInfoFUCHSIA.formatConstraintsCount);
		VULKAN_HPP_HASH_COMBINE(seed, imageConstraintsInfoFUCHSIA.pFormatConstraints);
		VULKAN_HPP_HASH_COMBINE(seed, imageConstraintsInfoFUCHSIA.bufferCollectionConstraints);
		VULKAN_HPP_HASH_COMBINE(seed, imageConstraintsInfoFUCHSIA.flags);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageCopy>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageCopy const &imageCopy) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageCopy.srcSubresource);
		VULKAN_HPP_HASH_COMBINE(seed, imageCopy.srcOffset);
		VULKAN_HPP_HASH_COMBINE(seed, imageCopy.dstSubresource);
		VULKAN_HPP_HASH_COMBINE(seed, imageCopy.dstOffset);
		VULKAN_HPP_HASH_COMBINE(seed, imageCopy.extent);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SubresourceLayout>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SubresourceLayout const &subresourceLayout) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, subresourceLayout.offset);
		VULKAN_HPP_HASH_COMBINE(seed, subresourceLayout.size);
		VULKAN_HPP_HASH_COMBINE(seed, subresourceLayout.rowPitch);
		VULKAN_HPP_HASH_COMBINE(seed, subresourceLayout.arrayPitch);
		VULKAN_HPP_HASH_COMBINE(seed, subresourceLayout.depthPitch);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierExplicitCreateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierExplicitCreateInfoEXT const &imageDrmFormatModifierExplicitCreateInfoEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageDrmFormatModifierExplicitCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imageDrmFormatModifierExplicitCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imageDrmFormatModifierExplicitCreateInfoEXT.drmFormatModifier);
		VULKAN_HPP_HASH_COMBINE(seed, imageDrmFormatModifierExplicitCreateInfoEXT.drmFormatModifierPlaneCount);
		VULKAN_HPP_HASH_COMBINE(seed, imageDrmFormatModifierExplicitCreateInfoEXT.pPlaneLayouts);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierListCreateInfoEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierListCreateInfoEXT const &imageDrmFormatModifierListCreateInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageDrmFormatModifierListCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imageDrmFormatModifierListCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imageDrmFormatModifierListCreateInfoEXT.drmFormatModifierCount);
		VULKAN_HPP_HASH_COMBINE(seed, imageDrmFormatModifierListCreateInfoEXT.pDrmFormatModifiers);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierPropertiesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierPropertiesEXT const &imageDrmFormatModifierPropertiesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageDrmFormatModifierPropertiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imageDrmFormatModifierPropertiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imageDrmFormatModifierPropertiesEXT.drmFormatModifier);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageFormatListCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageFormatListCreateInfo const &imageFormatListCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageFormatListCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imageFormatListCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imageFormatListCreateInfo.viewFormatCount);
		VULKAN_HPP_HASH_COMBINE(seed, imageFormatListCreateInfo.pViewFormats);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageFormatProperties2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageFormatProperties2 const &imageFormatProperties2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageFormatProperties2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imageFormatProperties2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imageFormatProperties2.imageFormatProperties);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageMemoryBarrier>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageMemoryBarrier const &imageMemoryBarrier) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryBarrier.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryBarrier.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryBarrier.srcAccessMask);
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryBarrier.dstAccessMask);
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryBarrier.oldLayout);
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryBarrier.newLayout);
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryBarrier.srcQueueFamilyIndex);
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryBarrier.dstQueueFamilyIndex);
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryBarrier.image);
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryBarrier.subresourceRange);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageMemoryRequirementsInfo2 const &imageMemoryRequirementsInfo2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryRequirementsInfo2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryRequirementsInfo2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imageMemoryRequirementsInfo2.image);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_FUCHSIA)
template<>
struct hash<VULKAN_HPP_NAMESPACE::ImagePipeSurfaceCreateInfoFUCHSIA>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImagePipeSurfaceCreateInfoFUCHSIA const &imagePipeSurfaceCreateInfoFUCHSIA) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imagePipeSurfaceCreateInfoFUCHSIA.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imagePipeSurfaceCreateInfoFUCHSIA.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imagePipeSurfaceCreateInfoFUCHSIA.flags);
		VULKAN_HPP_HASH_COMBINE(seed, imagePipeSurfaceCreateInfoFUCHSIA.imagePipeHandle);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImagePlaneMemoryRequirementsInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImagePlaneMemoryRequirementsInfo const &imagePlaneMemoryRequirementsInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imagePlaneMemoryRequirementsInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imagePlaneMemoryRequirementsInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imagePlaneMemoryRequirementsInfo.planeAspect);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageResolve>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageResolve const &imageResolve) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageResolve.srcSubresource);
		VULKAN_HPP_HASH_COMBINE(seed, imageResolve.srcOffset);
		VULKAN_HPP_HASH_COMBINE(seed, imageResolve.dstSubresource);
		VULKAN_HPP_HASH_COMBINE(seed, imageResolve.dstOffset);
		VULKAN_HPP_HASH_COMBINE(seed, imageResolve.extent);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageResolve2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageResolve2 const &imageResolve2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageResolve2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imageResolve2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imageResolve2.srcSubresource);
		VULKAN_HPP_HASH_COMBINE(seed, imageResolve2.srcOffset);
		VULKAN_HPP_HASH_COMBINE(seed, imageResolve2.dstSubresource);
		VULKAN_HPP_HASH_COMBINE(seed, imageResolve2.dstOffset);
		VULKAN_HPP_HASH_COMBINE(seed, imageResolve2.extent);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageSparseMemoryRequirementsInfo2 const &imageSparseMemoryRequirementsInfo2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageSparseMemoryRequirementsInfo2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imageSparseMemoryRequirementsInfo2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imageSparseMemoryRequirementsInfo2.image);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageStencilUsageCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageStencilUsageCreateInfo const &imageStencilUsageCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageStencilUsageCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imageStencilUsageCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imageStencilUsageCreateInfo.stencilUsage);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageSwapchainCreateInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageSwapchainCreateInfoKHR const &imageSwapchainCreateInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageSwapchainCreateInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imageSwapchainCreateInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imageSwapchainCreateInfoKHR.swapchain);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageViewASTCDecodeModeEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageViewASTCDecodeModeEXT const &imageViewASTCDecodeModeEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageViewASTCDecodeModeEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imageViewASTCDecodeModeEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imageViewASTCDecodeModeEXT.decodeMode);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageViewAddressPropertiesNVX>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageViewAddressPropertiesNVX const &imageViewAddressPropertiesNVX) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageViewAddressPropertiesNVX.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imageViewAddressPropertiesNVX.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imageViewAddressPropertiesNVX.deviceAddress);
		VULKAN_HPP_HASH_COMBINE(seed, imageViewAddressPropertiesNVX.size);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageViewCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageViewCreateInfo const &imageViewCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageViewCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imageViewCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imageViewCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, imageViewCreateInfo.image);
		VULKAN_HPP_HASH_COMBINE(seed, imageViewCreateInfo.viewType);
		VULKAN_HPP_HASH_COMBINE(seed, imageViewCreateInfo.format);
		VULKAN_HPP_HASH_COMBINE(seed, imageViewCreateInfo.components);
		VULKAN_HPP_HASH_COMBINE(seed, imageViewCreateInfo.subresourceRange);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageViewHandleInfoNVX>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageViewHandleInfoNVX const &imageViewHandleInfoNVX) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageViewHandleInfoNVX.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imageViewHandleInfoNVX.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imageViewHandleInfoNVX.imageView);
		VULKAN_HPP_HASH_COMBINE(seed, imageViewHandleInfoNVX.descriptorType);
		VULKAN_HPP_HASH_COMBINE(seed, imageViewHandleInfoNVX.sampler);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageViewMinLodCreateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageViewMinLodCreateInfoEXT const &imageViewMinLodCreateInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageViewMinLodCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imageViewMinLodCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imageViewMinLodCreateInfoEXT.minLod);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImageViewUsageCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImageViewUsageCreateInfo const &imageViewUsageCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, imageViewUsageCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, imageViewUsageCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, imageViewUsageCreateInfo.usage);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_ANDROID_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::ImportAndroidHardwareBufferInfoANDROID>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::ImportAndroidHardwareBufferInfoANDROID const &importAndroidHardwareBufferInfoANDROID) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, importAndroidHardwareBufferInfoANDROID.sType);
		VULKAN_HPP_HASH_COMBINE(seed, importAndroidHardwareBufferInfoANDROID.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, importAndroidHardwareBufferInfoANDROID.buffer);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_ANDROID_KHR*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImportFenceFdInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImportFenceFdInfoKHR const &importFenceFdInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, importFenceFdInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, importFenceFdInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, importFenceFdInfoKHR.fence);
		VULKAN_HPP_HASH_COMBINE(seed, importFenceFdInfoKHR.flags);
		VULKAN_HPP_HASH_COMBINE(seed, importFenceFdInfoKHR.handleType);
		VULKAN_HPP_HASH_COMBINE(seed, importFenceFdInfoKHR.fd);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::ImportFenceWin32HandleInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImportFenceWin32HandleInfoKHR const &importFenceWin32HandleInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, importFenceWin32HandleInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, importFenceWin32HandleInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, importFenceWin32HandleInfoKHR.fence);
		VULKAN_HPP_HASH_COMBINE(seed, importFenceWin32HandleInfoKHR.flags);
		VULKAN_HPP_HASH_COMBINE(seed, importFenceWin32HandleInfoKHR.handleType);
		VULKAN_HPP_HASH_COMBINE(seed, importFenceWin32HandleInfoKHR.handle);
		VULKAN_HPP_HASH_COMBINE(seed, importFenceWin32HandleInfoKHR.name);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

#	if defined(VK_USE_PLATFORM_FUCHSIA)
template<>
struct hash<VULKAN_HPP_NAMESPACE::ImportMemoryBufferCollectionFUCHSIA>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImportMemoryBufferCollectionFUCHSIA const &importMemoryBufferCollectionFUCHSIA) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryBufferCollectionFUCHSIA.sType);
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryBufferCollectionFUCHSIA.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryBufferCollectionFUCHSIA.collection);
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryBufferCollectionFUCHSIA.index);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImportMemoryFdInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImportMemoryFdInfoKHR const &importMemoryFdInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryFdInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryFdInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryFdInfoKHR.handleType);
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryFdInfoKHR.fd);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImportMemoryHostPointerInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImportMemoryHostPointerInfoEXT const &importMemoryHostPointerInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryHostPointerInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryHostPointerInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryHostPointerInfoEXT.handleType);
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryHostPointerInfoEXT.pHostPointer);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::ImportMemoryWin32HandleInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImportMemoryWin32HandleInfoKHR const &importMemoryWin32HandleInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryWin32HandleInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryWin32HandleInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryWin32HandleInfoKHR.handleType);
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryWin32HandleInfoKHR.handle);
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryWin32HandleInfoKHR.name);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::ImportMemoryWin32HandleInfoNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImportMemoryWin32HandleInfoNV const &importMemoryWin32HandleInfoNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryWin32HandleInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryWin32HandleInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryWin32HandleInfoNV.handleType);
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryWin32HandleInfoNV.handle);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

#	if defined(VK_USE_PLATFORM_FUCHSIA)
template<>
struct hash<VULKAN_HPP_NAMESPACE::ImportMemoryZirconHandleInfoFUCHSIA>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImportMemoryZirconHandleInfoFUCHSIA const &importMemoryZirconHandleInfoFUCHSIA) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryZirconHandleInfoFUCHSIA.sType);
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryZirconHandleInfoFUCHSIA.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryZirconHandleInfoFUCHSIA.handleType);
		VULKAN_HPP_HASH_COMBINE(seed, importMemoryZirconHandleInfoFUCHSIA.handle);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::ImportSemaphoreFdInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImportSemaphoreFdInfoKHR const &importSemaphoreFdInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, importSemaphoreFdInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, importSemaphoreFdInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, importSemaphoreFdInfoKHR.semaphore);
		VULKAN_HPP_HASH_COMBINE(seed, importSemaphoreFdInfoKHR.flags);
		VULKAN_HPP_HASH_COMBINE(seed, importSemaphoreFdInfoKHR.handleType);
		VULKAN_HPP_HASH_COMBINE(seed, importSemaphoreFdInfoKHR.fd);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::ImportSemaphoreWin32HandleInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ImportSemaphoreWin32HandleInfoKHR const &importSemaphoreWin32HandleInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, importSemaphoreWin32HandleInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, importSemaphoreWin32HandleInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, importSemaphoreWin32HandleInfoKHR.semaphore);
		VULKAN_HPP_HASH_COMBINE(seed, importSemaphoreWin32HandleInfoKHR.flags);
		VULKAN_HPP_HASH_COMBINE(seed, importSemaphoreWin32HandleInfoKHR.handleType);
		VULKAN_HPP_HASH_COMBINE(seed, importSemaphoreWin32HandleInfoKHR.handle);
		VULKAN_HPP_HASH_COMBINE(seed, importSemaphoreWin32HandleInfoKHR.name);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

#	if defined(VK_USE_PLATFORM_FUCHSIA)
template<>
struct hash<VULKAN_HPP_NAMESPACE::ImportSemaphoreZirconHandleInfoFUCHSIA>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::ImportSemaphoreZirconHandleInfoFUCHSIA const &importSemaphoreZirconHandleInfoFUCHSIA) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, importSemaphoreZirconHandleInfoFUCHSIA.sType);
		VULKAN_HPP_HASH_COMBINE(seed, importSemaphoreZirconHandleInfoFUCHSIA.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, importSemaphoreZirconHandleInfoFUCHSIA.semaphore);
		VULKAN_HPP_HASH_COMBINE(seed, importSemaphoreZirconHandleInfoFUCHSIA.flags);
		VULKAN_HPP_HASH_COMBINE(seed, importSemaphoreZirconHandleInfoFUCHSIA.handleType);
		VULKAN_HPP_HASH_COMBINE(seed, importSemaphoreZirconHandleInfoFUCHSIA.zirconHandle);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenNV const &indirectCommandsLayoutTokenNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsLayoutTokenNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsLayoutTokenNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsLayoutTokenNV.tokenType);
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsLayoutTokenNV.stream);
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsLayoutTokenNV.offset);
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsLayoutTokenNV.vertexBindingUnit);
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsLayoutTokenNV.vertexDynamicStride);
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsLayoutTokenNV.pushconstantPipelineLayout);
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsLayoutTokenNV.pushconstantShaderStageFlags);
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsLayoutTokenNV.pushconstantOffset);
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsLayoutTokenNV.pushconstantSize);
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsLayoutTokenNV.indirectStateFlags);
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsLayoutTokenNV.indexTypeCount);
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsLayoutTokenNV.pIndexTypes);
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsLayoutTokenNV.pIndexTypeValues);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutCreateInfoNV const &indirectCommandsLayoutCreateInfoNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsLayoutCreateInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsLayoutCreateInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsLayoutCreateInfoNV.flags);
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsLayoutCreateInfoNV.pipelineBindPoint);
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsLayoutCreateInfoNV.tokenCount);
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsLayoutCreateInfoNV.pTokens);
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsLayoutCreateInfoNV.streamCount);
		VULKAN_HPP_HASH_COMBINE(seed, indirectCommandsLayoutCreateInfoNV.pStreamStrides);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::InitializePerformanceApiInfoINTEL>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::InitializePerformanceApiInfoINTEL const &initializePerformanceApiInfoINTEL) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, initializePerformanceApiInfoINTEL.sType);
		VULKAN_HPP_HASH_COMBINE(seed, initializePerformanceApiInfoINTEL.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, initializePerformanceApiInfoINTEL.pUserData);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::InputAttachmentAspectReference>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::InputAttachmentAspectReference const &inputAttachmentAspectReference) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, inputAttachmentAspectReference.subpass);
		VULKAN_HPP_HASH_COMBINE(seed, inputAttachmentAspectReference.inputAttachmentIndex);
		VULKAN_HPP_HASH_COMBINE(seed, inputAttachmentAspectReference.aspectMask);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::InstanceCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::InstanceCreateInfo const &instanceCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, instanceCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, instanceCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, instanceCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, instanceCreateInfo.pApplicationInfo);
		VULKAN_HPP_HASH_COMBINE(seed, instanceCreateInfo.enabledLayerCount);
		for(size_t i = 0; i < instanceCreateInfo.enabledLayerCount; ++i)
		{
			for(const char *p = instanceCreateInfo.ppEnabledLayerNames[i]; *p != '\0'; ++p)
			{
				VULKAN_HPP_HASH_COMBINE(seed, *p);
			}
		}
		VULKAN_HPP_HASH_COMBINE(seed, instanceCreateInfo.enabledExtensionCount);
		for(size_t i = 0; i < instanceCreateInfo.enabledExtensionCount; ++i)
		{
			for(const char *p = instanceCreateInfo.ppEnabledExtensionNames[i]; *p != '\0'; ++p)
			{
				VULKAN_HPP_HASH_COMBINE(seed, *p);
			}
		}
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::LayerProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::LayerProperties const &layerProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		for(size_t i = 0; i < VK_MAX_EXTENSION_NAME_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, layerProperties.layerName[i]);
		}
		VULKAN_HPP_HASH_COMBINE(seed, layerProperties.specVersion);
		VULKAN_HPP_HASH_COMBINE(seed, layerProperties.implementationVersion);
		for(size_t i = 0; i < VK_MAX_DESCRIPTION_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, layerProperties.description[i]);
		}
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_MACOS_MVK)
template<>
struct hash<VULKAN_HPP_NAMESPACE::MacOSSurfaceCreateInfoMVK>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MacOSSurfaceCreateInfoMVK const &macOSSurfaceCreateInfoMVK) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, macOSSurfaceCreateInfoMVK.sType);
		VULKAN_HPP_HASH_COMBINE(seed, macOSSurfaceCreateInfoMVK.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, macOSSurfaceCreateInfoMVK.flags);
		VULKAN_HPP_HASH_COMBINE(seed, macOSSurfaceCreateInfoMVK.pView);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_MACOS_MVK*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::MappedMemoryRange>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MappedMemoryRange const &mappedMemoryRange) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, mappedMemoryRange.sType);
		VULKAN_HPP_HASH_COMBINE(seed, mappedMemoryRange.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, mappedMemoryRange.memory);
		VULKAN_HPP_HASH_COMBINE(seed, mappedMemoryRange.offset);
		VULKAN_HPP_HASH_COMBINE(seed, mappedMemoryRange.size);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::MemoryAllocateFlagsInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MemoryAllocateFlagsInfo const &memoryAllocateFlagsInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, memoryAllocateFlagsInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, memoryAllocateFlagsInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, memoryAllocateFlagsInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, memoryAllocateFlagsInfo.deviceMask);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::MemoryAllocateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MemoryAllocateInfo const &memoryAllocateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, memoryAllocateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, memoryAllocateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, memoryAllocateInfo.allocationSize);
		VULKAN_HPP_HASH_COMBINE(seed, memoryAllocateInfo.memoryTypeIndex);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::MemoryBarrier>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MemoryBarrier const &memoryBarrier) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, memoryBarrier.sType);
		VULKAN_HPP_HASH_COMBINE(seed, memoryBarrier.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, memoryBarrier.srcAccessMask);
		VULKAN_HPP_HASH_COMBINE(seed, memoryBarrier.dstAccessMask);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::MemoryDedicatedAllocateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MemoryDedicatedAllocateInfo const &memoryDedicatedAllocateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, memoryDedicatedAllocateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, memoryDedicatedAllocateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, memoryDedicatedAllocateInfo.image);
		VULKAN_HPP_HASH_COMBINE(seed, memoryDedicatedAllocateInfo.buffer);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::MemoryDedicatedRequirements>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MemoryDedicatedRequirements const &memoryDedicatedRequirements) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, memoryDedicatedRequirements.sType);
		VULKAN_HPP_HASH_COMBINE(seed, memoryDedicatedRequirements.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, memoryDedicatedRequirements.prefersDedicatedAllocation);
		VULKAN_HPP_HASH_COMBINE(seed, memoryDedicatedRequirements.requiresDedicatedAllocation);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::MemoryFdPropertiesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MemoryFdPropertiesKHR const &memoryFdPropertiesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, memoryFdPropertiesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, memoryFdPropertiesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, memoryFdPropertiesKHR.memoryTypeBits);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_ANDROID_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::MemoryGetAndroidHardwareBufferInfoANDROID>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::MemoryGetAndroidHardwareBufferInfoANDROID const &memoryGetAndroidHardwareBufferInfoANDROID) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, memoryGetAndroidHardwareBufferInfoANDROID.sType);
		VULKAN_HPP_HASH_COMBINE(seed, memoryGetAndroidHardwareBufferInfoANDROID.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, memoryGetAndroidHardwareBufferInfoANDROID.memory);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_ANDROID_KHR*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::MemoryGetFdInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MemoryGetFdInfoKHR const &memoryGetFdInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, memoryGetFdInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, memoryGetFdInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, memoryGetFdInfoKHR.memory);
		VULKAN_HPP_HASH_COMBINE(seed, memoryGetFdInfoKHR.handleType);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::MemoryGetRemoteAddressInfoNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MemoryGetRemoteAddressInfoNV const &memoryGetRemoteAddressInfoNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, memoryGetRemoteAddressInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, memoryGetRemoteAddressInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, memoryGetRemoteAddressInfoNV.memory);
		VULKAN_HPP_HASH_COMBINE(seed, memoryGetRemoteAddressInfoNV.handleType);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::MemoryGetWin32HandleInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MemoryGetWin32HandleInfoKHR const &memoryGetWin32HandleInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, memoryGetWin32HandleInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, memoryGetWin32HandleInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, memoryGetWin32HandleInfoKHR.memory);
		VULKAN_HPP_HASH_COMBINE(seed, memoryGetWin32HandleInfoKHR.handleType);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

#	if defined(VK_USE_PLATFORM_FUCHSIA)
template<>
struct hash<VULKAN_HPP_NAMESPACE::MemoryGetZirconHandleInfoFUCHSIA>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MemoryGetZirconHandleInfoFUCHSIA const &memoryGetZirconHandleInfoFUCHSIA) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, memoryGetZirconHandleInfoFUCHSIA.sType);
		VULKAN_HPP_HASH_COMBINE(seed, memoryGetZirconHandleInfoFUCHSIA.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, memoryGetZirconHandleInfoFUCHSIA.memory);
		VULKAN_HPP_HASH_COMBINE(seed, memoryGetZirconHandleInfoFUCHSIA.handleType);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::MemoryHeap>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MemoryHeap const &memoryHeap) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, memoryHeap.size);
		VULKAN_HPP_HASH_COMBINE(seed, memoryHeap.flags);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::MemoryHostPointerPropertiesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MemoryHostPointerPropertiesEXT const &memoryHostPointerPropertiesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, memoryHostPointerPropertiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, memoryHostPointerPropertiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, memoryHostPointerPropertiesEXT.memoryTypeBits);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::MemoryOpaqueCaptureAddressAllocateInfo>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::MemoryOpaqueCaptureAddressAllocateInfo const &memoryOpaqueCaptureAddressAllocateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, memoryOpaqueCaptureAddressAllocateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, memoryOpaqueCaptureAddressAllocateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, memoryOpaqueCaptureAddressAllocateInfo.opaqueCaptureAddress);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::MemoryPriorityAllocateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MemoryPriorityAllocateInfoEXT const &memoryPriorityAllocateInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, memoryPriorityAllocateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, memoryPriorityAllocateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, memoryPriorityAllocateInfoEXT.priority);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::MemoryRequirements>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MemoryRequirements const &memoryRequirements) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, memoryRequirements.size);
		VULKAN_HPP_HASH_COMBINE(seed, memoryRequirements.alignment);
		VULKAN_HPP_HASH_COMBINE(seed, memoryRequirements.memoryTypeBits);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::MemoryRequirements2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MemoryRequirements2 const &memoryRequirements2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, memoryRequirements2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, memoryRequirements2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, memoryRequirements2.memoryRequirements);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::MemoryType>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MemoryType const &memoryType) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, memoryType.propertyFlags);
		VULKAN_HPP_HASH_COMBINE(seed, memoryType.heapIndex);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::MemoryWin32HandlePropertiesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MemoryWin32HandlePropertiesKHR const &memoryWin32HandlePropertiesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, memoryWin32HandlePropertiesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, memoryWin32HandlePropertiesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, memoryWin32HandlePropertiesKHR.memoryTypeBits);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

#	if defined(VK_USE_PLATFORM_FUCHSIA)
template<>
struct hash<VULKAN_HPP_NAMESPACE::MemoryZirconHandlePropertiesFUCHSIA>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MemoryZirconHandlePropertiesFUCHSIA const &memoryZirconHandlePropertiesFUCHSIA) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, memoryZirconHandlePropertiesFUCHSIA.sType);
		VULKAN_HPP_HASH_COMBINE(seed, memoryZirconHandlePropertiesFUCHSIA.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, memoryZirconHandlePropertiesFUCHSIA.memoryTypeBits);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

#	if defined(VK_USE_PLATFORM_METAL_EXT)
template<>
struct hash<VULKAN_HPP_NAMESPACE::MetalSurfaceCreateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MetalSurfaceCreateInfoEXT const &metalSurfaceCreateInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, metalSurfaceCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, metalSurfaceCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, metalSurfaceCreateInfoEXT.flags);
		VULKAN_HPP_HASH_COMBINE(seed, metalSurfaceCreateInfoEXT.pLayer);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_METAL_EXT*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::MultiDrawIndexedInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MultiDrawIndexedInfoEXT const &multiDrawIndexedInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, multiDrawIndexedInfoEXT.firstIndex);
		VULKAN_HPP_HASH_COMBINE(seed, multiDrawIndexedInfoEXT.indexCount);
		VULKAN_HPP_HASH_COMBINE(seed, multiDrawIndexedInfoEXT.vertexOffset);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::MultiDrawInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MultiDrawInfoEXT const &multiDrawInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, multiDrawInfoEXT.firstVertex);
		VULKAN_HPP_HASH_COMBINE(seed, multiDrawInfoEXT.vertexCount);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::MultisamplePropertiesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MultisamplePropertiesEXT const &multisamplePropertiesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, multisamplePropertiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, multisamplePropertiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, multisamplePropertiesEXT.maxSampleLocationGridSize);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::MultiviewPerViewAttributesInfoNVX>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MultiviewPerViewAttributesInfoNVX const &multiviewPerViewAttributesInfoNVX) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, multiviewPerViewAttributesInfoNVX.sType);
		VULKAN_HPP_HASH_COMBINE(seed, multiviewPerViewAttributesInfoNVX.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, multiviewPerViewAttributesInfoNVX.perViewAttributes);
		VULKAN_HPP_HASH_COMBINE(seed, multiviewPerViewAttributesInfoNVX.perViewAttributesPositionXOnly);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::MutableDescriptorTypeListVALVE>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MutableDescriptorTypeListVALVE const &mutableDescriptorTypeListVALVE) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, mutableDescriptorTypeListVALVE.descriptorTypeCount);
		VULKAN_HPP_HASH_COMBINE(seed, mutableDescriptorTypeListVALVE.pDescriptorTypes);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::MutableDescriptorTypeCreateInfoVALVE>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::MutableDescriptorTypeCreateInfoVALVE const &mutableDescriptorTypeCreateInfoVALVE) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, mutableDescriptorTypeCreateInfoVALVE.sType);
		VULKAN_HPP_HASH_COMBINE(seed, mutableDescriptorTypeCreateInfoVALVE.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, mutableDescriptorTypeCreateInfoVALVE.mutableDescriptorTypeListCount);
		VULKAN_HPP_HASH_COMBINE(seed, mutableDescriptorTypeCreateInfoVALVE.pMutableDescriptorTypeLists);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE const &pastPresentationTimingGOOGLE) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pastPresentationTimingGOOGLE.presentID);
		VULKAN_HPP_HASH_COMBINE(seed, pastPresentationTimingGOOGLE.desiredPresentTime);
		VULKAN_HPP_HASH_COMBINE(seed, pastPresentationTimingGOOGLE.actualPresentTime);
		VULKAN_HPP_HASH_COMBINE(seed, pastPresentationTimingGOOGLE.earliestPresentTime);
		VULKAN_HPP_HASH_COMBINE(seed, pastPresentationTimingGOOGLE.presentMargin);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PerformanceConfigurationAcquireInfoINTEL>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PerformanceConfigurationAcquireInfoINTEL const &performanceConfigurationAcquireInfoINTEL) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, performanceConfigurationAcquireInfoINTEL.sType);
		VULKAN_HPP_HASH_COMBINE(seed, performanceConfigurationAcquireInfoINTEL.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, performanceConfigurationAcquireInfoINTEL.type);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR const &performanceCounterDescriptionKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, performanceCounterDescriptionKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, performanceCounterDescriptionKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, performanceCounterDescriptionKHR.flags);
		for(size_t i = 0; i < VK_MAX_DESCRIPTION_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, performanceCounterDescriptionKHR.name[i]);
		}
		for(size_t i = 0; i < VK_MAX_DESCRIPTION_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, performanceCounterDescriptionKHR.category[i]);
		}
		for(size_t i = 0; i < VK_MAX_DESCRIPTION_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, performanceCounterDescriptionKHR.description[i]);
		}
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PerformanceCounterKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PerformanceCounterKHR const &performanceCounterKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, performanceCounterKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, performanceCounterKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, performanceCounterKHR.unit);
		VULKAN_HPP_HASH_COMBINE(seed, performanceCounterKHR.scope);
		VULKAN_HPP_HASH_COMBINE(seed, performanceCounterKHR.storage);
		for(size_t i = 0; i < VK_UUID_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, performanceCounterKHR.uuid[i]);
		}
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PerformanceMarkerInfoINTEL>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PerformanceMarkerInfoINTEL const &performanceMarkerInfoINTEL) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, performanceMarkerInfoINTEL.sType);
		VULKAN_HPP_HASH_COMBINE(seed, performanceMarkerInfoINTEL.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, performanceMarkerInfoINTEL.marker);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PerformanceOverrideInfoINTEL>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PerformanceOverrideInfoINTEL const &performanceOverrideInfoINTEL) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, performanceOverrideInfoINTEL.sType);
		VULKAN_HPP_HASH_COMBINE(seed, performanceOverrideInfoINTEL.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, performanceOverrideInfoINTEL.type);
		VULKAN_HPP_HASH_COMBINE(seed, performanceOverrideInfoINTEL.enable);
		VULKAN_HPP_HASH_COMBINE(seed, performanceOverrideInfoINTEL.parameter);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PerformanceQuerySubmitInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PerformanceQuerySubmitInfoKHR const &performanceQuerySubmitInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, performanceQuerySubmitInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, performanceQuerySubmitInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, performanceQuerySubmitInfoKHR.counterPassIndex);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PerformanceStreamMarkerInfoINTEL>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PerformanceStreamMarkerInfoINTEL const &performanceStreamMarkerInfoINTEL) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, performanceStreamMarkerInfoINTEL.sType);
		VULKAN_HPP_HASH_COMBINE(seed, performanceStreamMarkerInfoINTEL.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, performanceStreamMarkerInfoINTEL.marker);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevice16BitStorageFeatures>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDevice16BitStorageFeatures const &physicalDevice16BitStorageFeatures) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevice16BitStorageFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevice16BitStorageFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevice16BitStorageFeatures.storageBuffer16BitAccess);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevice16BitStorageFeatures.uniformAndStorageBuffer16BitAccess);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevice16BitStorageFeatures.storagePushConstant16);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevice16BitStorageFeatures.storageInputOutput16);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevice4444FormatsFeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDevice4444FormatsFeaturesEXT const &physicalDevice4444FormatsFeaturesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevice4444FormatsFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevice4444FormatsFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevice4444FormatsFeaturesEXT.formatA4R4G4B4);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevice4444FormatsFeaturesEXT.formatA4B4G4R4);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevice8BitStorageFeatures>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDevice8BitStorageFeatures const &physicalDevice8BitStorageFeatures) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevice8BitStorageFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevice8BitStorageFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevice8BitStorageFeatures.storageBuffer8BitAccess);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevice8BitStorageFeatures.uniformAndStorageBuffer8BitAccess);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevice8BitStorageFeatures.storagePushConstant8);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceASTCDecodeFeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceASTCDecodeFeaturesEXT const &physicalDeviceASTCDecodeFeaturesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceASTCDecodeFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceASTCDecodeFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceASTCDecodeFeaturesEXT.decodeModeSharedExponent);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceAccelerationStructureFeaturesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceAccelerationStructureFeaturesKHR const &physicalDeviceAccelerationStructureFeaturesKHR) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceAccelerationStructureFeaturesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceAccelerationStructureFeaturesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceAccelerationStructureFeaturesKHR.accelerationStructure);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceAccelerationStructureFeaturesKHR.accelerationStructureCaptureReplay);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceAccelerationStructureFeaturesKHR.accelerationStructureIndirectBuild);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceAccelerationStructureFeaturesKHR.accelerationStructureHostCommands);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceAccelerationStructureFeaturesKHR.descriptorBindingAccelerationStructureUpdateAfterBind);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceAccelerationStructurePropertiesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceAccelerationStructurePropertiesKHR const &physicalDeviceAccelerationStructurePropertiesKHR)
	    const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceAccelerationStructurePropertiesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceAccelerationStructurePropertiesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceAccelerationStructurePropertiesKHR.maxGeometryCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceAccelerationStructurePropertiesKHR.maxInstanceCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceAccelerationStructurePropertiesKHR.maxPrimitiveCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceAccelerationStructurePropertiesKHR.maxPerStageDescriptorAccelerationStructures);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceAccelerationStructurePropertiesKHR.maxPerStageDescriptorUpdateAfterBindAccelerationStructures);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceAccelerationStructurePropertiesKHR.maxDescriptorSetAccelerationStructures);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceAccelerationStructurePropertiesKHR.maxDescriptorSetUpdateAfterBindAccelerationStructures);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceAccelerationStructurePropertiesKHR.minAccelerationStructureScratchOffsetAlignment);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceBlendOperationAdvancedFeaturesEXT>
{
	std::size_t operator()(
	    VULKAN_HPP_NAMESPACE::PhysicalDeviceBlendOperationAdvancedFeaturesEXT const &physicalDeviceBlendOperationAdvancedFeaturesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBlendOperationAdvancedFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBlendOperationAdvancedFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBlendOperationAdvancedFeaturesEXT.advancedBlendCoherentOperations);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceBlendOperationAdvancedPropertiesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceBlendOperationAdvancedPropertiesEXT const &physicalDeviceBlendOperationAdvancedPropertiesEXT)
	    const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBlendOperationAdvancedPropertiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBlendOperationAdvancedPropertiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBlendOperationAdvancedPropertiesEXT.advancedBlendMaxColorAttachments);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBlendOperationAdvancedPropertiesEXT.advancedBlendIndependentBlend);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBlendOperationAdvancedPropertiesEXT.advancedBlendNonPremultipliedSrcColor);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBlendOperationAdvancedPropertiesEXT.advancedBlendNonPremultipliedDstColor);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBlendOperationAdvancedPropertiesEXT.advancedBlendCorrelatedOverlap);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBlendOperationAdvancedPropertiesEXT.advancedBlendAllOperations);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceBorderColorSwizzleFeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceBorderColorSwizzleFeaturesEXT const &physicalDeviceBorderColorSwizzleFeaturesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBorderColorSwizzleFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBorderColorSwizzleFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBorderColorSwizzleFeaturesEXT.borderColorSwizzle);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBorderColorSwizzleFeaturesEXT.borderColorSwizzleFromImage);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceBufferDeviceAddressFeatures>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceBufferDeviceAddressFeatures const &physicalDeviceBufferDeviceAddressFeatures) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBufferDeviceAddressFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBufferDeviceAddressFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBufferDeviceAddressFeatures.bufferDeviceAddress);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBufferDeviceAddressFeatures.bufferDeviceAddressCaptureReplay);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBufferDeviceAddressFeatures.bufferDeviceAddressMultiDevice);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceBufferDeviceAddressFeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceBufferDeviceAddressFeaturesEXT const &physicalDeviceBufferDeviceAddressFeaturesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBufferDeviceAddressFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBufferDeviceAddressFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBufferDeviceAddressFeaturesEXT.bufferDeviceAddress);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBufferDeviceAddressFeaturesEXT.bufferDeviceAddressCaptureReplay);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceBufferDeviceAddressFeaturesEXT.bufferDeviceAddressMultiDevice);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCoherentMemoryFeaturesAMD>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceCoherentMemoryFeaturesAMD const &physicalDeviceCoherentMemoryFeaturesAMD) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceCoherentMemoryFeaturesAMD.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceCoherentMemoryFeaturesAMD.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceCoherentMemoryFeaturesAMD.deviceCoherentMemory);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceColorWriteEnableFeaturesEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceColorWriteEnableFeaturesEXT const &physicalDeviceColorWriteEnableFeaturesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceColorWriteEnableFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceColorWriteEnableFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceColorWriteEnableFeaturesEXT.colorWriteEnable);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceComputeShaderDerivativesFeaturesNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceComputeShaderDerivativesFeaturesNV const &physicalDeviceComputeShaderDerivativesFeaturesNV)
	    const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceComputeShaderDerivativesFeaturesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceComputeShaderDerivativesFeaturesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceComputeShaderDerivativesFeaturesNV.computeDerivativeGroupQuads);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceComputeShaderDerivativesFeaturesNV.computeDerivativeGroupLinear);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceConditionalRenderingFeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceConditionalRenderingFeaturesEXT const &physicalDeviceConditionalRenderingFeaturesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceConditionalRenderingFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceConditionalRenderingFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceConditionalRenderingFeaturesEXT.conditionalRendering);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceConditionalRenderingFeaturesEXT.inheritedConditionalRendering);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceConservativeRasterizationPropertiesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceConservativeRasterizationPropertiesEXT const &
	                           physicalDeviceConservativeRasterizationPropertiesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceConservativeRasterizationPropertiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceConservativeRasterizationPropertiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceConservativeRasterizationPropertiesEXT.primitiveOverestimationSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceConservativeRasterizationPropertiesEXT.maxExtraPrimitiveOverestimationSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceConservativeRasterizationPropertiesEXT.extraPrimitiveOverestimationSizeGranularity);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceConservativeRasterizationPropertiesEXT.primitiveUnderestimation);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceConservativeRasterizationPropertiesEXT.conservativePointAndLineRasterization);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceConservativeRasterizationPropertiesEXT.degenerateTrianglesRasterized);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceConservativeRasterizationPropertiesEXT.degenerateLinesRasterized);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceConservativeRasterizationPropertiesEXT.fullyCoveredFragmentShaderInputVariable);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceConservativeRasterizationPropertiesEXT.conservativeRasterizationPostDepthCoverage);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixFeaturesNV>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixFeaturesNV const &physicalDeviceCooperativeMatrixFeaturesNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceCooperativeMatrixFeaturesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceCooperativeMatrixFeaturesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceCooperativeMatrixFeaturesNV.cooperativeMatrix);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceCooperativeMatrixFeaturesNV.cooperativeMatrixRobustBufferAccess);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixPropertiesNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceCooperativeMatrixPropertiesNV const &physicalDeviceCooperativeMatrixPropertiesNV) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceCooperativeMatrixPropertiesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceCooperativeMatrixPropertiesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceCooperativeMatrixPropertiesNV.cooperativeMatrixSupportedStages);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCornerSampledImageFeaturesNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceCornerSampledImageFeaturesNV const &physicalDeviceCornerSampledImageFeaturesNV) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceCornerSampledImageFeaturesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceCornerSampledImageFeaturesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceCornerSampledImageFeaturesNV.cornerSampledImage);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCoverageReductionModeFeaturesNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceCoverageReductionModeFeaturesNV const &physicalDeviceCoverageReductionModeFeaturesNV) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceCoverageReductionModeFeaturesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceCoverageReductionModeFeaturesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceCoverageReductionModeFeaturesNV.coverageReductionMode);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCustomBorderColorFeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceCustomBorderColorFeaturesEXT const &physicalDeviceCustomBorderColorFeaturesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceCustomBorderColorFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceCustomBorderColorFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceCustomBorderColorFeaturesEXT.customBorderColors);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceCustomBorderColorFeaturesEXT.customBorderColorWithoutFormat);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceCustomBorderColorPropertiesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceCustomBorderColorPropertiesEXT const &physicalDeviceCustomBorderColorPropertiesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceCustomBorderColorPropertiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceCustomBorderColorPropertiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceCustomBorderColorPropertiesEXT.maxCustomBorderColorSamplers);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV const &
	                           physicalDeviceDedicatedAllocationImageAliasingFeaturesNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDedicatedAllocationImageAliasingFeaturesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDedicatedAllocationImageAliasingFeaturesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDedicatedAllocationImageAliasingFeaturesNV.dedicatedAllocationImageAliasing);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClipControlFeaturesEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClipControlFeaturesEXT const &physicalDeviceDepthClipControlFeaturesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDepthClipControlFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDepthClipControlFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDepthClipControlFeaturesEXT.depthClipControl);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClipEnableFeaturesEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthClipEnableFeaturesEXT const &physicalDeviceDepthClipEnableFeaturesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDepthClipEnableFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDepthClipEnableFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDepthClipEnableFeaturesEXT.depthClipEnable);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthStencilResolveProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceDepthStencilResolveProperties const &physicalDeviceDepthStencilResolveProperties) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDepthStencilResolveProperties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDepthStencilResolveProperties.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDepthStencilResolveProperties.supportedDepthResolveModes);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDepthStencilResolveProperties.supportedStencilResolveModes);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDepthStencilResolveProperties.independentResolveNone);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDepthStencilResolveProperties.independentResolve);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorIndexingFeatures>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorIndexingFeatures const &physicalDeviceDescriptorIndexingFeatures) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingFeatures.shaderInputAttachmentArrayDynamicIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingFeatures.shaderUniformTexelBufferArrayDynamicIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingFeatures.shaderStorageTexelBufferArrayDynamicIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingFeatures.shaderUniformBufferArrayNonUniformIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingFeatures.shaderSampledImageArrayNonUniformIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingFeatures.shaderStorageBufferArrayNonUniformIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingFeatures.shaderStorageImageArrayNonUniformIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingFeatures.shaderInputAttachmentArrayNonUniformIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingFeatures.shaderUniformTexelBufferArrayNonUniformIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingFeatures.shaderStorageTexelBufferArrayNonUniformIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingFeatures.descriptorBindingUniformBufferUpdateAfterBind);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingFeatures.descriptorBindingSampledImageUpdateAfterBind);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingFeatures.descriptorBindingStorageImageUpdateAfterBind);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingFeatures.descriptorBindingStorageBufferUpdateAfterBind);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingFeatures.descriptorBindingUniformTexelBufferUpdateAfterBind);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingFeatures.descriptorBindingStorageTexelBufferUpdateAfterBind);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingFeatures.descriptorBindingUpdateUnusedWhilePending);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingFeatures.descriptorBindingPartiallyBound);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingFeatures.descriptorBindingVariableDescriptorCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingFeatures.runtimeDescriptorArray);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorIndexingProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorIndexingProperties const &physicalDeviceDescriptorIndexingProperties) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.maxUpdateAfterBindDescriptorsInAllPools);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.shaderUniformBufferArrayNonUniformIndexingNative);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.shaderSampledImageArrayNonUniformIndexingNative);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.shaderStorageBufferArrayNonUniformIndexingNative);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.shaderStorageImageArrayNonUniformIndexingNative);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.shaderInputAttachmentArrayNonUniformIndexingNative);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.robustBufferAccessUpdateAfterBind);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.quadDivergentImplicitLod);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindSamplers);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindUniformBuffers);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindStorageBuffers);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindSampledImages);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindStorageImages);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindInputAttachments);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.maxPerStageUpdateAfterBindResources);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.maxDescriptorSetUpdateAfterBindSamplers);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.maxDescriptorSetUpdateAfterBindUniformBuffers);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.maxDescriptorSetUpdateAfterBindStorageBuffers);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.maxDescriptorSetUpdateAfterBindSampledImages);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.maxDescriptorSetUpdateAfterBindStorageImages);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorIndexingProperties.maxDescriptorSetUpdateAfterBindInputAttachments);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceDescriptorSetHostMappingFeaturesVALVE const &physicalDeviceDescriptorSetHostMappingFeaturesVALVE) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorSetHostMappingFeaturesVALVE.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorSetHostMappingFeaturesVALVE.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDescriptorSetHostMappingFeaturesVALVE.descriptorSetHostMapping);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsFeaturesNV>
{
	std::size_t operator()(
	    VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsFeaturesNV const &physicalDeviceDeviceGeneratedCommandsFeaturesNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDeviceGeneratedCommandsFeaturesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDeviceGeneratedCommandsFeaturesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDeviceGeneratedCommandsFeaturesNV.deviceGeneratedCommands);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsPropertiesNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceGeneratedCommandsPropertiesNV const &physicalDeviceDeviceGeneratedCommandsPropertiesNV)
	    const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDeviceGeneratedCommandsPropertiesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDeviceGeneratedCommandsPropertiesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDeviceGeneratedCommandsPropertiesNV.maxGraphicsShaderGroupCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDeviceGeneratedCommandsPropertiesNV.maxIndirectSequenceCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDeviceGeneratedCommandsPropertiesNV.maxIndirectCommandsTokenCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDeviceGeneratedCommandsPropertiesNV.maxIndirectCommandsStreamCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDeviceGeneratedCommandsPropertiesNV.maxIndirectCommandsTokenOffset);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDeviceGeneratedCommandsPropertiesNV.maxIndirectCommandsStreamStride);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDeviceGeneratedCommandsPropertiesNV.minSequencesCountBufferOffsetAlignment);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDeviceGeneratedCommandsPropertiesNV.minSequencesIndexBufferOffsetAlignment);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDeviceGeneratedCommandsPropertiesNV.minIndirectCommandsBufferOffsetAlignment);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceMemoryReportFeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceDeviceMemoryReportFeaturesEXT const &physicalDeviceDeviceMemoryReportFeaturesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDeviceMemoryReportFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDeviceMemoryReportFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDeviceMemoryReportFeaturesEXT.deviceMemoryReport);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDiagnosticsConfigFeaturesNV>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceDiagnosticsConfigFeaturesNV const &physicalDeviceDiagnosticsConfigFeaturesNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDiagnosticsConfigFeaturesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDiagnosticsConfigFeaturesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDiagnosticsConfigFeaturesNV.diagnosticsConfig);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDiscardRectanglePropertiesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceDiscardRectanglePropertiesEXT const &physicalDeviceDiscardRectanglePropertiesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDiscardRectanglePropertiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDiscardRectanglePropertiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDiscardRectanglePropertiesEXT.maxDiscardRectangles);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDriverProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceDriverProperties const &physicalDeviceDriverProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDriverProperties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDriverProperties.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDriverProperties.driverID);
		for(size_t i = 0; i < VK_MAX_DRIVER_NAME_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDriverProperties.driverName[i]);
		}
		for(size_t i = 0; i < VK_MAX_DRIVER_INFO_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDriverProperties.driverInfo[i]);
		}
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDriverProperties.conformanceVersion);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDrmPropertiesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceDrmPropertiesEXT const &physicalDeviceDrmPropertiesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDrmPropertiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDrmPropertiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDrmPropertiesEXT.hasPrimary);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDrmPropertiesEXT.hasRender);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDrmPropertiesEXT.primaryMajor);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDrmPropertiesEXT.primaryMinor);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDrmPropertiesEXT.renderMajor);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDrmPropertiesEXT.renderMinor);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceDynamicRenderingFeatures>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceDynamicRenderingFeatures const &physicalDeviceDynamicRenderingFeatures) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDynamicRenderingFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDynamicRenderingFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceDynamicRenderingFeatures.dynamicRendering);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExclusiveScissorFeaturesNV>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceExclusiveScissorFeaturesNV const &physicalDeviceExclusiveScissorFeaturesNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExclusiveScissorFeaturesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExclusiveScissorFeaturesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExclusiveScissorFeaturesNV.exclusiveScissor);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicState2FeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicState2FeaturesEXT const &physicalDeviceExtendedDynamicState2FeaturesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExtendedDynamicState2FeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExtendedDynamicState2FeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExtendedDynamicState2FeaturesEXT.extendedDynamicState2);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExtendedDynamicState2FeaturesEXT.extendedDynamicState2LogicOp);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExtendedDynamicState2FeaturesEXT.extendedDynamicState2PatchControlPoints);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicStateFeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceExtendedDynamicStateFeaturesEXT const &physicalDeviceExtendedDynamicStateFeaturesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExtendedDynamicStateFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExtendedDynamicStateFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExtendedDynamicStateFeaturesEXT.extendedDynamicState);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalBufferInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalBufferInfo const &physicalDeviceExternalBufferInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExternalBufferInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExternalBufferInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExternalBufferInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExternalBufferInfo.usage);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExternalBufferInfo.handleType);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFenceInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalFenceInfo const &physicalDeviceExternalFenceInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExternalFenceInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExternalFenceInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExternalFenceInfo.handleType);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalImageFormatInfo>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalImageFormatInfo const &physicalDeviceExternalImageFormatInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExternalImageFormatInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExternalImageFormatInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExternalImageFormatInfo.handleType);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalMemoryHostPropertiesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalMemoryHostPropertiesEXT const &physicalDeviceExternalMemoryHostPropertiesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExternalMemoryHostPropertiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExternalMemoryHostPropertiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExternalMemoryHostPropertiesEXT.minImportedHostPointerAlignment);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalMemoryRDMAFeaturesNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalMemoryRDMAFeaturesNV const &physicalDeviceExternalMemoryRDMAFeaturesNV) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExternalMemoryRDMAFeaturesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExternalMemoryRDMAFeaturesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExternalMemoryRDMAFeaturesNV.externalMemoryRDMA);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalSemaphoreInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceExternalSemaphoreInfo const &physicalDeviceExternalSemaphoreInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExternalSemaphoreInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExternalSemaphoreInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceExternalSemaphoreInfo.handleType);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 const &physicalDeviceFeatures2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFeatures2.features);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFloatControlsProperties>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceFloatControlsProperties const &physicalDeviceFloatControlsProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFloatControlsProperties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFloatControlsProperties.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFloatControlsProperties.denormBehaviorIndependence);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFloatControlsProperties.roundingModeIndependence);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFloatControlsProperties.shaderSignedZeroInfNanPreserveFloat16);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFloatControlsProperties.shaderSignedZeroInfNanPreserveFloat32);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFloatControlsProperties.shaderSignedZeroInfNanPreserveFloat64);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFloatControlsProperties.shaderDenormPreserveFloat16);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFloatControlsProperties.shaderDenormPreserveFloat32);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFloatControlsProperties.shaderDenormPreserveFloat64);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFloatControlsProperties.shaderDenormFlushToZeroFloat16);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFloatControlsProperties.shaderDenormFlushToZeroFloat32);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFloatControlsProperties.shaderDenormFlushToZeroFloat64);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFloatControlsProperties.shaderRoundingModeRTEFloat16);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFloatControlsProperties.shaderRoundingModeRTEFloat32);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFloatControlsProperties.shaderRoundingModeRTEFloat64);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFloatControlsProperties.shaderRoundingModeRTZFloat16);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFloatControlsProperties.shaderRoundingModeRTZFloat32);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFloatControlsProperties.shaderRoundingModeRTZFloat64);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMap2FeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMap2FeaturesEXT const &physicalDeviceFragmentDensityMap2FeaturesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMap2FeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMap2FeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMap2FeaturesEXT.fragmentDensityMapDeferred);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMap2PropertiesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMap2PropertiesEXT const &physicalDeviceFragmentDensityMap2PropertiesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMap2PropertiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMap2PropertiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMap2PropertiesEXT.subsampledLoads);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMap2PropertiesEXT.subsampledCoarseReconstructionEarlyAccess);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMap2PropertiesEXT.maxSubsampledArrayLayers);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMap2PropertiesEXT.maxDescriptorSetSubsampledSamplers);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapFeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapFeaturesEXT const &physicalDeviceFragmentDensityMapFeaturesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMapFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMapFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMapFeaturesEXT.fragmentDensityMap);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMapFeaturesEXT.fragmentDensityMapDynamic);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMapFeaturesEXT.fragmentDensityMapNonSubsampledImages);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM const &physicalDeviceFragmentDensityMapOffsetFeaturesQCOM) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMapOffsetFeaturesQCOM.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMapOffsetFeaturesQCOM.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMapOffsetFeaturesQCOM.fragmentDensityMapOffset);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM const &
	                           physicalDeviceFragmentDensityMapOffsetPropertiesQCOM) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMapOffsetPropertiesQCOM.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMapOffsetPropertiesQCOM.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMapOffsetPropertiesQCOM.fragmentDensityOffsetGranularity);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapPropertiesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentDensityMapPropertiesEXT const &physicalDeviceFragmentDensityMapPropertiesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMapPropertiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMapPropertiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMapPropertiesEXT.minFragmentDensityTexelSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMapPropertiesEXT.maxFragmentDensityTexelSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentDensityMapPropertiesEXT.fragmentDensityInvocations);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShaderBarycentricFeaturesNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShaderBarycentricFeaturesNV const &physicalDeviceFragmentShaderBarycentricFeaturesNV)
	    const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShaderBarycentricFeaturesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShaderBarycentricFeaturesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShaderBarycentricFeaturesNV.fragmentShaderBarycentric);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShaderInterlockFeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShaderInterlockFeaturesEXT const &physicalDeviceFragmentShaderInterlockFeaturesEXT)
	    const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShaderInterlockFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShaderInterlockFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShaderInterlockFeaturesEXT.fragmentShaderSampleInterlock);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShaderInterlockFeaturesEXT.fragmentShaderPixelInterlock);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShaderInterlockFeaturesEXT.fragmentShaderShadingRateInterlock);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateEnumsFeaturesNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateEnumsFeaturesNV const &physicalDeviceFragmentShadingRateEnumsFeaturesNV)
	    const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRateEnumsFeaturesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRateEnumsFeaturesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRateEnumsFeaturesNV.fragmentShadingRateEnums);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRateEnumsFeaturesNV.supersampleFragmentShadingRates);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRateEnumsFeaturesNV.noInvocationFragmentShadingRates);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateEnumsPropertiesNV>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateEnumsPropertiesNV const &physicalDeviceFragmentShadingRateEnumsPropertiesNV) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRateEnumsPropertiesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRateEnumsPropertiesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRateEnumsPropertiesNV.maxFragmentShadingRateInvocationCount);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateFeaturesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateFeaturesKHR const &physicalDeviceFragmentShadingRateFeaturesKHR) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRateFeaturesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRateFeaturesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRateFeaturesKHR.pipelineFragmentShadingRate);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRateFeaturesKHR.primitiveFragmentShadingRate);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRateFeaturesKHR.attachmentFragmentShadingRate);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR const &physicalDeviceFragmentShadingRateKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRateKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRateKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRateKHR.sampleCounts);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRateKHR.fragmentSize);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRatePropertiesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRatePropertiesKHR const &physicalDeviceFragmentShadingRatePropertiesKHR) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRatePropertiesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRatePropertiesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRatePropertiesKHR.minFragmentShadingRateAttachmentTexelSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRatePropertiesKHR.maxFragmentShadingRateAttachmentTexelSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRatePropertiesKHR.maxFragmentShadingRateAttachmentTexelSizeAspectRatio);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRatePropertiesKHR.primitiveFragmentShadingRateWithMultipleViewports);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRatePropertiesKHR.layeredShadingRateAttachments);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRatePropertiesKHR.fragmentShadingRateNonTrivialCombinerOps);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRatePropertiesKHR.maxFragmentSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRatePropertiesKHR.maxFragmentSizeAspectRatio);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRatePropertiesKHR.maxFragmentShadingRateCoverageSamples);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRatePropertiesKHR.maxFragmentShadingRateRasterizationSamples);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRatePropertiesKHR.fragmentShadingRateWithShaderDepthStencilWrites);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRatePropertiesKHR.fragmentShadingRateWithSampleMask);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRatePropertiesKHR.fragmentShadingRateWithShaderSampleMask);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRatePropertiesKHR.fragmentShadingRateWithConservativeRasterization);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRatePropertiesKHR.fragmentShadingRateWithFragmentShaderInterlock);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRatePropertiesKHR.fragmentShadingRateWithCustomSampleLocations);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceFragmentShadingRatePropertiesKHR.fragmentShadingRateStrictMultiplyCombiner);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceGlobalPriorityQueryFeaturesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceGlobalPriorityQueryFeaturesKHR const &physicalDeviceGlobalPriorityQueryFeaturesKHR) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceGlobalPriorityQueryFeaturesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceGlobalPriorityQueryFeaturesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceGlobalPriorityQueryFeaturesKHR.globalPriorityQuery);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT const &physicalDeviceGraphicsPipelineLibraryFeaturesEXT)
	    const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceGraphicsPipelineLibraryFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceGraphicsPipelineLibraryFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceGraphicsPipelineLibraryFeaturesEXT.graphicsPipelineLibrary);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceGraphicsPipelineLibraryPropertiesEXT const &physicalDeviceGraphicsPipelineLibraryPropertiesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceGraphicsPipelineLibraryPropertiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceGraphicsPipelineLibraryPropertiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceGraphicsPipelineLibraryPropertiesEXT.graphicsPipelineLibraryFastLinking);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceGraphicsPipelineLibraryPropertiesEXT.graphicsPipelineLibraryIndependentInterpolationDecoration);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties const &physicalDeviceGroupProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceGroupProperties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceGroupProperties.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceGroupProperties.physicalDeviceCount);
		for(size_t i = 0; i < VK_MAX_DEVICE_GROUP_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceGroupProperties.physicalDevices[i]);
		}
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceGroupProperties.subsetAllocation);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceHostQueryResetFeatures>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceHostQueryResetFeatures const &physicalDeviceHostQueryResetFeatures) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceHostQueryResetFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceHostQueryResetFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceHostQueryResetFeatures.hostQueryReset);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceIDProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceIDProperties const &physicalDeviceIDProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceIDProperties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceIDProperties.pNext);
		for(size_t i = 0; i < VK_UUID_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceIDProperties.deviceUUID[i]);
		}
		for(size_t i = 0; i < VK_UUID_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceIDProperties.driverUUID[i]);
		}
		for(size_t i = 0; i < VK_LUID_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceIDProperties.deviceLUID[i]);
		}
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceIDProperties.deviceNodeMask);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceIDProperties.deviceLUIDValid);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceImage2DViewOf3DFeaturesEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceImage2DViewOf3DFeaturesEXT const &physicalDeviceImage2DViewOf3DFeaturesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImage2DViewOf3DFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImage2DViewOf3DFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImage2DViewOf3DFeaturesEXT.image2DViewOf3D);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImage2DViewOf3DFeaturesEXT.sampler2DViewOf3D);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageDrmFormatModifierInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceImageDrmFormatModifierInfoEXT const &physicalDeviceImageDrmFormatModifierInfoEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImageDrmFormatModifierInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImageDrmFormatModifierInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImageDrmFormatModifierInfoEXT.drmFormatModifier);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImageDrmFormatModifierInfoEXT.sharingMode);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImageDrmFormatModifierInfoEXT.queueFamilyIndexCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImageDrmFormatModifierInfoEXT.pQueueFamilyIndices);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceImageFormatInfo2 const &physicalDeviceImageFormatInfo2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImageFormatInfo2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImageFormatInfo2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImageFormatInfo2.format);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImageFormatInfo2.type);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImageFormatInfo2.tiling);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImageFormatInfo2.usage);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImageFormatInfo2.flags);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageRobustnessFeatures>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceImageRobustnessFeatures const &physicalDeviceImageRobustnessFeatures) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImageRobustnessFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImageRobustnessFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImageRobustnessFeatures.robustImageAccess);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageViewImageFormatInfoEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceImageViewImageFormatInfoEXT const &physicalDeviceImageViewImageFormatInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImageViewImageFormatInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImageViewImageFormatInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImageViewImageFormatInfoEXT.imageViewType);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceImageViewMinLodFeaturesEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceImageViewMinLodFeaturesEXT const &physicalDeviceImageViewMinLodFeaturesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImageViewMinLodFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImageViewMinLodFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImageViewMinLodFeaturesEXT.minLod);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceImagelessFramebufferFeatures>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceImagelessFramebufferFeatures const &physicalDeviceImagelessFramebufferFeatures) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImagelessFramebufferFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImagelessFramebufferFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceImagelessFramebufferFeatures.imagelessFramebuffer);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceIndexTypeUint8FeaturesEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceIndexTypeUint8FeaturesEXT const &physicalDeviceIndexTypeUint8FeaturesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceIndexTypeUint8FeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceIndexTypeUint8FeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceIndexTypeUint8FeaturesEXT.indexTypeUint8);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceInheritedViewportScissorFeaturesNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceInheritedViewportScissorFeaturesNV const &physicalDeviceInheritedViewportScissorFeaturesNV)
	    const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceInheritedViewportScissorFeaturesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceInheritedViewportScissorFeaturesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceInheritedViewportScissorFeaturesNV.inheritedViewportScissor2D);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceInlineUniformBlockFeatures>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceInlineUniformBlockFeatures const &physicalDeviceInlineUniformBlockFeatures) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceInlineUniformBlockFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceInlineUniformBlockFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceInlineUniformBlockFeatures.inlineUniformBlock);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceInlineUniformBlockFeatures.descriptorBindingInlineUniformBlockUpdateAfterBind);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceInlineUniformBlockProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceInlineUniformBlockProperties const &physicalDeviceInlineUniformBlockProperties) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceInlineUniformBlockProperties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceInlineUniformBlockProperties.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceInlineUniformBlockProperties.maxInlineUniformBlockSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceInlineUniformBlockProperties.maxPerStageDescriptorInlineUniformBlocks);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceInlineUniformBlockProperties.maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceInlineUniformBlockProperties.maxDescriptorSetInlineUniformBlocks);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceInlineUniformBlockProperties.maxDescriptorSetUpdateAfterBindInlineUniformBlocks);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceInvocationMaskFeaturesHUAWEI>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceInvocationMaskFeaturesHUAWEI const &physicalDeviceInvocationMaskFeaturesHUAWEI) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceInvocationMaskFeaturesHUAWEI.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceInvocationMaskFeaturesHUAWEI.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceInvocationMaskFeaturesHUAWEI.invocationMask);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceLimits>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceLimits const &physicalDeviceLimits) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxImageDimension1D);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxImageDimension2D);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxImageDimension3D);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxImageDimensionCube);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxImageArrayLayers);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxTexelBufferElements);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxUniformBufferRange);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxStorageBufferRange);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxPushConstantsSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxMemoryAllocationCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxSamplerAllocationCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.bufferImageGranularity);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.sparseAddressSpaceSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxBoundDescriptorSets);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxPerStageDescriptorSamplers);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxPerStageDescriptorUniformBuffers);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxPerStageDescriptorStorageBuffers);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxPerStageDescriptorSampledImages);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxPerStageDescriptorStorageImages);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxPerStageDescriptorInputAttachments);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxPerStageResources);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxDescriptorSetSamplers);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxDescriptorSetUniformBuffers);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxDescriptorSetUniformBuffersDynamic);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxDescriptorSetStorageBuffers);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxDescriptorSetStorageBuffersDynamic);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxDescriptorSetSampledImages);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxDescriptorSetStorageImages);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxDescriptorSetInputAttachments);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxVertexInputAttributes);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxVertexInputBindings);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxVertexInputAttributeOffset);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxVertexInputBindingStride);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxVertexOutputComponents);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxTessellationGenerationLevel);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxTessellationPatchSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxTessellationControlPerVertexInputComponents);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxTessellationControlPerVertexOutputComponents);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxTessellationControlPerPatchOutputComponents);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxTessellationControlTotalOutputComponents);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxTessellationEvaluationInputComponents);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxTessellationEvaluationOutputComponents);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxGeometryShaderInvocations);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxGeometryInputComponents);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxGeometryOutputComponents);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxGeometryOutputVertices);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxGeometryTotalOutputComponents);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxFragmentInputComponents);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxFragmentOutputAttachments);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxFragmentDualSrcAttachments);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxFragmentCombinedOutputResources);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxComputeSharedMemorySize);
		for(size_t i = 0; i < 3; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxComputeWorkGroupCount[i]);
		}
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxComputeWorkGroupInvocations);
		for(size_t i = 0; i < 3; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxComputeWorkGroupSize[i]);
		}
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.subPixelPrecisionBits);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.subTexelPrecisionBits);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.mipmapPrecisionBits);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxDrawIndexedIndexValue);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxDrawIndirectCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxSamplerLodBias);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxSamplerAnisotropy);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxViewports);
		for(size_t i = 0; i < 2; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxViewportDimensions[i]);
		}
		for(size_t i = 0; i < 2; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.viewportBoundsRange[i]);
		}
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.viewportSubPixelBits);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.minMemoryMapAlignment);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.minTexelBufferOffsetAlignment);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.minUniformBufferOffsetAlignment);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.minStorageBufferOffsetAlignment);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.minTexelOffset);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxTexelOffset);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.minTexelGatherOffset);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxTexelGatherOffset);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.minInterpolationOffset);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxInterpolationOffset);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.subPixelInterpolationOffsetBits);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxFramebufferWidth);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxFramebufferHeight);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxFramebufferLayers);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.framebufferColorSampleCounts);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.framebufferDepthSampleCounts);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.framebufferStencilSampleCounts);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.framebufferNoAttachmentsSampleCounts);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxColorAttachments);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.sampledImageColorSampleCounts);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.sampledImageIntegerSampleCounts);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.sampledImageDepthSampleCounts);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.sampledImageStencilSampleCounts);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.storageImageSampleCounts);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxSampleMaskWords);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.timestampComputeAndGraphics);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.timestampPeriod);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxClipDistances);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxCullDistances);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.maxCombinedClipAndCullDistances);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.discreteQueuePriorities);
		for(size_t i = 0; i < 2; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.pointSizeRange[i]);
		}
		for(size_t i = 0; i < 2; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.lineWidthRange[i]);
		}
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.pointSizeGranularity);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.lineWidthGranularity);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.strictLines);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.standardSampleLocations);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.optimalBufferCopyOffsetAlignment);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.optimalBufferCopyRowPitchAlignment);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLimits.nonCoherentAtomSize);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceLineRasterizationFeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceLineRasterizationFeaturesEXT const &physicalDeviceLineRasterizationFeaturesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLineRasterizationFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLineRasterizationFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLineRasterizationFeaturesEXT.rectangularLines);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLineRasterizationFeaturesEXT.bresenhamLines);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLineRasterizationFeaturesEXT.smoothLines);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLineRasterizationFeaturesEXT.stippledRectangularLines);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLineRasterizationFeaturesEXT.stippledBresenhamLines);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLineRasterizationFeaturesEXT.stippledSmoothLines);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceLineRasterizationPropertiesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceLineRasterizationPropertiesEXT const &physicalDeviceLineRasterizationPropertiesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLineRasterizationPropertiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLineRasterizationPropertiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLineRasterizationPropertiesEXT.lineSubPixelPrecisionBits);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceLinearColorAttachmentFeaturesNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceLinearColorAttachmentFeaturesNV const &physicalDeviceLinearColorAttachmentFeaturesNV) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLinearColorAttachmentFeaturesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLinearColorAttachmentFeaturesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceLinearColorAttachmentFeaturesNV.linearColorAttachment);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance3Properties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance3Properties const &physicalDeviceMaintenance3Properties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMaintenance3Properties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMaintenance3Properties.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMaintenance3Properties.maxPerSetDescriptors);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMaintenance3Properties.maxMemoryAllocationSize);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance4Features>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance4Features const &physicalDeviceMaintenance4Features) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMaintenance4Features.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMaintenance4Features.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMaintenance4Features.maintenance4);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance4Properties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceMaintenance4Properties const &physicalDeviceMaintenance4Properties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMaintenance4Properties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMaintenance4Properties.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMaintenance4Properties.maxBufferSize);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryBudgetPropertiesEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryBudgetPropertiesEXT const &physicalDeviceMemoryBudgetPropertiesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMemoryBudgetPropertiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMemoryBudgetPropertiesEXT.pNext);
		for(size_t i = 0; i < VK_MAX_MEMORY_HEAPS; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMemoryBudgetPropertiesEXT.heapBudget[i]);
		}
		for(size_t i = 0; i < VK_MAX_MEMORY_HEAPS; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMemoryBudgetPropertiesEXT.heapUsage[i]);
		}
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryPriorityFeaturesEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryPriorityFeaturesEXT const &physicalDeviceMemoryPriorityFeaturesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMemoryPriorityFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMemoryPriorityFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMemoryPriorityFeaturesEXT.memoryPriority);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties const &physicalDeviceMemoryProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMemoryProperties.memoryTypeCount);
		for(size_t i = 0; i < VK_MAX_MEMORY_TYPES; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMemoryProperties.memoryTypes[i]);
		}
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMemoryProperties.memoryHeapCount);
		for(size_t i = 0; i < VK_MAX_MEMORY_HEAPS; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMemoryProperties.memoryHeaps[i]);
		}
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 const &physicalDeviceMemoryProperties2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMemoryProperties2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMemoryProperties2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMemoryProperties2.memoryProperties);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderFeaturesNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderFeaturesNV const &physicalDeviceMeshShaderFeaturesNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMeshShaderFeaturesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMeshShaderFeaturesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMeshShaderFeaturesNV.taskShader);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMeshShaderFeaturesNV.meshShader);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderPropertiesNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceMeshShaderPropertiesNV const &physicalDeviceMeshShaderPropertiesNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMeshShaderPropertiesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMeshShaderPropertiesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMeshShaderPropertiesNV.maxDrawMeshTasksCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMeshShaderPropertiesNV.maxTaskWorkGroupInvocations);
		for(size_t i = 0; i < 3; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMeshShaderPropertiesNV.maxTaskWorkGroupSize[i]);
		}
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMeshShaderPropertiesNV.maxTaskTotalMemorySize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMeshShaderPropertiesNV.maxTaskOutputCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMeshShaderPropertiesNV.maxMeshWorkGroupInvocations);
		for(size_t i = 0; i < 3; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMeshShaderPropertiesNV.maxMeshWorkGroupSize[i]);
		}
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMeshShaderPropertiesNV.maxMeshTotalMemorySize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMeshShaderPropertiesNV.maxMeshOutputVertices);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMeshShaderPropertiesNV.maxMeshOutputPrimitives);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMeshShaderPropertiesNV.maxMeshMultiviewViewCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMeshShaderPropertiesNV.meshOutputPerVertexGranularity);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMeshShaderPropertiesNV.meshOutputPerPrimitiveGranularity);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiDrawFeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiDrawFeaturesEXT const &physicalDeviceMultiDrawFeaturesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMultiDrawFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMultiDrawFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMultiDrawFeaturesEXT.multiDraw);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiDrawPropertiesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiDrawPropertiesEXT const &physicalDeviceMultiDrawPropertiesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMultiDrawPropertiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMultiDrawPropertiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMultiDrawPropertiesEXT.maxMultiDrawCount);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewFeatures>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewFeatures const &physicalDeviceMultiviewFeatures) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMultiviewFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMultiviewFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMultiviewFeatures.multiview);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMultiviewFeatures.multiviewGeometryShader);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMultiviewFeatures.multiviewTessellationShader);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX const &
	                           physicalDeviceMultiviewPerViewAttributesPropertiesNVX) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMultiviewPerViewAttributesPropertiesNVX.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMultiviewPerViewAttributesPropertiesNVX.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMultiviewPerViewAttributesPropertiesNVX.perViewPositionAllComponents);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceMultiviewProperties const &physicalDeviceMultiviewProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMultiviewProperties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMultiviewProperties.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMultiviewProperties.maxMultiviewViewCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMultiviewProperties.maxMultiviewInstanceIndex);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceMutableDescriptorTypeFeaturesVALVE>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceMutableDescriptorTypeFeaturesVALVE const &physicalDeviceMutableDescriptorTypeFeaturesVALVE)
	    const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMutableDescriptorTypeFeaturesVALVE.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMutableDescriptorTypeFeaturesVALVE.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceMutableDescriptorTypeFeaturesVALVE.mutableDescriptorType);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePCIBusInfoPropertiesEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDevicePCIBusInfoPropertiesEXT const &physicalDevicePCIBusInfoPropertiesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePCIBusInfoPropertiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePCIBusInfoPropertiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePCIBusInfoPropertiesEXT.pciDomain);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePCIBusInfoPropertiesEXT.pciBus);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePCIBusInfoPropertiesEXT.pciDevice);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePCIBusInfoPropertiesEXT.pciFunction);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT const &physicalDevicePageableDeviceLocalMemoryFeaturesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePageableDeviceLocalMemoryFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePageableDeviceLocalMemoryFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePageableDeviceLocalMemoryFeaturesEXT.pageableDeviceLocalMemory);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePerformanceQueryFeaturesKHR>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDevicePerformanceQueryFeaturesKHR const &physicalDevicePerformanceQueryFeaturesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePerformanceQueryFeaturesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePerformanceQueryFeaturesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePerformanceQueryFeaturesKHR.performanceCounterQueryPools);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePerformanceQueryFeaturesKHR.performanceCounterMultipleQueryPools);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePerformanceQueryPropertiesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDevicePerformanceQueryPropertiesKHR const &physicalDevicePerformanceQueryPropertiesKHR) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePerformanceQueryPropertiesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePerformanceQueryPropertiesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePerformanceQueryPropertiesKHR.allowCommandBufferQueryCopies);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineCreationCacheControlFeatures>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineCreationCacheControlFeatures const &physicalDevicePipelineCreationCacheControlFeatures) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePipelineCreationCacheControlFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePipelineCreationCacheControlFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePipelineCreationCacheControlFeatures.pipelineCreationCacheControl);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineExecutablePropertiesFeaturesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDevicePipelineExecutablePropertiesFeaturesKHR const &
	                           physicalDevicePipelineExecutablePropertiesFeaturesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePipelineExecutablePropertiesFeaturesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePipelineExecutablePropertiesFeaturesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePipelineExecutablePropertiesFeaturesKHR.pipelineExecutableInfo);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePointClippingProperties>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDevicePointClippingProperties const &physicalDevicePointClippingProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePointClippingProperties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePointClippingProperties.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePointClippingProperties.pointClippingBehavior);
		return seed;
	}
};

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePortabilitySubsetFeaturesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDevicePortabilitySubsetFeaturesKHR const &physicalDevicePortabilitySubsetFeaturesKHR) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePortabilitySubsetFeaturesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePortabilitySubsetFeaturesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePortabilitySubsetFeaturesKHR.constantAlphaColorBlendFactors);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePortabilitySubsetFeaturesKHR.events);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePortabilitySubsetFeaturesKHR.imageViewFormatReinterpretation);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePortabilitySubsetFeaturesKHR.imageViewFormatSwizzle);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePortabilitySubsetFeaturesKHR.imageView2DOn3DImage);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePortabilitySubsetFeaturesKHR.multisampleArrayImage);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePortabilitySubsetFeaturesKHR.mutableComparisonSamplers);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePortabilitySubsetFeaturesKHR.pointPolygons);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePortabilitySubsetFeaturesKHR.samplerMipLodBias);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePortabilitySubsetFeaturesKHR.separateStencilMaskRef);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePortabilitySubsetFeaturesKHR.shaderSampleRateInterpolationFunctions);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePortabilitySubsetFeaturesKHR.tessellationIsolines);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePortabilitySubsetFeaturesKHR.tessellationPointMode);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePortabilitySubsetFeaturesKHR.triangleFans);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePortabilitySubsetFeaturesKHR.vertexAttributeAccessBeyondStride);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePortabilitySubsetPropertiesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDevicePortabilitySubsetPropertiesKHR const &physicalDevicePortabilitySubsetPropertiesKHR) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePortabilitySubsetPropertiesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePortabilitySubsetPropertiesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePortabilitySubsetPropertiesKHR.minVertexInputBindingStrideAlignment);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePresentIdFeaturesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDevicePresentIdFeaturesKHR const &physicalDevicePresentIdFeaturesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePresentIdFeaturesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePresentIdFeaturesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePresentIdFeaturesKHR.presentId);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePresentWaitFeaturesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDevicePresentWaitFeaturesKHR const &physicalDevicePresentWaitFeaturesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePresentWaitFeaturesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePresentWaitFeaturesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePresentWaitFeaturesKHR.presentWait);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT const &
	                           physicalDevicePrimitiveTopologyListRestartFeaturesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePrimitiveTopologyListRestartFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePrimitiveTopologyListRestartFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePrimitiveTopologyListRestartFeaturesEXT.primitiveTopologyListRestart);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePrimitiveTopologyListRestartFeaturesEXT.primitiveTopologyPatchListRestart);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT const &physicalDevicePrimitivesGeneratedQueryFeaturesEXT)
	    const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePrimitivesGeneratedQueryFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePrimitivesGeneratedQueryFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePrimitivesGeneratedQueryFeaturesEXT.primitivesGeneratedQuery);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePrimitivesGeneratedQueryFeaturesEXT.primitivesGeneratedQueryWithRasterizerDiscard);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePrimitivesGeneratedQueryFeaturesEXT.primitivesGeneratedQueryWithNonZeroStreams);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePrivateDataFeatures>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDevicePrivateDataFeatures const &physicalDevicePrivateDataFeatures) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePrivateDataFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePrivateDataFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePrivateDataFeatures.privateData);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseProperties const &physicalDeviceSparseProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSparseProperties.residencyStandard2DBlockShape);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSparseProperties.residencyStandard2DMultisampleBlockShape);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSparseProperties.residencyStandard3DBlockShape);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSparseProperties.residencyAlignedMipSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSparseProperties.residencyNonResidentStrict);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties const &physicalDeviceProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProperties.apiVersion);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProperties.driverVersion);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProperties.vendorID);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProperties.deviceID);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProperties.deviceType);
		for(size_t i = 0; i < VK_MAX_PHYSICAL_DEVICE_NAME_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProperties.deviceName[i]);
		}
		for(size_t i = 0; i < VK_UUID_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProperties.pipelineCacheUUID[i]);
		}
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProperties.limits);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProperties.sparseProperties);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 const &physicalDeviceProperties2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProperties2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProperties2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProperties2.properties);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceProtectedMemoryFeatures>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceProtectedMemoryFeatures const &physicalDeviceProtectedMemoryFeatures) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProtectedMemoryFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProtectedMemoryFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProtectedMemoryFeatures.protectedMemory);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceProtectedMemoryProperties>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceProtectedMemoryProperties const &physicalDeviceProtectedMemoryProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProtectedMemoryProperties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProtectedMemoryProperties.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProtectedMemoryProperties.protectedNoFault);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceProvokingVertexFeaturesEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceProvokingVertexFeaturesEXT const &physicalDeviceProvokingVertexFeaturesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProvokingVertexFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProvokingVertexFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProvokingVertexFeaturesEXT.provokingVertexLast);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProvokingVertexFeaturesEXT.transformFeedbackPreservesProvokingVertex);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceProvokingVertexPropertiesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceProvokingVertexPropertiesEXT const &physicalDeviceProvokingVertexPropertiesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProvokingVertexPropertiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProvokingVertexPropertiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProvokingVertexPropertiesEXT.provokingVertexModePerPipeline);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceProvokingVertexPropertiesEXT.transformFeedbackPreservesTriangleFanProvokingVertex);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevicePushDescriptorPropertiesKHR>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDevicePushDescriptorPropertiesKHR const &physicalDevicePushDescriptorPropertiesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePushDescriptorPropertiesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePushDescriptorPropertiesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDevicePushDescriptorPropertiesKHR.maxPushDescriptors);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRGBA10X6FormatsFeaturesEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceRGBA10X6FormatsFeaturesEXT const &physicalDeviceRGBA10X6FormatsFeaturesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRGBA10X6FormatsFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRGBA10X6FormatsFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRGBA10X6FormatsFeaturesEXT.formatRgba10x6WithoutYCbCrSampler);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM const &
	                           physicalDeviceRasterizationOrderAttachmentAccessFeaturesARM) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRasterizationOrderAttachmentAccessFeaturesARM.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRasterizationOrderAttachmentAccessFeaturesARM.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRasterizationOrderAttachmentAccessFeaturesARM.rasterizationOrderColorAttachmentAccess);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRasterizationOrderAttachmentAccessFeaturesARM.rasterizationOrderDepthAttachmentAccess);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRasterizationOrderAttachmentAccessFeaturesARM.rasterizationOrderStencilAttachmentAccess);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayQueryFeaturesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceRayQueryFeaturesKHR const &physicalDeviceRayQueryFeaturesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayQueryFeaturesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayQueryFeaturesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayQueryFeaturesKHR.rayQuery);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingMotionBlurFeaturesNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingMotionBlurFeaturesNV const &physicalDeviceRayTracingMotionBlurFeaturesNV) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingMotionBlurFeaturesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingMotionBlurFeaturesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingMotionBlurFeaturesNV.rayTracingMotionBlur);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingMotionBlurFeaturesNV.rayTracingMotionBlurPipelineTraceRaysIndirect);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPipelineFeaturesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPipelineFeaturesKHR const &physicalDeviceRayTracingPipelineFeaturesKHR) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPipelineFeaturesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPipelineFeaturesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPipelineFeaturesKHR.rayTracingPipeline);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPipelineFeaturesKHR.rayTracingPipelineShaderGroupHandleCaptureReplay);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPipelineFeaturesKHR.rayTracingPipelineShaderGroupHandleCaptureReplayMixed);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPipelineFeaturesKHR.rayTracingPipelineTraceRaysIndirect);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPipelineFeaturesKHR.rayTraversalPrimitiveCulling);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPipelinePropertiesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPipelinePropertiesKHR const &physicalDeviceRayTracingPipelinePropertiesKHR) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPipelinePropertiesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPipelinePropertiesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPipelinePropertiesKHR.shaderGroupHandleSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPipelinePropertiesKHR.maxRayRecursionDepth);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPipelinePropertiesKHR.maxShaderGroupStride);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPipelinePropertiesKHR.shaderGroupBaseAlignment);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPipelinePropertiesKHR.shaderGroupHandleCaptureReplaySize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPipelinePropertiesKHR.maxRayDispatchInvocationCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPipelinePropertiesKHR.shaderGroupHandleAlignment);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPipelinePropertiesKHR.maxRayHitAttributeSize);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPropertiesNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceRayTracingPropertiesNV const &physicalDeviceRayTracingPropertiesNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPropertiesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPropertiesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPropertiesNV.shaderGroupHandleSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPropertiesNV.maxRecursionDepth);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPropertiesNV.maxShaderGroupStride);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPropertiesNV.shaderGroupBaseAlignment);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPropertiesNV.maxGeometryCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPropertiesNV.maxInstanceCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPropertiesNV.maxTriangleCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRayTracingPropertiesNV.maxDescriptorSetAccelerationStructures);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRepresentativeFragmentTestFeaturesNV>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceRepresentativeFragmentTestFeaturesNV const &physicalDeviceRepresentativeFragmentTestFeaturesNV) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRepresentativeFragmentTestFeaturesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRepresentativeFragmentTestFeaturesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRepresentativeFragmentTestFeaturesNV.representativeFragmentTest);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRobustness2FeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceRobustness2FeaturesEXT const &physicalDeviceRobustness2FeaturesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRobustness2FeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRobustness2FeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRobustness2FeaturesEXT.robustBufferAccess2);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRobustness2FeaturesEXT.robustImageAccess2);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRobustness2FeaturesEXT.nullDescriptor);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceRobustness2PropertiesEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceRobustness2PropertiesEXT const &physicalDeviceRobustness2PropertiesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRobustness2PropertiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRobustness2PropertiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRobustness2PropertiesEXT.robustStorageBufferAccessSizeAlignment);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceRobustness2PropertiesEXT.robustUniformBufferAccessSizeAlignment);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSampleLocationsPropertiesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceSampleLocationsPropertiesEXT const &physicalDeviceSampleLocationsPropertiesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSampleLocationsPropertiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSampleLocationsPropertiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSampleLocationsPropertiesEXT.sampleLocationSampleCounts);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSampleLocationsPropertiesEXT.maxSampleLocationGridSize);
		for(size_t i = 0; i < 2; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSampleLocationsPropertiesEXT.sampleLocationCoordinateRange[i]);
		}
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSampleLocationsPropertiesEXT.sampleLocationSubPixelBits);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSampleLocationsPropertiesEXT.variableSampleLocations);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSamplerFilterMinmaxProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceSamplerFilterMinmaxProperties const &physicalDeviceSamplerFilterMinmaxProperties) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSamplerFilterMinmaxProperties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSamplerFilterMinmaxProperties.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSamplerFilterMinmaxProperties.filterMinmaxSingleComponentFormats);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSamplerFilterMinmaxProperties.filterMinmaxImageComponentMapping);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSamplerYcbcrConversionFeatures>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceSamplerYcbcrConversionFeatures const &physicalDeviceSamplerYcbcrConversionFeatures) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSamplerYcbcrConversionFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSamplerYcbcrConversionFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSamplerYcbcrConversionFeatures.samplerYcbcrConversion);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceScalarBlockLayoutFeatures>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceScalarBlockLayoutFeatures const &physicalDeviceScalarBlockLayoutFeatures) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceScalarBlockLayoutFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceScalarBlockLayoutFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceScalarBlockLayoutFeatures.scalarBlockLayout);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSeparateDepthStencilLayoutsFeatures>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceSeparateDepthStencilLayoutsFeatures const &physicalDeviceSeparateDepthStencilLayoutsFeatures)
	    const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSeparateDepthStencilLayoutsFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSeparateDepthStencilLayoutsFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSeparateDepthStencilLayoutsFeatures.separateDepthStencilLayouts);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicFloat2FeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicFloat2FeaturesEXT const &physicalDeviceShaderAtomicFloat2FeaturesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.shaderBufferFloat16Atomics);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.shaderBufferFloat16AtomicAdd);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.shaderBufferFloat16AtomicMinMax);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.shaderBufferFloat32AtomicMinMax);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.shaderBufferFloat64AtomicMinMax);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.shaderSharedFloat16Atomics);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.shaderSharedFloat16AtomicAdd);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.shaderSharedFloat16AtomicMinMax);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.shaderSharedFloat32AtomicMinMax);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.shaderSharedFloat64AtomicMinMax);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.shaderImageFloat32AtomicMinMax);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloat2FeaturesEXT.sparseImageFloat32AtomicMinMax);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicFloatFeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicFloatFeaturesEXT const &physicalDeviceShaderAtomicFloatFeaturesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloatFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloatFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloatFeaturesEXT.shaderBufferFloat32Atomics);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloatFeaturesEXT.shaderBufferFloat32AtomicAdd);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloatFeaturesEXT.shaderBufferFloat64Atomics);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloatFeaturesEXT.shaderBufferFloat64AtomicAdd);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloatFeaturesEXT.shaderSharedFloat32Atomics);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloatFeaturesEXT.shaderSharedFloat32AtomicAdd);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloatFeaturesEXT.shaderSharedFloat64Atomics);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloatFeaturesEXT.shaderSharedFloat64AtomicAdd);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloatFeaturesEXT.shaderImageFloat32Atomics);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloatFeaturesEXT.shaderImageFloat32AtomicAdd);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloatFeaturesEXT.sparseImageFloat32Atomics);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicFloatFeaturesEXT.sparseImageFloat32AtomicAdd);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicInt64Features>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicInt64Features const &physicalDeviceShaderAtomicInt64Features) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicInt64Features.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicInt64Features.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicInt64Features.shaderBufferInt64Atomics);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderAtomicInt64Features.shaderSharedInt64Atomics);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderClockFeaturesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderClockFeaturesKHR const &physicalDeviceShaderClockFeaturesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderClockFeaturesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderClockFeaturesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderClockFeaturesKHR.shaderSubgroupClock);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderClockFeaturesKHR.shaderDeviceClock);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCoreProperties2AMD>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCoreProperties2AMD const &physicalDeviceShaderCoreProperties2AMD) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderCoreProperties2AMD.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderCoreProperties2AMD.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderCoreProperties2AMD.shaderCoreFeatures);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderCoreProperties2AMD.activeComputeUnitCount);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCorePropertiesAMD>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderCorePropertiesAMD const &physicalDeviceShaderCorePropertiesAMD) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderCorePropertiesAMD.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderCorePropertiesAMD.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderCorePropertiesAMD.shaderEngineCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderCorePropertiesAMD.shaderArraysPerEngineCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderCorePropertiesAMD.computeUnitsPerShaderArray);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderCorePropertiesAMD.simdPerComputeUnit);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderCorePropertiesAMD.wavefrontsPerSimd);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderCorePropertiesAMD.wavefrontSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderCorePropertiesAMD.sgprsPerSimd);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderCorePropertiesAMD.minSgprAllocation);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderCorePropertiesAMD.maxSgprAllocation);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderCorePropertiesAMD.sgprAllocationGranularity);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderCorePropertiesAMD.vgprsPerSimd);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderCorePropertiesAMD.minVgprAllocation);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderCorePropertiesAMD.maxVgprAllocation);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderCorePropertiesAMD.vgprAllocationGranularity);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderDemoteToHelperInvocationFeatures>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderDemoteToHelperInvocationFeatures const &
	                           physicalDeviceShaderDemoteToHelperInvocationFeatures) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderDemoteToHelperInvocationFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderDemoteToHelperInvocationFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderDemoteToHelperInvocationFeatures.shaderDemoteToHelperInvocation);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderDrawParametersFeatures>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderDrawParametersFeatures const &physicalDeviceShaderDrawParametersFeatures) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderDrawParametersFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderDrawParametersFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderDrawParametersFeatures.shaderDrawParameters);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderFloat16Int8Features>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderFloat16Int8Features const &physicalDeviceShaderFloat16Int8Features) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderFloat16Int8Features.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderFloat16Int8Features.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderFloat16Int8Features.shaderFloat16);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderFloat16Int8Features.shaderInt8);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderImageAtomicInt64FeaturesEXT>
{
	std::size_t operator()(
	    VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderImageAtomicInt64FeaturesEXT const &physicalDeviceShaderImageAtomicInt64FeaturesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderImageAtomicInt64FeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderImageAtomicInt64FeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderImageAtomicInt64FeaturesEXT.shaderImageInt64Atomics);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderImageAtomicInt64FeaturesEXT.sparseImageInt64Atomics);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderImageFootprintFeaturesNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderImageFootprintFeaturesNV const &physicalDeviceShaderImageFootprintFeaturesNV) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderImageFootprintFeaturesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderImageFootprintFeaturesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderImageFootprintFeaturesNV.imageFootprint);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerDotProductFeatures>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerDotProductFeatures const &physicalDeviceShaderIntegerDotProductFeatures) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductFeatures.shaderIntegerDotProduct);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerDotProductProperties>
{
	std::size_t operator()(
	    VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerDotProductProperties const &physicalDeviceShaderIntegerDotProductProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct8BitUnsignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct8BitSignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct8BitMixedSignednessAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct4x8BitPackedUnsignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct4x8BitPackedSignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct4x8BitPackedMixedSignednessAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct16BitUnsignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct16BitSignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct16BitMixedSignednessAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct32BitUnsignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct32BitSignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct32BitMixedSignednessAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct64BitUnsignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct64BitSignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProduct64BitMixedSignednessAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating8BitUnsignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating8BitSignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed,
		                        physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating16BitUnsignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating16BitSignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating32BitUnsignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating32BitSignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating64BitUnsignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating64BitSignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerDotProductProperties.integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL const &physicalDeviceShaderIntegerFunctions2FeaturesINTEL) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerFunctions2FeaturesINTEL.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerFunctions2FeaturesINTEL.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderIntegerFunctions2FeaturesINTEL.shaderIntegerFunctions2);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSMBuiltinsFeaturesNV>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSMBuiltinsFeaturesNV const &physicalDeviceShaderSMBuiltinsFeaturesNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderSMBuiltinsFeaturesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderSMBuiltinsFeaturesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderSMBuiltinsFeaturesNV.shaderSMBuiltins);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSMBuiltinsPropertiesNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSMBuiltinsPropertiesNV const &physicalDeviceShaderSMBuiltinsPropertiesNV) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderSMBuiltinsPropertiesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderSMBuiltinsPropertiesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderSMBuiltinsPropertiesNV.shaderSMCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderSMBuiltinsPropertiesNV.shaderWarpsPerSM);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSubgroupExtendedTypesFeatures>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSubgroupExtendedTypesFeatures const &physicalDeviceShaderSubgroupExtendedTypesFeatures)
	    const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderSubgroupExtendedTypesFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderSubgroupExtendedTypesFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderSubgroupExtendedTypesFeatures.shaderSubgroupExtendedTypes);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR const &
	                           physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR.shaderSubgroupUniformControlFlow);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderTerminateInvocationFeatures>
{
	std::size_t operator()(
	    VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderTerminateInvocationFeatures const &physicalDeviceShaderTerminateInvocationFeatures) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderTerminateInvocationFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderTerminateInvocationFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShaderTerminateInvocationFeatures.shaderTerminateInvocation);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShadingRateImageFeaturesNV>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceShadingRateImageFeaturesNV const &physicalDeviceShadingRateImageFeaturesNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShadingRateImageFeaturesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShadingRateImageFeaturesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShadingRateImageFeaturesNV.shadingRateImage);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShadingRateImageFeaturesNV.shadingRateCoarseSampleOrder);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceShadingRateImagePropertiesNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceShadingRateImagePropertiesNV const &physicalDeviceShadingRateImagePropertiesNV) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShadingRateImagePropertiesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShadingRateImagePropertiesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShadingRateImagePropertiesNV.shadingRateTexelSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShadingRateImagePropertiesNV.shadingRatePaletteSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceShadingRateImagePropertiesNV.shadingRateMaxCoarseSamples);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceSparseImageFormatInfo2 const &physicalDeviceSparseImageFormatInfo2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSparseImageFormatInfo2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSparseImageFormatInfo2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSparseImageFormatInfo2.format);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSparseImageFormatInfo2.type);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSparseImageFormatInfo2.samples);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSparseImageFormatInfo2.usage);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSparseImageFormatInfo2.tiling);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubgroupProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceSubgroupProperties const &physicalDeviceSubgroupProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSubgroupProperties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSubgroupProperties.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSubgroupProperties.subgroupSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSubgroupProperties.supportedStages);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSubgroupProperties.supportedOperations);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSubgroupProperties.quadOperationsInAllStages);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubgroupSizeControlFeatures>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceSubgroupSizeControlFeatures const &physicalDeviceSubgroupSizeControlFeatures) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSubgroupSizeControlFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSubgroupSizeControlFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSubgroupSizeControlFeatures.subgroupSizeControl);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSubgroupSizeControlFeatures.computeFullSubgroups);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubgroupSizeControlProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceSubgroupSizeControlProperties const &physicalDeviceSubgroupSizeControlProperties) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSubgroupSizeControlProperties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSubgroupSizeControlProperties.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSubgroupSizeControlProperties.minSubgroupSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSubgroupSizeControlProperties.maxSubgroupSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSubgroupSizeControlProperties.maxComputeWorkgroupSubgroups);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSubgroupSizeControlProperties.requiredSubgroupSizeStages);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubpassShadingFeaturesHUAWEI>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceSubpassShadingFeaturesHUAWEI const &physicalDeviceSubpassShadingFeaturesHUAWEI) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSubpassShadingFeaturesHUAWEI.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSubpassShadingFeaturesHUAWEI.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSubpassShadingFeaturesHUAWEI.subpassShading);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSubpassShadingPropertiesHUAWEI>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceSubpassShadingPropertiesHUAWEI const &physicalDeviceSubpassShadingPropertiesHUAWEI) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSubpassShadingPropertiesHUAWEI.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSubpassShadingPropertiesHUAWEI.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSubpassShadingPropertiesHUAWEI.maxSubpassShadingWorkgroupSizeAspectRatio);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceSurfaceInfo2KHR const &physicalDeviceSurfaceInfo2KHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSurfaceInfo2KHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSurfaceInfo2KHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSurfaceInfo2KHR.surface);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceSynchronization2Features>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceSynchronization2Features const &physicalDeviceSynchronization2Features) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSynchronization2Features.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSynchronization2Features.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceSynchronization2Features.synchronization2);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceTexelBufferAlignmentFeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceTexelBufferAlignmentFeaturesEXT const &physicalDeviceTexelBufferAlignmentFeaturesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTexelBufferAlignmentFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTexelBufferAlignmentFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTexelBufferAlignmentFeaturesEXT.texelBufferAlignment);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceTexelBufferAlignmentProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceTexelBufferAlignmentProperties const &physicalDeviceTexelBufferAlignmentProperties) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTexelBufferAlignmentProperties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTexelBufferAlignmentProperties.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTexelBufferAlignmentProperties.storageTexelBufferOffsetAlignmentBytes);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTexelBufferAlignmentProperties.storageTexelBufferOffsetSingleTexelAlignment);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTexelBufferAlignmentProperties.uniformTexelBufferOffsetAlignmentBytes);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTexelBufferAlignmentProperties.uniformTexelBufferOffsetSingleTexelAlignment);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceTextureCompressionASTCHDRFeatures>
{
	std::size_t operator()(
	    VULKAN_HPP_NAMESPACE::PhysicalDeviceTextureCompressionASTCHDRFeatures const &physicalDeviceTextureCompressionASTCHDRFeatures) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTextureCompressionASTCHDRFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTextureCompressionASTCHDRFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTextureCompressionASTCHDRFeatures.textureCompressionASTC_HDR);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceTimelineSemaphoreFeatures>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceTimelineSemaphoreFeatures const &physicalDeviceTimelineSemaphoreFeatures) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTimelineSemaphoreFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTimelineSemaphoreFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTimelineSemaphoreFeatures.timelineSemaphore);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceTimelineSemaphoreProperties>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceTimelineSemaphoreProperties const &physicalDeviceTimelineSemaphoreProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTimelineSemaphoreProperties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTimelineSemaphoreProperties.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTimelineSemaphoreProperties.maxTimelineSemaphoreValueDifference);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceToolProperties const &physicalDeviceToolProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceToolProperties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceToolProperties.pNext);
		for(size_t i = 0; i < VK_MAX_EXTENSION_NAME_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceToolProperties.name[i]);
		}
		for(size_t i = 0; i < VK_MAX_EXTENSION_NAME_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceToolProperties.version[i]);
		}
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceToolProperties.purposes);
		for(size_t i = 0; i < VK_MAX_DESCRIPTION_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceToolProperties.description[i]);
		}
		for(size_t i = 0; i < VK_MAX_EXTENSION_NAME_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceToolProperties.layer[i]);
		}
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceTransformFeedbackFeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceTransformFeedbackFeaturesEXT const &physicalDeviceTransformFeedbackFeaturesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTransformFeedbackFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTransformFeedbackFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTransformFeedbackFeaturesEXT.transformFeedback);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTransformFeedbackFeaturesEXT.geometryStreams);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceTransformFeedbackPropertiesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceTransformFeedbackPropertiesEXT const &physicalDeviceTransformFeedbackPropertiesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTransformFeedbackPropertiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTransformFeedbackPropertiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTransformFeedbackPropertiesEXT.maxTransformFeedbackStreams);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTransformFeedbackPropertiesEXT.maxTransformFeedbackBuffers);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTransformFeedbackPropertiesEXT.maxTransformFeedbackBufferSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTransformFeedbackPropertiesEXT.maxTransformFeedbackStreamDataSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTransformFeedbackPropertiesEXT.maxTransformFeedbackBufferDataSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTransformFeedbackPropertiesEXT.maxTransformFeedbackBufferDataStride);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTransformFeedbackPropertiesEXT.transformFeedbackQueries);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTransformFeedbackPropertiesEXT.transformFeedbackStreamsLinesTriangles);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTransformFeedbackPropertiesEXT.transformFeedbackRasterizationStreamSelect);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceTransformFeedbackPropertiesEXT.transformFeedbackDraw);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceUniformBufferStandardLayoutFeatures>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceUniformBufferStandardLayoutFeatures const &physicalDeviceUniformBufferStandardLayoutFeatures)
	    const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceUniformBufferStandardLayoutFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceUniformBufferStandardLayoutFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceUniformBufferStandardLayoutFeatures.uniformBufferStandardLayout);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVariablePointersFeatures>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceVariablePointersFeatures const &physicalDeviceVariablePointersFeatures) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVariablePointersFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVariablePointersFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVariablePointersFeatures.variablePointersStorageBuffer);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVariablePointersFeatures.variablePointers);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeDivisorFeaturesEXT>
{
	std::size_t operator()(
	    VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeDivisorFeaturesEXT const &physicalDeviceVertexAttributeDivisorFeaturesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVertexAttributeDivisorFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVertexAttributeDivisorFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVertexAttributeDivisorFeaturesEXT.vertexAttributeInstanceRateDivisor);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVertexAttributeDivisorFeaturesEXT.vertexAttributeInstanceRateZeroDivisor);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeDivisorPropertiesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexAttributeDivisorPropertiesEXT const &physicalDeviceVertexAttributeDivisorPropertiesEXT)
	    const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVertexAttributeDivisorPropertiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVertexAttributeDivisorPropertiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVertexAttributeDivisorPropertiesEXT.maxVertexAttribDivisor);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexInputDynamicStateFeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceVertexInputDynamicStateFeaturesEXT const &physicalDeviceVertexInputDynamicStateFeaturesEXT)
	    const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVertexInputDynamicStateFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVertexInputDynamicStateFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVertexInputDynamicStateFeaturesEXT.vertexInputDynamicState);
		return seed;
	}
};

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoProfileKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoProfileKHR const &videoProfileKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoProfileKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoProfileKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoProfileKHR.videoCodecOperation);
		VULKAN_HPP_HASH_COMBINE(seed, videoProfileKHR.chromaSubsampling);
		VULKAN_HPP_HASH_COMBINE(seed, videoProfileKHR.lumaBitDepth);
		VULKAN_HPP_HASH_COMBINE(seed, videoProfileKHR.chromaBitDepth);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoProfilesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoProfilesKHR const &videoProfilesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoProfilesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoProfilesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoProfilesKHR.profileCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoProfilesKHR.pProfiles);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoFormatInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceVideoFormatInfoKHR const &physicalDeviceVideoFormatInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVideoFormatInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVideoFormatInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVideoFormatInfoKHR.imageUsage);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVideoFormatInfoKHR.pVideoProfiles);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan11Features>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan11Features const &physicalDeviceVulkan11Features) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Features.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Features.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Features.storageBuffer16BitAccess);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Features.uniformAndStorageBuffer16BitAccess);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Features.storagePushConstant16);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Features.storageInputOutput16);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Features.multiview);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Features.multiviewGeometryShader);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Features.multiviewTessellationShader);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Features.variablePointersStorageBuffer);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Features.variablePointers);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Features.protectedMemory);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Features.samplerYcbcrConversion);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Features.shaderDrawParameters);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan11Properties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan11Properties const &physicalDeviceVulkan11Properties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Properties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Properties.pNext);
		for(size_t i = 0; i < VK_UUID_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Properties.deviceUUID[i]);
		}
		for(size_t i = 0; i < VK_UUID_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Properties.driverUUID[i]);
		}
		for(size_t i = 0; i < VK_LUID_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Properties.deviceLUID[i]);
		}
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Properties.deviceNodeMask);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Properties.deviceLUIDValid);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Properties.subgroupSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Properties.subgroupSupportedStages);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Properties.subgroupSupportedOperations);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Properties.subgroupQuadOperationsInAllStages);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Properties.pointClippingBehavior);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Properties.maxMultiviewViewCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Properties.maxMultiviewInstanceIndex);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Properties.protectedNoFault);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Properties.maxPerSetDescriptors);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan11Properties.maxMemoryAllocationSize);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan12Features>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan12Features const &physicalDeviceVulkan12Features) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.samplerMirrorClampToEdge);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.drawIndirectCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.storageBuffer8BitAccess);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.uniformAndStorageBuffer8BitAccess);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.storagePushConstant8);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.shaderBufferInt64Atomics);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.shaderSharedInt64Atomics);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.shaderFloat16);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.shaderInt8);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.descriptorIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.shaderInputAttachmentArrayDynamicIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.shaderUniformTexelBufferArrayDynamicIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.shaderStorageTexelBufferArrayDynamicIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.shaderUniformBufferArrayNonUniformIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.shaderSampledImageArrayNonUniformIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.shaderStorageBufferArrayNonUniformIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.shaderStorageImageArrayNonUniformIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.shaderInputAttachmentArrayNonUniformIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.shaderUniformTexelBufferArrayNonUniformIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.shaderStorageTexelBufferArrayNonUniformIndexing);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.descriptorBindingUniformBufferUpdateAfterBind);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.descriptorBindingSampledImageUpdateAfterBind);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.descriptorBindingStorageImageUpdateAfterBind);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.descriptorBindingStorageBufferUpdateAfterBind);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.descriptorBindingUniformTexelBufferUpdateAfterBind);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.descriptorBindingStorageTexelBufferUpdateAfterBind);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.descriptorBindingUpdateUnusedWhilePending);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.descriptorBindingPartiallyBound);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.descriptorBindingVariableDescriptorCount);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.runtimeDescriptorArray);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.samplerFilterMinmax);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.scalarBlockLayout);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.imagelessFramebuffer);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.uniformBufferStandardLayout);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.shaderSubgroupExtendedTypes);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.separateDepthStencilLayouts);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.hostQueryReset);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.timelineSemaphore);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.bufferDeviceAddress);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.bufferDeviceAddressCaptureReplay);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.bufferDeviceAddressMultiDevice);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.vulkanMemoryModel);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.vulkanMemoryModelDeviceScope);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.vulkanMemoryModelAvailabilityVisibilityChains);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.shaderOutputViewportIndex);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.shaderOutputLayer);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Features.subgroupBroadcastDynamicId);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan12Properties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan12Properties const &physicalDeviceVulkan12Properties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.driverID);
		for(size_t i = 0; i < VK_MAX_DRIVER_NAME_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.driverName[i]);
		}
		for(size_t i = 0; i < VK_MAX_DRIVER_INFO_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.driverInfo[i]);
		}
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.conformanceVersion);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.denormBehaviorIndependence);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.roundingModeIndependence);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.shaderSignedZeroInfNanPreserveFloat16);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.shaderSignedZeroInfNanPreserveFloat32);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.shaderSignedZeroInfNanPreserveFloat64);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.shaderDenormPreserveFloat16);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.shaderDenormPreserveFloat32);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.shaderDenormPreserveFloat64);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.shaderDenormFlushToZeroFloat16);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.shaderDenormFlushToZeroFloat32);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.shaderDenormFlushToZeroFloat64);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.shaderRoundingModeRTEFloat16);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.shaderRoundingModeRTEFloat32);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.shaderRoundingModeRTEFloat64);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.shaderRoundingModeRTZFloat16);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.shaderRoundingModeRTZFloat32);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.shaderRoundingModeRTZFloat64);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.maxUpdateAfterBindDescriptorsInAllPools);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.shaderUniformBufferArrayNonUniformIndexingNative);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.shaderSampledImageArrayNonUniformIndexingNative);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.shaderStorageBufferArrayNonUniformIndexingNative);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.shaderStorageImageArrayNonUniformIndexingNative);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.shaderInputAttachmentArrayNonUniformIndexingNative);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.robustBufferAccessUpdateAfterBind);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.quadDivergentImplicitLod);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.maxPerStageDescriptorUpdateAfterBindSamplers);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.maxPerStageDescriptorUpdateAfterBindUniformBuffers);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.maxPerStageDescriptorUpdateAfterBindStorageBuffers);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.maxPerStageDescriptorUpdateAfterBindSampledImages);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.maxPerStageDescriptorUpdateAfterBindStorageImages);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.maxPerStageDescriptorUpdateAfterBindInputAttachments);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.maxPerStageUpdateAfterBindResources);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.maxDescriptorSetUpdateAfterBindSamplers);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.maxDescriptorSetUpdateAfterBindUniformBuffers);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.maxDescriptorSetUpdateAfterBindStorageBuffers);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.maxDescriptorSetUpdateAfterBindSampledImages);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.maxDescriptorSetUpdateAfterBindStorageImages);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.maxDescriptorSetUpdateAfterBindInputAttachments);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.supportedDepthResolveModes);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.supportedStencilResolveModes);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.independentResolveNone);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.independentResolve);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.filterMinmaxSingleComponentFormats);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.filterMinmaxImageComponentMapping);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.maxTimelineSemaphoreValueDifference);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan12Properties.framebufferIntegerColorSampleCounts);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan13Features>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan13Features const &physicalDeviceVulkan13Features) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Features.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Features.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Features.robustImageAccess);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Features.inlineUniformBlock);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Features.descriptorBindingInlineUniformBlockUpdateAfterBind);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Features.pipelineCreationCacheControl);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Features.privateData);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Features.shaderDemoteToHelperInvocation);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Features.shaderTerminateInvocation);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Features.subgroupSizeControl);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Features.computeFullSubgroups);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Features.synchronization2);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Features.textureCompressionASTC_HDR);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Features.shaderZeroInitializeWorkgroupMemory);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Features.dynamicRendering);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Features.shaderIntegerDotProduct);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Features.maintenance4);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan13Properties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkan13Properties const &physicalDeviceVulkan13Properties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.minSubgroupSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.maxSubgroupSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.maxComputeWorkgroupSubgroups);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.requiredSubgroupSizeStages);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.maxInlineUniformBlockSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.maxPerStageDescriptorInlineUniformBlocks);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.maxDescriptorSetInlineUniformBlocks);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.maxDescriptorSetUpdateAfterBindInlineUniformBlocks);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.maxInlineUniformTotalSize);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProduct8BitUnsignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProduct8BitSignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProduct8BitMixedSignednessAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProduct4x8BitPackedUnsignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProduct4x8BitPackedSignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProduct4x8BitPackedMixedSignednessAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProduct16BitUnsignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProduct16BitSignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProduct16BitMixedSignednessAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProduct32BitUnsignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProduct32BitSignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProduct32BitMixedSignednessAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProduct64BitUnsignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProduct64BitSignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProduct64BitMixedSignednessAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating8BitUnsignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating8BitSignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating16BitUnsignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating16BitSignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating32BitUnsignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating32BitSignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating64BitUnsignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating64BitSignedAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.storageTexelBufferOffsetAlignmentBytes);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.storageTexelBufferOffsetSingleTexelAlignment);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.uniformTexelBufferOffsetAlignmentBytes);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.uniformTexelBufferOffsetSingleTexelAlignment);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkan13Properties.maxBufferSize);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkanMemoryModelFeatures>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceVulkanMemoryModelFeatures const &physicalDeviceVulkanMemoryModelFeatures) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkanMemoryModelFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkanMemoryModelFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkanMemoryModelFeatures.vulkanMemoryModel);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkanMemoryModelFeatures.vulkanMemoryModelDeviceScope);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceVulkanMemoryModelFeatures.vulkanMemoryModelAvailabilityVisibilityChains);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR const &
	                           physicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.workgroupMemoryExplicitLayout);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.workgroupMemoryExplicitLayoutScalarBlockLayout);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.workgroupMemoryExplicitLayout8BitAccess);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.workgroupMemoryExplicitLayout16BitAccess);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT const &physicalDeviceYcbcr2Plane444FormatsFeaturesEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceYcbcr2Plane444FormatsFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceYcbcr2Plane444FormatsFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceYcbcr2Plane444FormatsFeaturesEXT.ycbcr2plane444Formats);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceYcbcrImageArraysFeaturesEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceYcbcrImageArraysFeaturesEXT const &physicalDeviceYcbcrImageArraysFeaturesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceYcbcrImageArraysFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceYcbcrImageArraysFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceYcbcrImageArraysFeaturesEXT.ycbcrImageArrays);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures const &physicalDeviceZeroInitializeWorkgroupMemoryFeatures) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceZeroInitializeWorkgroupMemoryFeatures.sType);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceZeroInitializeWorkgroupMemoryFeatures.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, physicalDeviceZeroInitializeWorkgroupMemoryFeatures.shaderZeroInitializeWorkgroupMemory);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineCacheCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineCacheCreateInfo const &pipelineCacheCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCacheCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCacheCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCacheCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCacheCreateInfo.initialDataSize);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCacheCreateInfo.pInitialData);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineCacheHeaderVersionOne>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineCacheHeaderVersionOne const &pipelineCacheHeaderVersionOne) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCacheHeaderVersionOne.headerSize);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCacheHeaderVersionOne.headerVersion);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCacheHeaderVersionOne.vendorID);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCacheHeaderVersionOne.deviceID);
		for(size_t i = 0; i < VK_UUID_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, pipelineCacheHeaderVersionOne.pipelineCacheUUID[i]);
		}
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineColorBlendAdvancedStateCreateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineColorBlendAdvancedStateCreateInfoEXT const &pipelineColorBlendAdvancedStateCreateInfoEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineColorBlendAdvancedStateCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineColorBlendAdvancedStateCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineColorBlendAdvancedStateCreateInfoEXT.srcPremultiplied);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineColorBlendAdvancedStateCreateInfoEXT.dstPremultiplied);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineColorBlendAdvancedStateCreateInfoEXT.blendOverlap);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineColorWriteCreateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineColorWriteCreateInfoEXT const &pipelineColorWriteCreateInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineColorWriteCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineColorWriteCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineColorWriteCreateInfoEXT.attachmentCount);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineColorWriteCreateInfoEXT.pColorWriteEnables);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineCompilerControlCreateInfoAMD>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineCompilerControlCreateInfoAMD const &pipelineCompilerControlCreateInfoAMD) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCompilerControlCreateInfoAMD.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCompilerControlCreateInfoAMD.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCompilerControlCreateInfoAMD.compilerControlFlags);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineCoverageModulationStateCreateInfoNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineCoverageModulationStateCreateInfoNV const &pipelineCoverageModulationStateCreateInfoNV) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCoverageModulationStateCreateInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCoverageModulationStateCreateInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCoverageModulationStateCreateInfoNV.flags);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCoverageModulationStateCreateInfoNV.coverageModulationMode);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCoverageModulationStateCreateInfoNV.coverageModulationTableEnable);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCoverageModulationStateCreateInfoNV.coverageModulationTableCount);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCoverageModulationStateCreateInfoNV.pCoverageModulationTable);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineCoverageReductionStateCreateInfoNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineCoverageReductionStateCreateInfoNV const &pipelineCoverageReductionStateCreateInfoNV) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCoverageReductionStateCreateInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCoverageReductionStateCreateInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCoverageReductionStateCreateInfoNV.flags);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCoverageReductionStateCreateInfoNV.coverageReductionMode);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineCoverageToColorStateCreateInfoNV>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PipelineCoverageToColorStateCreateInfoNV const &pipelineCoverageToColorStateCreateInfoNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCoverageToColorStateCreateInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCoverageToColorStateCreateInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCoverageToColorStateCreateInfoNV.flags);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCoverageToColorStateCreateInfoNV.coverageToColorEnable);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCoverageToColorStateCreateInfoNV.coverageToColorLocation);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineCreationFeedback>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineCreationFeedback const &pipelineCreationFeedback) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCreationFeedback.flags);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCreationFeedback.duration);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineCreationFeedbackCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineCreationFeedbackCreateInfo const &pipelineCreationFeedbackCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCreationFeedbackCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCreationFeedbackCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCreationFeedbackCreateInfo.pPipelineCreationFeedback);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCreationFeedbackCreateInfo.pipelineStageCreationFeedbackCount);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineCreationFeedbackCreateInfo.pPipelineStageCreationFeedbacks);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineDiscardRectangleStateCreateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineDiscardRectangleStateCreateInfoEXT const &pipelineDiscardRectangleStateCreateInfoEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineDiscardRectangleStateCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineDiscardRectangleStateCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineDiscardRectangleStateCreateInfoEXT.flags);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineDiscardRectangleStateCreateInfoEXT.discardRectangleMode);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineDiscardRectangleStateCreateInfoEXT.discardRectangleCount);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineDiscardRectangleStateCreateInfoEXT.pDiscardRectangles);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineExecutableInfoKHR const &pipelineExecutableInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineExecutableInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineExecutableInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineExecutableInfoKHR.pipeline);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineExecutableInfoKHR.executableIndex);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR const &pipelineExecutableInternalRepresentationKHR) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineExecutableInternalRepresentationKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineExecutableInternalRepresentationKHR.pNext);
		for(size_t i = 0; i < VK_MAX_DESCRIPTION_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, pipelineExecutableInternalRepresentationKHR.name[i]);
		}
		for(size_t i = 0; i < VK_MAX_DESCRIPTION_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, pipelineExecutableInternalRepresentationKHR.description[i]);
		}
		VULKAN_HPP_HASH_COMBINE(seed, pipelineExecutableInternalRepresentationKHR.isText);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineExecutableInternalRepresentationKHR.dataSize);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineExecutableInternalRepresentationKHR.pData);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR const &pipelineExecutablePropertiesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineExecutablePropertiesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineExecutablePropertiesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineExecutablePropertiesKHR.stages);
		for(size_t i = 0; i < VK_MAX_DESCRIPTION_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, pipelineExecutablePropertiesKHR.name[i]);
		}
		for(size_t i = 0; i < VK_MAX_DESCRIPTION_SIZE; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, pipelineExecutablePropertiesKHR.description[i]);
		}
		VULKAN_HPP_HASH_COMBINE(seed, pipelineExecutablePropertiesKHR.subgroupSize);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineFragmentShadingRateEnumStateCreateInfoNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineFragmentShadingRateEnumStateCreateInfoNV const &pipelineFragmentShadingRateEnumStateCreateInfoNV)
	    const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineFragmentShadingRateEnumStateCreateInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineFragmentShadingRateEnumStateCreateInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineFragmentShadingRateEnumStateCreateInfoNV.shadingRateType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineFragmentShadingRateEnumStateCreateInfoNV.shadingRate);
		for(size_t i = 0; i < 2; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, pipelineFragmentShadingRateEnumStateCreateInfoNV.combinerOps[i]);
		}
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineFragmentShadingRateStateCreateInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineFragmentShadingRateStateCreateInfoKHR const &pipelineFragmentShadingRateStateCreateInfoKHR) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineFragmentShadingRateStateCreateInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineFragmentShadingRateStateCreateInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineFragmentShadingRateStateCreateInfoKHR.fragmentSize);
		for(size_t i = 0; i < 2; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, pipelineFragmentShadingRateStateCreateInfoKHR.combinerOps[i]);
		}
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineInfoKHR const &pipelineInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineInfoKHR.pipeline);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PushConstantRange>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PushConstantRange const &pushConstantRange) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pushConstantRange.stageFlags);
		VULKAN_HPP_HASH_COMBINE(seed, pushConstantRange.offset);
		VULKAN_HPP_HASH_COMBINE(seed, pushConstantRange.size);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineLayoutCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineLayoutCreateInfo const &pipelineLayoutCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineLayoutCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineLayoutCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineLayoutCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineLayoutCreateInfo.setLayoutCount);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineLayoutCreateInfo.pSetLayouts);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineLayoutCreateInfo.pushConstantRangeCount);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineLayoutCreateInfo.pPushConstantRanges);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineLibraryCreateInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineLibraryCreateInfoKHR const &pipelineLibraryCreateInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineLibraryCreateInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineLibraryCreateInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineLibraryCreateInfoKHR.libraryCount);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineLibraryCreateInfoKHR.pLibraries);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineRasterizationConservativeStateCreateInfoEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PipelineRasterizationConservativeStateCreateInfoEXT const &pipelineRasterizationConservativeStateCreateInfoEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationConservativeStateCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationConservativeStateCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationConservativeStateCreateInfoEXT.flags);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationConservativeStateCreateInfoEXT.conservativeRasterizationMode);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationConservativeStateCreateInfoEXT.extraPrimitiveOverestimationSize);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineRasterizationDepthClipStateCreateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineRasterizationDepthClipStateCreateInfoEXT const &pipelineRasterizationDepthClipStateCreateInfoEXT)
	    const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationDepthClipStateCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationDepthClipStateCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationDepthClipStateCreateInfoEXT.flags);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationDepthClipStateCreateInfoEXT.depthClipEnable);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineRasterizationLineStateCreateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineRasterizationLineStateCreateInfoEXT const &pipelineRasterizationLineStateCreateInfoEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationLineStateCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationLineStateCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationLineStateCreateInfoEXT.lineRasterizationMode);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationLineStateCreateInfoEXT.stippledLineEnable);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationLineStateCreateInfoEXT.lineStippleFactor);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationLineStateCreateInfoEXT.lineStipplePattern);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineRasterizationProvokingVertexStateCreateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineRasterizationProvokingVertexStateCreateInfoEXT const &
	                           pipelineRasterizationProvokingVertexStateCreateInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationProvokingVertexStateCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationProvokingVertexStateCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationProvokingVertexStateCreateInfoEXT.provokingVertexMode);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineRasterizationStateRasterizationOrderAMD>
{
	std::size_t operator()(
	    VULKAN_HPP_NAMESPACE::PipelineRasterizationStateRasterizationOrderAMD const &pipelineRasterizationStateRasterizationOrderAMD) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationStateRasterizationOrderAMD.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationStateRasterizationOrderAMD.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationStateRasterizationOrderAMD.rasterizationOrder);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineRasterizationStateStreamCreateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineRasterizationStateStreamCreateInfoEXT const &pipelineRasterizationStateStreamCreateInfoEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationStateStreamCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationStateStreamCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationStateStreamCreateInfoEXT.flags);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRasterizationStateStreamCreateInfoEXT.rasterizationStream);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineRenderingCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineRenderingCreateInfo const &pipelineRenderingCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRenderingCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRenderingCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRenderingCreateInfo.viewMask);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRenderingCreateInfo.colorAttachmentCount);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRenderingCreateInfo.pColorAttachmentFormats);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRenderingCreateInfo.depthAttachmentFormat);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRenderingCreateInfo.stencilAttachmentFormat);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineRepresentativeFragmentTestStateCreateInfoNV>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PipelineRepresentativeFragmentTestStateCreateInfoNV const &pipelineRepresentativeFragmentTestStateCreateInfoNV) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRepresentativeFragmentTestStateCreateInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRepresentativeFragmentTestStateCreateInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineRepresentativeFragmentTestStateCreateInfoNV.representativeFragmentTestEnable);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineSampleLocationsStateCreateInfoEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PipelineSampleLocationsStateCreateInfoEXT const &pipelineSampleLocationsStateCreateInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineSampleLocationsStateCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineSampleLocationsStateCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineSampleLocationsStateCreateInfoEXT.sampleLocationsEnable);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineSampleLocationsStateCreateInfoEXT.sampleLocationsInfo);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineShaderStageRequiredSubgroupSizeCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineShaderStageRequiredSubgroupSizeCreateInfo const &pipelineShaderStageRequiredSubgroupSizeCreateInfo)
	    const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineShaderStageRequiredSubgroupSizeCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineShaderStageRequiredSubgroupSizeCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineShaderStageRequiredSubgroupSizeCreateInfo.requiredSubgroupSize);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineTessellationDomainOriginStateCreateInfo>
{
	std::size_t operator()(
	    VULKAN_HPP_NAMESPACE::PipelineTessellationDomainOriginStateCreateInfo const &pipelineTessellationDomainOriginStateCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineTessellationDomainOriginStateCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineTessellationDomainOriginStateCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineTessellationDomainOriginStateCreateInfo.domainOrigin);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::VertexInputBindingDivisorDescriptionEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::VertexInputBindingDivisorDescriptionEXT const &vertexInputBindingDivisorDescriptionEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, vertexInputBindingDivisorDescriptionEXT.binding);
		VULKAN_HPP_HASH_COMBINE(seed, vertexInputBindingDivisorDescriptionEXT.divisor);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineVertexInputDivisorStateCreateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineVertexInputDivisorStateCreateInfoEXT const &pipelineVertexInputDivisorStateCreateInfoEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineVertexInputDivisorStateCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineVertexInputDivisorStateCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineVertexInputDivisorStateCreateInfoEXT.vertexBindingDivisorCount);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineVertexInputDivisorStateCreateInfoEXT.pVertexBindingDivisors);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineViewportCoarseSampleOrderStateCreateInfoNV>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PipelineViewportCoarseSampleOrderStateCreateInfoNV const &pipelineViewportCoarseSampleOrderStateCreateInfoNV) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportCoarseSampleOrderStateCreateInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportCoarseSampleOrderStateCreateInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportCoarseSampleOrderStateCreateInfoNV.sampleOrderType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportCoarseSampleOrderStateCreateInfoNV.customSampleOrderCount);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportCoarseSampleOrderStateCreateInfoNV.pCustomSampleOrders);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineViewportDepthClipControlCreateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineViewportDepthClipControlCreateInfoEXT const &pipelineViewportDepthClipControlCreateInfoEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportDepthClipControlCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportDepthClipControlCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportDepthClipControlCreateInfoEXT.negativeOneToOne);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineViewportExclusiveScissorStateCreateInfoNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineViewportExclusiveScissorStateCreateInfoNV const &pipelineViewportExclusiveScissorStateCreateInfoNV)
	    const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportExclusiveScissorStateCreateInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportExclusiveScissorStateCreateInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportExclusiveScissorStateCreateInfoNV.exclusiveScissorCount);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportExclusiveScissorStateCreateInfoNV.pExclusiveScissors);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV const &shadingRatePaletteNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, shadingRatePaletteNV.shadingRatePaletteEntryCount);
		VULKAN_HPP_HASH_COMBINE(seed, shadingRatePaletteNV.pShadingRatePaletteEntries);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineViewportShadingRateImageStateCreateInfoNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PipelineViewportShadingRateImageStateCreateInfoNV const &pipelineViewportShadingRateImageStateCreateInfoNV)
	    const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportShadingRateImageStateCreateInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportShadingRateImageStateCreateInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportShadingRateImageStateCreateInfoNV.shadingRateImageEnable);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportShadingRateImageStateCreateInfoNV.viewportCount);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportShadingRateImageStateCreateInfoNV.pShadingRatePalettes);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ViewportSwizzleNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ViewportSwizzleNV const &viewportSwizzleNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, viewportSwizzleNV.x);
		VULKAN_HPP_HASH_COMBINE(seed, viewportSwizzleNV.y);
		VULKAN_HPP_HASH_COMBINE(seed, viewportSwizzleNV.z);
		VULKAN_HPP_HASH_COMBINE(seed, viewportSwizzleNV.w);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineViewportSwizzleStateCreateInfoNV>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PipelineViewportSwizzleStateCreateInfoNV const &pipelineViewportSwizzleStateCreateInfoNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportSwizzleStateCreateInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportSwizzleStateCreateInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportSwizzleStateCreateInfoNV.flags);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportSwizzleStateCreateInfoNV.viewportCount);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportSwizzleStateCreateInfoNV.pViewportSwizzles);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ViewportWScalingNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ViewportWScalingNV const &viewportWScalingNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, viewportWScalingNV.xcoeff);
		VULKAN_HPP_HASH_COMBINE(seed, viewportWScalingNV.ycoeff);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PipelineViewportWScalingStateCreateInfoNV>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::PipelineViewportWScalingStateCreateInfoNV const &pipelineViewportWScalingStateCreateInfoNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportWScalingStateCreateInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportWScalingStateCreateInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportWScalingStateCreateInfoNV.viewportWScalingEnable);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportWScalingStateCreateInfoNV.viewportCount);
		VULKAN_HPP_HASH_COMBINE(seed, pipelineViewportWScalingStateCreateInfoNV.pViewportWScalings);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_GGP)
template<>
struct hash<VULKAN_HPP_NAMESPACE::PresentFrameTokenGGP>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PresentFrameTokenGGP const &presentFrameTokenGGP) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, presentFrameTokenGGP.sType);
		VULKAN_HPP_HASH_COMBINE(seed, presentFrameTokenGGP.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, presentFrameTokenGGP.frameToken);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_GGP*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::PresentIdKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PresentIdKHR const &presentIdKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, presentIdKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, presentIdKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, presentIdKHR.swapchainCount);
		VULKAN_HPP_HASH_COMBINE(seed, presentIdKHR.pPresentIds);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PresentInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PresentInfoKHR const &presentInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, presentInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, presentInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, presentInfoKHR.waitSemaphoreCount);
		VULKAN_HPP_HASH_COMBINE(seed, presentInfoKHR.pWaitSemaphores);
		VULKAN_HPP_HASH_COMBINE(seed, presentInfoKHR.swapchainCount);
		VULKAN_HPP_HASH_COMBINE(seed, presentInfoKHR.pSwapchains);
		VULKAN_HPP_HASH_COMBINE(seed, presentInfoKHR.pImageIndices);
		VULKAN_HPP_HASH_COMBINE(seed, presentInfoKHR.pResults);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::RectLayerKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::RectLayerKHR const &rectLayerKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, rectLayerKHR.offset);
		VULKAN_HPP_HASH_COMBINE(seed, rectLayerKHR.extent);
		VULKAN_HPP_HASH_COMBINE(seed, rectLayerKHR.layer);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PresentRegionKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PresentRegionKHR const &presentRegionKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, presentRegionKHR.rectangleCount);
		VULKAN_HPP_HASH_COMBINE(seed, presentRegionKHR.pRectangles);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PresentRegionsKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PresentRegionsKHR const &presentRegionsKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, presentRegionsKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, presentRegionsKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, presentRegionsKHR.swapchainCount);
		VULKAN_HPP_HASH_COMBINE(seed, presentRegionsKHR.pRegions);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PresentTimeGOOGLE>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PresentTimeGOOGLE const &presentTimeGOOGLE) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, presentTimeGOOGLE.presentID);
		VULKAN_HPP_HASH_COMBINE(seed, presentTimeGOOGLE.desiredPresentTime);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PresentTimesInfoGOOGLE>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PresentTimesInfoGOOGLE const &presentTimesInfoGOOGLE) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, presentTimesInfoGOOGLE.sType);
		VULKAN_HPP_HASH_COMBINE(seed, presentTimesInfoGOOGLE.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, presentTimesInfoGOOGLE.swapchainCount);
		VULKAN_HPP_HASH_COMBINE(seed, presentTimesInfoGOOGLE.pTimes);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::PrivateDataSlotCreateInfo const &privateDataSlotCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, privateDataSlotCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, privateDataSlotCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, privateDataSlotCreateInfo.flags);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ProtectedSubmitInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ProtectedSubmitInfo const &protectedSubmitInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, protectedSubmitInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, protectedSubmitInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, protectedSubmitInfo.protectedSubmit);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::QueryPoolCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::QueryPoolCreateInfo const &queryPoolCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, queryPoolCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, queryPoolCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, queryPoolCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, queryPoolCreateInfo.queryType);
		VULKAN_HPP_HASH_COMBINE(seed, queryPoolCreateInfo.queryCount);
		VULKAN_HPP_HASH_COMBINE(seed, queryPoolCreateInfo.pipelineStatistics);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::QueryPoolPerformanceCreateInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::QueryPoolPerformanceCreateInfoKHR const &queryPoolPerformanceCreateInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, queryPoolPerformanceCreateInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, queryPoolPerformanceCreateInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, queryPoolPerformanceCreateInfoKHR.queueFamilyIndex);
		VULKAN_HPP_HASH_COMBINE(seed, queryPoolPerformanceCreateInfoKHR.counterIndexCount);
		VULKAN_HPP_HASH_COMBINE(seed, queryPoolPerformanceCreateInfoKHR.pCounterIndices);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::QueryPoolPerformanceQueryCreateInfoINTEL>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::QueryPoolPerformanceQueryCreateInfoINTEL const &queryPoolPerformanceQueryCreateInfoINTEL) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, queryPoolPerformanceQueryCreateInfoINTEL.sType);
		VULKAN_HPP_HASH_COMBINE(seed, queryPoolPerformanceQueryCreateInfoINTEL.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, queryPoolPerformanceQueryCreateInfoINTEL.performanceCountersSampling);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::QueueFamilyCheckpointProperties2NV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::QueueFamilyCheckpointProperties2NV const &queueFamilyCheckpointProperties2NV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, queueFamilyCheckpointProperties2NV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, queueFamilyCheckpointProperties2NV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, queueFamilyCheckpointProperties2NV.checkpointExecutionStageMask);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::QueueFamilyCheckpointPropertiesNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::QueueFamilyCheckpointPropertiesNV const &queueFamilyCheckpointPropertiesNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, queueFamilyCheckpointPropertiesNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, queueFamilyCheckpointPropertiesNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, queueFamilyCheckpointPropertiesNV.checkpointExecutionStageMask);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::QueueFamilyGlobalPriorityPropertiesKHR>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::QueueFamilyGlobalPriorityPropertiesKHR const &queueFamilyGlobalPriorityPropertiesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, queueFamilyGlobalPriorityPropertiesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, queueFamilyGlobalPriorityPropertiesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, queueFamilyGlobalPriorityPropertiesKHR.priorityCount);
		for(size_t i = 0; i < VK_MAX_GLOBAL_PRIORITY_SIZE_KHR; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, queueFamilyGlobalPriorityPropertiesKHR.priorities[i]);
		}
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::QueueFamilyProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::QueueFamilyProperties const &queueFamilyProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, queueFamilyProperties.queueFlags);
		VULKAN_HPP_HASH_COMBINE(seed, queueFamilyProperties.queueCount);
		VULKAN_HPP_HASH_COMBINE(seed, queueFamilyProperties.timestampValidBits);
		VULKAN_HPP_HASH_COMBINE(seed, queueFamilyProperties.minImageTransferGranularity);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::QueueFamilyProperties2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::QueueFamilyProperties2 const &queueFamilyProperties2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, queueFamilyProperties2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, queueFamilyProperties2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, queueFamilyProperties2.queueFamilyProperties);
		return seed;
	}
};

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::QueueFamilyQueryResultStatusProperties2KHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::QueueFamilyQueryResultStatusProperties2KHR const &queueFamilyQueryResultStatusProperties2KHR) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, queueFamilyQueryResultStatusProperties2KHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, queueFamilyQueryResultStatusProperties2KHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, queueFamilyQueryResultStatusProperties2KHR.supported);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoKHR const &rayTracingShaderGroupCreateInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingShaderGroupCreateInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingShaderGroupCreateInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingShaderGroupCreateInfoKHR.type);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingShaderGroupCreateInfoKHR.generalShader);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingShaderGroupCreateInfoKHR.closestHitShader);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingShaderGroupCreateInfoKHR.anyHitShader);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingShaderGroupCreateInfoKHR.intersectionShader);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingShaderGroupCreateInfoKHR.pShaderGroupCaptureReplayHandle);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::RayTracingPipelineInterfaceCreateInfoKHR>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::RayTracingPipelineInterfaceCreateInfoKHR const &rayTracingPipelineInterfaceCreateInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineInterfaceCreateInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineInterfaceCreateInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineInterfaceCreateInfoKHR.maxPipelineRayPayloadSize);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineInterfaceCreateInfoKHR.maxPipelineRayHitAttributeSize);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoKHR const &rayTracingPipelineCreateInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoKHR.flags);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoKHR.stageCount);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoKHR.pStages);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoKHR.groupCount);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoKHR.pGroups);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoKHR.maxPipelineRayRecursionDepth);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoKHR.pLibraryInfo);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoKHR.pLibraryInterface);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoKHR.pDynamicState);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoKHR.layout);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoKHR.basePipelineHandle);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoKHR.basePipelineIndex);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoNV const &rayTracingShaderGroupCreateInfoNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingShaderGroupCreateInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingShaderGroupCreateInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingShaderGroupCreateInfoNV.type);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingShaderGroupCreateInfoNV.generalShader);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingShaderGroupCreateInfoNV.closestHitShader);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingShaderGroupCreateInfoNV.anyHitShader);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingShaderGroupCreateInfoNV.intersectionShader);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::RayTracingPipelineCreateInfoNV const &rayTracingPipelineCreateInfoNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoNV.flags);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoNV.stageCount);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoNV.pStages);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoNV.groupCount);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoNV.pGroups);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoNV.maxRecursionDepth);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoNV.layout);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoNV.basePipelineHandle);
		VULKAN_HPP_HASH_COMBINE(seed, rayTracingPipelineCreateInfoNV.basePipelineIndex);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::RefreshCycleDurationGOOGLE>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::RefreshCycleDurationGOOGLE const &refreshCycleDurationGOOGLE) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, refreshCycleDurationGOOGLE.refreshDuration);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::RenderPassAttachmentBeginInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::RenderPassAttachmentBeginInfo const &renderPassAttachmentBeginInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, renderPassAttachmentBeginInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassAttachmentBeginInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassAttachmentBeginInfo.attachmentCount);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassAttachmentBeginInfo.pAttachments);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::RenderPassBeginInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::RenderPassBeginInfo const &renderPassBeginInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, renderPassBeginInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassBeginInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassBeginInfo.renderPass);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassBeginInfo.framebuffer);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassBeginInfo.renderArea);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassBeginInfo.clearValueCount);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassBeginInfo.pClearValues);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SubpassDescription>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SubpassDescription const &subpassDescription) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescription.flags);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescription.pipelineBindPoint);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescription.inputAttachmentCount);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescription.pInputAttachments);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescription.colorAttachmentCount);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescription.pColorAttachments);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescription.pResolveAttachments);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescription.pDepthStencilAttachment);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescription.preserveAttachmentCount);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescription.pPreserveAttachments);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SubpassDependency>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SubpassDependency const &subpassDependency) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, subpassDependency.srcSubpass);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDependency.dstSubpass);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDependency.srcStageMask);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDependency.dstStageMask);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDependency.srcAccessMask);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDependency.dstAccessMask);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDependency.dependencyFlags);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::RenderPassCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::RenderPassCreateInfo const &renderPassCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, renderPassCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassCreateInfo.attachmentCount);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassCreateInfo.pAttachments);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassCreateInfo.subpassCount);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassCreateInfo.pSubpasses);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassCreateInfo.dependencyCount);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassCreateInfo.pDependencies);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SubpassDescription2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SubpassDescription2 const &subpassDescription2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescription2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescription2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescription2.flags);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescription2.pipelineBindPoint);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescription2.viewMask);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescription2.inputAttachmentCount);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescription2.pInputAttachments);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescription2.colorAttachmentCount);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescription2.pColorAttachments);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescription2.pResolveAttachments);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescription2.pDepthStencilAttachment);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescription2.preserveAttachmentCount);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescription2.pPreserveAttachments);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SubpassDependency2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SubpassDependency2 const &subpassDependency2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, subpassDependency2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDependency2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDependency2.srcSubpass);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDependency2.dstSubpass);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDependency2.srcStageMask);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDependency2.dstStageMask);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDependency2.srcAccessMask);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDependency2.dstAccessMask);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDependency2.dependencyFlags);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDependency2.viewOffset);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::RenderPassCreateInfo2 const &renderPassCreateInfo2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, renderPassCreateInfo2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassCreateInfo2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassCreateInfo2.flags);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassCreateInfo2.attachmentCount);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassCreateInfo2.pAttachments);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassCreateInfo2.subpassCount);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassCreateInfo2.pSubpasses);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassCreateInfo2.dependencyCount);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassCreateInfo2.pDependencies);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassCreateInfo2.correlatedViewMaskCount);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassCreateInfo2.pCorrelatedViewMasks);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::RenderPassFragmentDensityMapCreateInfoEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::RenderPassFragmentDensityMapCreateInfoEXT const &renderPassFragmentDensityMapCreateInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, renderPassFragmentDensityMapCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassFragmentDensityMapCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassFragmentDensityMapCreateInfoEXT.fragmentDensityMapAttachment);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::RenderPassInputAttachmentAspectCreateInfo>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::RenderPassInputAttachmentAspectCreateInfo const &renderPassInputAttachmentAspectCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, renderPassInputAttachmentAspectCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassInputAttachmentAspectCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassInputAttachmentAspectCreateInfo.aspectReferenceCount);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassInputAttachmentAspectCreateInfo.pAspectReferences);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::RenderPassMultiviewCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::RenderPassMultiviewCreateInfo const &renderPassMultiviewCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, renderPassMultiviewCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassMultiviewCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassMultiviewCreateInfo.subpassCount);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassMultiviewCreateInfo.pViewMasks);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassMultiviewCreateInfo.dependencyCount);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassMultiviewCreateInfo.pViewOffsets);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassMultiviewCreateInfo.correlationMaskCount);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassMultiviewCreateInfo.pCorrelationMasks);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SubpassSampleLocationsEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SubpassSampleLocationsEXT const &subpassSampleLocationsEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, subpassSampleLocationsEXT.subpassIndex);
		VULKAN_HPP_HASH_COMBINE(seed, subpassSampleLocationsEXT.sampleLocationsInfo);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::RenderPassSampleLocationsBeginInfoEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::RenderPassSampleLocationsBeginInfoEXT const &renderPassSampleLocationsBeginInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, renderPassSampleLocationsBeginInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassSampleLocationsBeginInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassSampleLocationsBeginInfoEXT.attachmentInitialSampleLocationsCount);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassSampleLocationsBeginInfoEXT.pAttachmentInitialSampleLocations);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassSampleLocationsBeginInfoEXT.postSubpassSampleLocationsCount);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassSampleLocationsBeginInfoEXT.pPostSubpassSampleLocations);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::RenderPassTransformBeginInfoQCOM>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::RenderPassTransformBeginInfoQCOM const &renderPassTransformBeginInfoQCOM) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, renderPassTransformBeginInfoQCOM.sType);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassTransformBeginInfoQCOM.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, renderPassTransformBeginInfoQCOM.transform);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::RenderingFragmentDensityMapAttachmentInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::RenderingFragmentDensityMapAttachmentInfoEXT const &renderingFragmentDensityMapAttachmentInfoEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, renderingFragmentDensityMapAttachmentInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, renderingFragmentDensityMapAttachmentInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, renderingFragmentDensityMapAttachmentInfoEXT.imageView);
		VULKAN_HPP_HASH_COMBINE(seed, renderingFragmentDensityMapAttachmentInfoEXT.imageLayout);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::RenderingFragmentShadingRateAttachmentInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::RenderingFragmentShadingRateAttachmentInfoKHR const &renderingFragmentShadingRateAttachmentInfoKHR) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, renderingFragmentShadingRateAttachmentInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, renderingFragmentShadingRateAttachmentInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, renderingFragmentShadingRateAttachmentInfoKHR.imageView);
		VULKAN_HPP_HASH_COMBINE(seed, renderingFragmentShadingRateAttachmentInfoKHR.imageLayout);
		VULKAN_HPP_HASH_COMBINE(seed, renderingFragmentShadingRateAttachmentInfoKHR.shadingRateAttachmentTexelSize);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::RenderingInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::RenderingInfo const &renderingInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, renderingInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, renderingInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, renderingInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, renderingInfo.renderArea);
		VULKAN_HPP_HASH_COMBINE(seed, renderingInfo.layerCount);
		VULKAN_HPP_HASH_COMBINE(seed, renderingInfo.viewMask);
		VULKAN_HPP_HASH_COMBINE(seed, renderingInfo.colorAttachmentCount);
		VULKAN_HPP_HASH_COMBINE(seed, renderingInfo.pColorAttachments);
		VULKAN_HPP_HASH_COMBINE(seed, renderingInfo.pDepthAttachment);
		VULKAN_HPP_HASH_COMBINE(seed, renderingInfo.pStencilAttachment);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ResolveImageInfo2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ResolveImageInfo2 const &resolveImageInfo2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, resolveImageInfo2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, resolveImageInfo2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, resolveImageInfo2.srcImage);
		VULKAN_HPP_HASH_COMBINE(seed, resolveImageInfo2.srcImageLayout);
		VULKAN_HPP_HASH_COMBINE(seed, resolveImageInfo2.dstImage);
		VULKAN_HPP_HASH_COMBINE(seed, resolveImageInfo2.dstImageLayout);
		VULKAN_HPP_HASH_COMBINE(seed, resolveImageInfo2.regionCount);
		VULKAN_HPP_HASH_COMBINE(seed, resolveImageInfo2.pRegions);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SamplerBorderColorComponentMappingCreateInfoEXT>
{
	std::size_t operator()(
	    VULKAN_HPP_NAMESPACE::SamplerBorderColorComponentMappingCreateInfoEXT const &samplerBorderColorComponentMappingCreateInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, samplerBorderColorComponentMappingCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, samplerBorderColorComponentMappingCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, samplerBorderColorComponentMappingCreateInfoEXT.components);
		VULKAN_HPP_HASH_COMBINE(seed, samplerBorderColorComponentMappingCreateInfoEXT.srgb);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SamplerCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SamplerCreateInfo const &samplerCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, samplerCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, samplerCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, samplerCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, samplerCreateInfo.magFilter);
		VULKAN_HPP_HASH_COMBINE(seed, samplerCreateInfo.minFilter);
		VULKAN_HPP_HASH_COMBINE(seed, samplerCreateInfo.mipmapMode);
		VULKAN_HPP_HASH_COMBINE(seed, samplerCreateInfo.addressModeU);
		VULKAN_HPP_HASH_COMBINE(seed, samplerCreateInfo.addressModeV);
		VULKAN_HPP_HASH_COMBINE(seed, samplerCreateInfo.addressModeW);
		VULKAN_HPP_HASH_COMBINE(seed, samplerCreateInfo.mipLodBias);
		VULKAN_HPP_HASH_COMBINE(seed, samplerCreateInfo.anisotropyEnable);
		VULKAN_HPP_HASH_COMBINE(seed, samplerCreateInfo.maxAnisotropy);
		VULKAN_HPP_HASH_COMBINE(seed, samplerCreateInfo.compareEnable);
		VULKAN_HPP_HASH_COMBINE(seed, samplerCreateInfo.compareOp);
		VULKAN_HPP_HASH_COMBINE(seed, samplerCreateInfo.minLod);
		VULKAN_HPP_HASH_COMBINE(seed, samplerCreateInfo.maxLod);
		VULKAN_HPP_HASH_COMBINE(seed, samplerCreateInfo.borderColor);
		VULKAN_HPP_HASH_COMBINE(seed, samplerCreateInfo.unnormalizedCoordinates);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SamplerReductionModeCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SamplerReductionModeCreateInfo const &samplerReductionModeCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, samplerReductionModeCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, samplerReductionModeCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, samplerReductionModeCreateInfo.reductionMode);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionCreateInfo const &samplerYcbcrConversionCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, samplerYcbcrConversionCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, samplerYcbcrConversionCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, samplerYcbcrConversionCreateInfo.format);
		VULKAN_HPP_HASH_COMBINE(seed, samplerYcbcrConversionCreateInfo.ycbcrModel);
		VULKAN_HPP_HASH_COMBINE(seed, samplerYcbcrConversionCreateInfo.ycbcrRange);
		VULKAN_HPP_HASH_COMBINE(seed, samplerYcbcrConversionCreateInfo.components);
		VULKAN_HPP_HASH_COMBINE(seed, samplerYcbcrConversionCreateInfo.xChromaOffset);
		VULKAN_HPP_HASH_COMBINE(seed, samplerYcbcrConversionCreateInfo.yChromaOffset);
		VULKAN_HPP_HASH_COMBINE(seed, samplerYcbcrConversionCreateInfo.chromaFilter);
		VULKAN_HPP_HASH_COMBINE(seed, samplerYcbcrConversionCreateInfo.forceExplicitReconstruction);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionImageFormatProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionImageFormatProperties const &samplerYcbcrConversionImageFormatProperties) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, samplerYcbcrConversionImageFormatProperties.sType);
		VULKAN_HPP_HASH_COMBINE(seed, samplerYcbcrConversionImageFormatProperties.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, samplerYcbcrConversionImageFormatProperties.combinedImageSamplerDescriptorCount);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SamplerYcbcrConversionInfo const &samplerYcbcrConversionInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, samplerYcbcrConversionInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, samplerYcbcrConversionInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, samplerYcbcrConversionInfo.conversion);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_SCREEN_QNX)
template<>
struct hash<VULKAN_HPP_NAMESPACE::ScreenSurfaceCreateInfoQNX>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ScreenSurfaceCreateInfoQNX const &screenSurfaceCreateInfoQNX) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, screenSurfaceCreateInfoQNX.sType);
		VULKAN_HPP_HASH_COMBINE(seed, screenSurfaceCreateInfoQNX.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, screenSurfaceCreateInfoQNX.flags);
		VULKAN_HPP_HASH_COMBINE(seed, screenSurfaceCreateInfoQNX.context);
		VULKAN_HPP_HASH_COMBINE(seed, screenSurfaceCreateInfoQNX.window);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_SCREEN_QNX*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::SemaphoreCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SemaphoreCreateInfo const &semaphoreCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreCreateInfo.flags);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SemaphoreGetFdInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SemaphoreGetFdInfoKHR const &semaphoreGetFdInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreGetFdInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreGetFdInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreGetFdInfoKHR.semaphore);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreGetFdInfoKHR.handleType);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::SemaphoreGetWin32HandleInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SemaphoreGetWin32HandleInfoKHR const &semaphoreGetWin32HandleInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreGetWin32HandleInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreGetWin32HandleInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreGetWin32HandleInfoKHR.semaphore);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreGetWin32HandleInfoKHR.handleType);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

#	if defined(VK_USE_PLATFORM_FUCHSIA)
template<>
struct hash<VULKAN_HPP_NAMESPACE::SemaphoreGetZirconHandleInfoFUCHSIA>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SemaphoreGetZirconHandleInfoFUCHSIA const &semaphoreGetZirconHandleInfoFUCHSIA) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreGetZirconHandleInfoFUCHSIA.sType);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreGetZirconHandleInfoFUCHSIA.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreGetZirconHandleInfoFUCHSIA.semaphore);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreGetZirconHandleInfoFUCHSIA.handleType);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_FUCHSIA*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo const &semaphoreSignalInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreSignalInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreSignalInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreSignalInfo.semaphore);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreSignalInfo.value);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfo const &semaphoreSubmitInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreSubmitInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreSubmitInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreSubmitInfo.semaphore);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreSubmitInfo.value);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreSubmitInfo.stageMask);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreSubmitInfo.deviceIndex);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SemaphoreTypeCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SemaphoreTypeCreateInfo const &semaphoreTypeCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreTypeCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreTypeCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreTypeCreateInfo.semaphoreType);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreTypeCreateInfo.initialValue);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SemaphoreWaitInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SemaphoreWaitInfo const &semaphoreWaitInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreWaitInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreWaitInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreWaitInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreWaitInfo.semaphoreCount);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreWaitInfo.pSemaphores);
		VULKAN_HPP_HASH_COMBINE(seed, semaphoreWaitInfo.pValues);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SetStateFlagsIndirectCommandNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SetStateFlagsIndirectCommandNV const &setStateFlagsIndirectCommandNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, setStateFlagsIndirectCommandNV.data);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ShaderModuleCreateInfo const &shaderModuleCreateInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, shaderModuleCreateInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, shaderModuleCreateInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, shaderModuleCreateInfo.flags);
		VULKAN_HPP_HASH_COMBINE(seed, shaderModuleCreateInfo.codeSize);
		VULKAN_HPP_HASH_COMBINE(seed, shaderModuleCreateInfo.pCode);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ShaderModuleValidationCacheCreateInfoEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::ShaderModuleValidationCacheCreateInfoEXT const &shaderModuleValidationCacheCreateInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, shaderModuleValidationCacheCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, shaderModuleValidationCacheCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, shaderModuleValidationCacheCreateInfoEXT.validationCache);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ShaderResourceUsageAMD>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ShaderResourceUsageAMD const &shaderResourceUsageAMD) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, shaderResourceUsageAMD.numUsedVgprs);
		VULKAN_HPP_HASH_COMBINE(seed, shaderResourceUsageAMD.numUsedSgprs);
		VULKAN_HPP_HASH_COMBINE(seed, shaderResourceUsageAMD.ldsSizePerLocalWorkGroup);
		VULKAN_HPP_HASH_COMBINE(seed, shaderResourceUsageAMD.ldsUsageSizeInBytes);
		VULKAN_HPP_HASH_COMBINE(seed, shaderResourceUsageAMD.scratchMemUsageInBytes);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ShaderStatisticsInfoAMD>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ShaderStatisticsInfoAMD const &shaderStatisticsInfoAMD) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, shaderStatisticsInfoAMD.shaderStageMask);
		VULKAN_HPP_HASH_COMBINE(seed, shaderStatisticsInfoAMD.resourceUsage);
		VULKAN_HPP_HASH_COMBINE(seed, shaderStatisticsInfoAMD.numPhysicalVgprs);
		VULKAN_HPP_HASH_COMBINE(seed, shaderStatisticsInfoAMD.numPhysicalSgprs);
		VULKAN_HPP_HASH_COMBINE(seed, shaderStatisticsInfoAMD.numAvailableVgprs);
		VULKAN_HPP_HASH_COMBINE(seed, shaderStatisticsInfoAMD.numAvailableSgprs);
		for(size_t i = 0; i < 3; ++i)
		{
			VULKAN_HPP_HASH_COMBINE(seed, shaderStatisticsInfoAMD.computeWorkGroupSize[i]);
		}
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SharedPresentSurfaceCapabilitiesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SharedPresentSurfaceCapabilitiesKHR const &sharedPresentSurfaceCapabilitiesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, sharedPresentSurfaceCapabilitiesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, sharedPresentSurfaceCapabilitiesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, sharedPresentSurfaceCapabilitiesKHR.sharedPresentSupportedUsageFlags);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SparseImageFormatProperties const &sparseImageFormatProperties) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageFormatProperties.aspectMask);
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageFormatProperties.imageGranularity);
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageFormatProperties.flags);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2 const &sparseImageFormatProperties2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageFormatProperties2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageFormatProperties2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageFormatProperties2.properties);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements const &sparseImageMemoryRequirements) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageMemoryRequirements.formatProperties);
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageMemoryRequirements.imageMipTailFirstLod);
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageMemoryRequirements.imageMipTailSize);
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageMemoryRequirements.imageMipTailOffset);
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageMemoryRequirements.imageMipTailStride);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2 const &sparseImageMemoryRequirements2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageMemoryRequirements2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageMemoryRequirements2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, sparseImageMemoryRequirements2.memoryRequirements);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_GGP)
template<>
struct hash<VULKAN_HPP_NAMESPACE::StreamDescriptorSurfaceCreateInfoGGP>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::StreamDescriptorSurfaceCreateInfoGGP const &streamDescriptorSurfaceCreateInfoGGP) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, streamDescriptorSurfaceCreateInfoGGP.sType);
		VULKAN_HPP_HASH_COMBINE(seed, streamDescriptorSurfaceCreateInfoGGP.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, streamDescriptorSurfaceCreateInfoGGP.flags);
		VULKAN_HPP_HASH_COMBINE(seed, streamDescriptorSurfaceCreateInfoGGP.streamDescriptor);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_GGP*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::StridedDeviceAddressRegionKHR const &stridedDeviceAddressRegionKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, stridedDeviceAddressRegionKHR.deviceAddress);
		VULKAN_HPP_HASH_COMBINE(seed, stridedDeviceAddressRegionKHR.stride);
		VULKAN_HPP_HASH_COMBINE(seed, stridedDeviceAddressRegionKHR.size);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SubmitInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SubmitInfo const &submitInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, submitInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, submitInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, submitInfo.waitSemaphoreCount);
		VULKAN_HPP_HASH_COMBINE(seed, submitInfo.pWaitSemaphores);
		VULKAN_HPP_HASH_COMBINE(seed, submitInfo.pWaitDstStageMask);
		VULKAN_HPP_HASH_COMBINE(seed, submitInfo.commandBufferCount);
		VULKAN_HPP_HASH_COMBINE(seed, submitInfo.pCommandBuffers);
		VULKAN_HPP_HASH_COMBINE(seed, submitInfo.signalSemaphoreCount);
		VULKAN_HPP_HASH_COMBINE(seed, submitInfo.pSignalSemaphores);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SubmitInfo2>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SubmitInfo2 const &submitInfo2) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, submitInfo2.sType);
		VULKAN_HPP_HASH_COMBINE(seed, submitInfo2.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, submitInfo2.flags);
		VULKAN_HPP_HASH_COMBINE(seed, submitInfo2.waitSemaphoreInfoCount);
		VULKAN_HPP_HASH_COMBINE(seed, submitInfo2.pWaitSemaphoreInfos);
		VULKAN_HPP_HASH_COMBINE(seed, submitInfo2.commandBufferInfoCount);
		VULKAN_HPP_HASH_COMBINE(seed, submitInfo2.pCommandBufferInfos);
		VULKAN_HPP_HASH_COMBINE(seed, submitInfo2.signalSemaphoreInfoCount);
		VULKAN_HPP_HASH_COMBINE(seed, submitInfo2.pSignalSemaphoreInfos);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SubpassBeginInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SubpassBeginInfo const &subpassBeginInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, subpassBeginInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, subpassBeginInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, subpassBeginInfo.contents);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SubpassDescriptionDepthStencilResolve>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::SubpassDescriptionDepthStencilResolve const &subpassDescriptionDepthStencilResolve) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescriptionDepthStencilResolve.sType);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescriptionDepthStencilResolve.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescriptionDepthStencilResolve.depthResolveMode);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescriptionDepthStencilResolve.stencilResolveMode);
		VULKAN_HPP_HASH_COMBINE(seed, subpassDescriptionDepthStencilResolve.pDepthStencilResolveAttachment);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SubpassEndInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SubpassEndInfo const &subpassEndInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, subpassEndInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, subpassEndInfo.pNext);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SubpassFragmentDensityMapOffsetEndInfoQCOM>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SubpassFragmentDensityMapOffsetEndInfoQCOM const &subpassFragmentDensityMapOffsetEndInfoQCOM) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, subpassFragmentDensityMapOffsetEndInfoQCOM.sType);
		VULKAN_HPP_HASH_COMBINE(seed, subpassFragmentDensityMapOffsetEndInfoQCOM.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, subpassFragmentDensityMapOffsetEndInfoQCOM.fragmentDensityOffsetCount);
		VULKAN_HPP_HASH_COMBINE(seed, subpassFragmentDensityMapOffsetEndInfoQCOM.pFragmentDensityOffsets);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SubpassShadingPipelineCreateInfoHUAWEI>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::SubpassShadingPipelineCreateInfoHUAWEI const &subpassShadingPipelineCreateInfoHUAWEI) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, subpassShadingPipelineCreateInfoHUAWEI.sType);
		VULKAN_HPP_HASH_COMBINE(seed, subpassShadingPipelineCreateInfoHUAWEI.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, subpassShadingPipelineCreateInfoHUAWEI.renderPass);
		VULKAN_HPP_HASH_COMBINE(seed, subpassShadingPipelineCreateInfoHUAWEI.subpass);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SurfaceCapabilities2EXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SurfaceCapabilities2EXT const &surfaceCapabilities2EXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilities2EXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilities2EXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilities2EXT.minImageCount);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilities2EXT.maxImageCount);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilities2EXT.currentExtent);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilities2EXT.minImageExtent);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilities2EXT.maxImageExtent);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilities2EXT.maxImageArrayLayers);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilities2EXT.supportedTransforms);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilities2EXT.currentTransform);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilities2EXT.supportedCompositeAlpha);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilities2EXT.supportedUsageFlags);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilities2EXT.supportedSurfaceCounters);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR const &surfaceCapabilitiesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilitiesKHR.minImageCount);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilitiesKHR.maxImageCount);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilitiesKHR.currentExtent);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilitiesKHR.minImageExtent);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilitiesKHR.maxImageExtent);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilitiesKHR.maxImageArrayLayers);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilitiesKHR.supportedTransforms);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilitiesKHR.currentTransform);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilitiesKHR.supportedCompositeAlpha);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilitiesKHR.supportedUsageFlags);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR const &surfaceCapabilities2KHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilities2KHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilities2KHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilities2KHR.surfaceCapabilities);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesFullScreenExclusiveEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesFullScreenExclusiveEXT const &surfaceCapabilitiesFullScreenExclusiveEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilitiesFullScreenExclusiveEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilitiesFullScreenExclusiveEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceCapabilitiesFullScreenExclusiveEXT.fullScreenExclusiveSupported);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::SurfaceFormatKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SurfaceFormatKHR const &surfaceFormatKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, surfaceFormatKHR.format);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceFormatKHR.colorSpace);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR const &surfaceFormat2KHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, surfaceFormat2KHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceFormat2KHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceFormat2KHR.surfaceFormat);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::SurfaceFullScreenExclusiveInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SurfaceFullScreenExclusiveInfoEXT const &surfaceFullScreenExclusiveInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, surfaceFullScreenExclusiveInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceFullScreenExclusiveInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceFullScreenExclusiveInfoEXT.fullScreenExclusive);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::SurfaceFullScreenExclusiveWin32InfoEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::SurfaceFullScreenExclusiveWin32InfoEXT const &surfaceFullScreenExclusiveWin32InfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, surfaceFullScreenExclusiveWin32InfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceFullScreenExclusiveWin32InfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceFullScreenExclusiveWin32InfoEXT.hmonitor);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::SurfaceProtectedCapabilitiesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SurfaceProtectedCapabilitiesKHR const &surfaceProtectedCapabilitiesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, surfaceProtectedCapabilitiesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceProtectedCapabilitiesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, surfaceProtectedCapabilitiesKHR.supportsProtected);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SwapchainCounterCreateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SwapchainCounterCreateInfoEXT const &swapchainCounterCreateInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, swapchainCounterCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, swapchainCounterCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, swapchainCounterCreateInfoEXT.surfaceCounters);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::SwapchainCreateInfoKHR const &swapchainCreateInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, swapchainCreateInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, swapchainCreateInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, swapchainCreateInfoKHR.flags);
		VULKAN_HPP_HASH_COMBINE(seed, swapchainCreateInfoKHR.surface);
		VULKAN_HPP_HASH_COMBINE(seed, swapchainCreateInfoKHR.minImageCount);
		VULKAN_HPP_HASH_COMBINE(seed, swapchainCreateInfoKHR.imageFormat);
		VULKAN_HPP_HASH_COMBINE(seed, swapchainCreateInfoKHR.imageColorSpace);
		VULKAN_HPP_HASH_COMBINE(seed, swapchainCreateInfoKHR.imageExtent);
		VULKAN_HPP_HASH_COMBINE(seed, swapchainCreateInfoKHR.imageArrayLayers);
		VULKAN_HPP_HASH_COMBINE(seed, swapchainCreateInfoKHR.imageUsage);
		VULKAN_HPP_HASH_COMBINE(seed, swapchainCreateInfoKHR.imageSharingMode);
		VULKAN_HPP_HASH_COMBINE(seed, swapchainCreateInfoKHR.queueFamilyIndexCount);
		VULKAN_HPP_HASH_COMBINE(seed, swapchainCreateInfoKHR.pQueueFamilyIndices);
		VULKAN_HPP_HASH_COMBINE(seed, swapchainCreateInfoKHR.preTransform);
		VULKAN_HPP_HASH_COMBINE(seed, swapchainCreateInfoKHR.compositeAlpha);
		VULKAN_HPP_HASH_COMBINE(seed, swapchainCreateInfoKHR.presentMode);
		VULKAN_HPP_HASH_COMBINE(seed, swapchainCreateInfoKHR.clipped);
		VULKAN_HPP_HASH_COMBINE(seed, swapchainCreateInfoKHR.oldSwapchain);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::SwapchainDisplayNativeHdrCreateInfoAMD>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::SwapchainDisplayNativeHdrCreateInfoAMD const &swapchainDisplayNativeHdrCreateInfoAMD) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, swapchainDisplayNativeHdrCreateInfoAMD.sType);
		VULKAN_HPP_HASH_COMBINE(seed, swapchainDisplayNativeHdrCreateInfoAMD.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, swapchainDisplayNativeHdrCreateInfoAMD.localDimmingEnable);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::TextureLODGatherFormatPropertiesAMD>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::TextureLODGatherFormatPropertiesAMD const &textureLODGatherFormatPropertiesAMD) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, textureLODGatherFormatPropertiesAMD.sType);
		VULKAN_HPP_HASH_COMBINE(seed, textureLODGatherFormatPropertiesAMD.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, textureLODGatherFormatPropertiesAMD.supportsTextureGatherLODBiasAMD);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::TimelineSemaphoreSubmitInfo>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::TimelineSemaphoreSubmitInfo const &timelineSemaphoreSubmitInfo) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, timelineSemaphoreSubmitInfo.sType);
		VULKAN_HPP_HASH_COMBINE(seed, timelineSemaphoreSubmitInfo.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, timelineSemaphoreSubmitInfo.waitSemaphoreValueCount);
		VULKAN_HPP_HASH_COMBINE(seed, timelineSemaphoreSubmitInfo.pWaitSemaphoreValues);
		VULKAN_HPP_HASH_COMBINE(seed, timelineSemaphoreSubmitInfo.signalSemaphoreValueCount);
		VULKAN_HPP_HASH_COMBINE(seed, timelineSemaphoreSubmitInfo.pSignalSemaphoreValues);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::TraceRaysIndirectCommandKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::TraceRaysIndirectCommandKHR const &traceRaysIndirectCommandKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, traceRaysIndirectCommandKHR.width);
		VULKAN_HPP_HASH_COMBINE(seed, traceRaysIndirectCommandKHR.height);
		VULKAN_HPP_HASH_COMBINE(seed, traceRaysIndirectCommandKHR.depth);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ValidationCacheCreateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ValidationCacheCreateInfoEXT const &validationCacheCreateInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, validationCacheCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, validationCacheCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, validationCacheCreateInfoEXT.flags);
		VULKAN_HPP_HASH_COMBINE(seed, validationCacheCreateInfoEXT.initialDataSize);
		VULKAN_HPP_HASH_COMBINE(seed, validationCacheCreateInfoEXT.pInitialData);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ValidationFeaturesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ValidationFeaturesEXT const &validationFeaturesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, validationFeaturesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, validationFeaturesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, validationFeaturesEXT.enabledValidationFeatureCount);
		VULKAN_HPP_HASH_COMBINE(seed, validationFeaturesEXT.pEnabledValidationFeatures);
		VULKAN_HPP_HASH_COMBINE(seed, validationFeaturesEXT.disabledValidationFeatureCount);
		VULKAN_HPP_HASH_COMBINE(seed, validationFeaturesEXT.pDisabledValidationFeatures);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::ValidationFlagsEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ValidationFlagsEXT const &validationFlagsEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, validationFlagsEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, validationFlagsEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, validationFlagsEXT.disabledValidationCheckCount);
		VULKAN_HPP_HASH_COMBINE(seed, validationFlagsEXT.pDisabledValidationChecks);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription2EXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription2EXT const &vertexInputAttributeDescription2EXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, vertexInputAttributeDescription2EXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, vertexInputAttributeDescription2EXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, vertexInputAttributeDescription2EXT.location);
		VULKAN_HPP_HASH_COMBINE(seed, vertexInputAttributeDescription2EXT.binding);
		VULKAN_HPP_HASH_COMBINE(seed, vertexInputAttributeDescription2EXT.format);
		VULKAN_HPP_HASH_COMBINE(seed, vertexInputAttributeDescription2EXT.offset);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::VertexInputBindingDescription2EXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VertexInputBindingDescription2EXT const &vertexInputBindingDescription2EXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, vertexInputBindingDescription2EXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, vertexInputBindingDescription2EXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, vertexInputBindingDescription2EXT.binding);
		VULKAN_HPP_HASH_COMBINE(seed, vertexInputBindingDescription2EXT.stride);
		VULKAN_HPP_HASH_COMBINE(seed, vertexInputBindingDescription2EXT.inputRate);
		VULKAN_HPP_HASH_COMBINE(seed, vertexInputBindingDescription2EXT.divisor);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_VI_NN)
template<>
struct hash<VULKAN_HPP_NAMESPACE::ViSurfaceCreateInfoNN>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::ViSurfaceCreateInfoNN const &viSurfaceCreateInfoNN) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, viSurfaceCreateInfoNN.sType);
		VULKAN_HPP_HASH_COMBINE(seed, viSurfaceCreateInfoNN.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, viSurfaceCreateInfoNN.flags);
		VULKAN_HPP_HASH_COMBINE(seed, viSurfaceCreateInfoNN.window);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_VI_NN*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoPictureResourceKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoPictureResourceKHR const &videoPictureResourceKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoPictureResourceKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoPictureResourceKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoPictureResourceKHR.codedOffset);
		VULKAN_HPP_HASH_COMBINE(seed, videoPictureResourceKHR.codedExtent);
		VULKAN_HPP_HASH_COMBINE(seed, videoPictureResourceKHR.baseArrayLayer);
		VULKAN_HPP_HASH_COMBINE(seed, videoPictureResourceKHR.imageViewBinding);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoReferenceSlotKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoReferenceSlotKHR const &videoReferenceSlotKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoReferenceSlotKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoReferenceSlotKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoReferenceSlotKHR.slotIndex);
		VULKAN_HPP_HASH_COMBINE(seed, videoReferenceSlotKHR.pPictureResource);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoBeginCodingInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoBeginCodingInfoKHR const &videoBeginCodingInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoBeginCodingInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoBeginCodingInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoBeginCodingInfoKHR.flags);
		VULKAN_HPP_HASH_COMBINE(seed, videoBeginCodingInfoKHR.codecQualityPreset);
		VULKAN_HPP_HASH_COMBINE(seed, videoBeginCodingInfoKHR.videoSession);
		VULKAN_HPP_HASH_COMBINE(seed, videoBeginCodingInfoKHR.videoSessionParameters);
		VULKAN_HPP_HASH_COMBINE(seed, videoBeginCodingInfoKHR.referenceSlotCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoBeginCodingInfoKHR.pReferenceSlots);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoBindMemoryKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoBindMemoryKHR const &videoBindMemoryKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoBindMemoryKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoBindMemoryKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoBindMemoryKHR.memoryBindIndex);
		VULKAN_HPP_HASH_COMBINE(seed, videoBindMemoryKHR.memory);
		VULKAN_HPP_HASH_COMBINE(seed, videoBindMemoryKHR.memoryOffset);
		VULKAN_HPP_HASH_COMBINE(seed, videoBindMemoryKHR.memorySize);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR const &videoCapabilitiesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoCapabilitiesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoCapabilitiesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoCapabilitiesKHR.capabilityFlags);
		VULKAN_HPP_HASH_COMBINE(seed, videoCapabilitiesKHR.minBitstreamBufferOffsetAlignment);
		VULKAN_HPP_HASH_COMBINE(seed, videoCapabilitiesKHR.minBitstreamBufferSizeAlignment);
		VULKAN_HPP_HASH_COMBINE(seed, videoCapabilitiesKHR.videoPictureExtentGranularity);
		VULKAN_HPP_HASH_COMBINE(seed, videoCapabilitiesKHR.minExtent);
		VULKAN_HPP_HASH_COMBINE(seed, videoCapabilitiesKHR.maxExtent);
		VULKAN_HPP_HASH_COMBINE(seed, videoCapabilitiesKHR.maxReferencePicturesSlotsCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoCapabilitiesKHR.maxReferencePicturesActiveCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoCapabilitiesKHR.stdHeaderVersion);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoCodingControlInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoCodingControlInfoKHR const &videoCodingControlInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoCodingControlInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoCodingControlInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoCodingControlInfoKHR.flags);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeCapabilitiesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoDecodeCapabilitiesKHR const &videoDecodeCapabilitiesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeCapabilitiesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeCapabilitiesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeCapabilitiesKHR.flags);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH264CapabilitiesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoDecodeH264CapabilitiesEXT const &videoDecodeH264CapabilitiesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264CapabilitiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264CapabilitiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264CapabilitiesEXT.maxLevel);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264CapabilitiesEXT.fieldOffsetGranularity);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH264DpbSlotInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoDecodeH264DpbSlotInfoEXT const &videoDecodeH264DpbSlotInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264DpbSlotInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264DpbSlotInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264DpbSlotInfoEXT.pStdReferenceInfo);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH264MvcEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoDecodeH264MvcEXT const &videoDecodeH264MvcEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264MvcEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264MvcEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264MvcEXT.pStdMvc);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH264PictureInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoDecodeH264PictureInfoEXT const &videoDecodeH264PictureInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264PictureInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264PictureInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264PictureInfoEXT.pStdPictureInfo);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264PictureInfoEXT.slicesCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264PictureInfoEXT.pSlicesDataOffsets);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH264ProfileEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoDecodeH264ProfileEXT const &videoDecodeH264ProfileEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264ProfileEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264ProfileEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264ProfileEXT.stdProfileIdc);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264ProfileEXT.pictureLayout);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH264SessionParametersAddInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoDecodeH264SessionParametersAddInfoEXT const &videoDecodeH264SessionParametersAddInfoEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264SessionParametersAddInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264SessionParametersAddInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264SessionParametersAddInfoEXT.spsStdCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264SessionParametersAddInfoEXT.pSpsStd);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264SessionParametersAddInfoEXT.ppsStdCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264SessionParametersAddInfoEXT.pPpsStd);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH264SessionParametersCreateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoDecodeH264SessionParametersCreateInfoEXT const &videoDecodeH264SessionParametersCreateInfoEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264SessionParametersCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264SessionParametersCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264SessionParametersCreateInfoEXT.maxSpsStdCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264SessionParametersCreateInfoEXT.maxPpsStdCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH264SessionParametersCreateInfoEXT.pParametersAddInfo);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH265CapabilitiesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoDecodeH265CapabilitiesEXT const &videoDecodeH265CapabilitiesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265CapabilitiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265CapabilitiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265CapabilitiesEXT.maxLevel);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH265DpbSlotInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoDecodeH265DpbSlotInfoEXT const &videoDecodeH265DpbSlotInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265DpbSlotInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265DpbSlotInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265DpbSlotInfoEXT.pStdReferenceInfo);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH265PictureInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoDecodeH265PictureInfoEXT const &videoDecodeH265PictureInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265PictureInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265PictureInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265PictureInfoEXT.pStdPictureInfo);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265PictureInfoEXT.slicesCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265PictureInfoEXT.pSlicesDataOffsets);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH265ProfileEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoDecodeH265ProfileEXT const &videoDecodeH265ProfileEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265ProfileEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265ProfileEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265ProfileEXT.stdProfileIdc);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH265SessionParametersAddInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoDecodeH265SessionParametersAddInfoEXT const &videoDecodeH265SessionParametersAddInfoEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265SessionParametersAddInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265SessionParametersAddInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265SessionParametersAddInfoEXT.vpsStdCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265SessionParametersAddInfoEXT.pVpsStd);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265SessionParametersAddInfoEXT.spsStdCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265SessionParametersAddInfoEXT.pSpsStd);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265SessionParametersAddInfoEXT.ppsStdCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265SessionParametersAddInfoEXT.pPpsStd);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeH265SessionParametersCreateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoDecodeH265SessionParametersCreateInfoEXT const &videoDecodeH265SessionParametersCreateInfoEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265SessionParametersCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265SessionParametersCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265SessionParametersCreateInfoEXT.maxVpsStdCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265SessionParametersCreateInfoEXT.maxSpsStdCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265SessionParametersCreateInfoEXT.maxPpsStdCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeH265SessionParametersCreateInfoEXT.pParametersAddInfo);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoDecodeInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoDecodeInfoKHR const &videoDecodeInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeInfoKHR.flags);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeInfoKHR.srcBuffer);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeInfoKHR.srcBufferOffset);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeInfoKHR.srcBufferRange);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeInfoKHR.dstPictureResource);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeInfoKHR.pSetupReferenceSlot);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeInfoKHR.referenceSlotCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoDecodeInfoKHR.pReferenceSlots);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeCapabilitiesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeCapabilitiesKHR const &videoEncodeCapabilitiesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeCapabilitiesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeCapabilitiesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeCapabilitiesKHR.flags);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeCapabilitiesKHR.rateControlModes);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeCapabilitiesKHR.rateControlLayerCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeCapabilitiesKHR.qualityLevelCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeCapabilitiesKHR.inputImageDataFillAlignment);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264CapabilitiesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH264CapabilitiesEXT const &videoEncodeH264CapabilitiesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264CapabilitiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264CapabilitiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264CapabilitiesEXT.flags);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264CapabilitiesEXT.inputModeFlags);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264CapabilitiesEXT.outputModeFlags);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264CapabilitiesEXT.maxPPictureL0ReferenceCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264CapabilitiesEXT.maxBPictureL0ReferenceCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264CapabilitiesEXT.maxL1ReferenceCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264CapabilitiesEXT.motionVectorsOverPicBoundariesFlag);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264CapabilitiesEXT.maxBytesPerPicDenom);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264CapabilitiesEXT.maxBitsPerMbDenom);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264CapabilitiesEXT.log2MaxMvLengthHorizontal);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264CapabilitiesEXT.log2MaxMvLengthVertical);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264DpbSlotInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH264DpbSlotInfoEXT const &videoEncodeH264DpbSlotInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264DpbSlotInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264DpbSlotInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264DpbSlotInfoEXT.slotIndex);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264DpbSlotInfoEXT.pStdReferenceInfo);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264EmitPictureParametersEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH264EmitPictureParametersEXT const &videoEncodeH264EmitPictureParametersEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264EmitPictureParametersEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264EmitPictureParametersEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264EmitPictureParametersEXT.spsId);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264EmitPictureParametersEXT.emitSpsEnable);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264EmitPictureParametersEXT.ppsIdEntryCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264EmitPictureParametersEXT.ppsIdEntries);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264FrameSizeEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH264FrameSizeEXT const &videoEncodeH264FrameSizeEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264FrameSizeEXT.frameISize);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264FrameSizeEXT.framePSize);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264FrameSizeEXT.frameBSize);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264ReferenceListsEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH264ReferenceListsEXT const &videoEncodeH264ReferenceListsEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264ReferenceListsEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264ReferenceListsEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264ReferenceListsEXT.referenceList0EntryCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264ReferenceListsEXT.pReferenceList0Entries);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264ReferenceListsEXT.referenceList1EntryCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264ReferenceListsEXT.pReferenceList1Entries);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264ReferenceListsEXT.pMemMgmtCtrlOperations);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264NaluSliceEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH264NaluSliceEXT const &videoEncodeH264NaluSliceEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264NaluSliceEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264NaluSliceEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264NaluSliceEXT.mbCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264NaluSliceEXT.pReferenceFinalLists);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264NaluSliceEXT.pSliceHeaderStd);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264ProfileEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH264ProfileEXT const &videoEncodeH264ProfileEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264ProfileEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264ProfileEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264ProfileEXT.stdProfileIdc);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264QpEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH264QpEXT const &videoEncodeH264QpEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264QpEXT.qpI);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264QpEXT.qpP);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264QpEXT.qpB);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264RateControlInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH264RateControlInfoEXT const &videoEncodeH264RateControlInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264RateControlInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264RateControlInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264RateControlInfoEXT.gopFrameCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264RateControlInfoEXT.idrPeriod);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264RateControlInfoEXT.consecutiveBFrameCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264RateControlInfoEXT.rateControlStructure);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264RateControlInfoEXT.temporalLayerCount);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264RateControlLayerInfoEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH264RateControlLayerInfoEXT const &videoEncodeH264RateControlLayerInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264RateControlLayerInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264RateControlLayerInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264RateControlLayerInfoEXT.temporalLayerId);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264RateControlLayerInfoEXT.useInitialRcQp);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264RateControlLayerInfoEXT.initialRcQp);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264RateControlLayerInfoEXT.useMinQp);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264RateControlLayerInfoEXT.minQp);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264RateControlLayerInfoEXT.useMaxQp);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264RateControlLayerInfoEXT.maxQp);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264RateControlLayerInfoEXT.useMaxFrameSize);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264RateControlLayerInfoEXT.maxFrameSize);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersAddInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersAddInfoEXT const &videoEncodeH264SessionParametersAddInfoEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264SessionParametersAddInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264SessionParametersAddInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264SessionParametersAddInfoEXT.spsStdCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264SessionParametersAddInfoEXT.pSpsStd);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264SessionParametersAddInfoEXT.ppsStdCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264SessionParametersAddInfoEXT.pPpsStd);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersCreateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH264SessionParametersCreateInfoEXT const &videoEncodeH264SessionParametersCreateInfoEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264SessionParametersCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264SessionParametersCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264SessionParametersCreateInfoEXT.maxSpsStdCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264SessionParametersCreateInfoEXT.maxPpsStdCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264SessionParametersCreateInfoEXT.pParametersAddInfo);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH264VclFrameInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH264VclFrameInfoEXT const &videoEncodeH264VclFrameInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264VclFrameInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264VclFrameInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264VclFrameInfoEXT.pReferenceFinalLists);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264VclFrameInfoEXT.naluSliceEntryCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264VclFrameInfoEXT.pNaluSliceEntries);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH264VclFrameInfoEXT.pCurrentPictureInfo);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265CapabilitiesEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH265CapabilitiesEXT const &videoEncodeH265CapabilitiesEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265CapabilitiesEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265CapabilitiesEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265CapabilitiesEXT.flags);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265CapabilitiesEXT.inputModeFlags);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265CapabilitiesEXT.outputModeFlags);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265CapabilitiesEXT.ctbSizes);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265CapabilitiesEXT.transformBlockSizes);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265CapabilitiesEXT.maxPPictureL0ReferenceCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265CapabilitiesEXT.maxBPictureL0ReferenceCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265CapabilitiesEXT.maxL1ReferenceCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265CapabilitiesEXT.maxSubLayersCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265CapabilitiesEXT.minLog2MinLumaCodingBlockSizeMinus3);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265CapabilitiesEXT.maxLog2MinLumaCodingBlockSizeMinus3);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265CapabilitiesEXT.minLog2MinLumaTransformBlockSizeMinus2);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265CapabilitiesEXT.maxLog2MinLumaTransformBlockSizeMinus2);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265CapabilitiesEXT.minMaxTransformHierarchyDepthInter);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265CapabilitiesEXT.maxMaxTransformHierarchyDepthInter);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265CapabilitiesEXT.minMaxTransformHierarchyDepthIntra);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265CapabilitiesEXT.maxMaxTransformHierarchyDepthIntra);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265CapabilitiesEXT.maxDiffCuQpDeltaDepth);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265CapabilitiesEXT.minMaxNumMergeCand);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265CapabilitiesEXT.maxMaxNumMergeCand);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265DpbSlotInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH265DpbSlotInfoEXT const &videoEncodeH265DpbSlotInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265DpbSlotInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265DpbSlotInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265DpbSlotInfoEXT.slotIndex);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265DpbSlotInfoEXT.pStdReferenceInfo);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265EmitPictureParametersEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH265EmitPictureParametersEXT const &videoEncodeH265EmitPictureParametersEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265EmitPictureParametersEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265EmitPictureParametersEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265EmitPictureParametersEXT.vpsId);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265EmitPictureParametersEXT.spsId);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265EmitPictureParametersEXT.emitVpsEnable);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265EmitPictureParametersEXT.emitSpsEnable);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265EmitPictureParametersEXT.ppsIdEntryCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265EmitPictureParametersEXT.ppsIdEntries);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265FrameSizeEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH265FrameSizeEXT const &videoEncodeH265FrameSizeEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265FrameSizeEXT.frameISize);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265FrameSizeEXT.framePSize);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265FrameSizeEXT.frameBSize);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265ReferenceListsEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH265ReferenceListsEXT const &videoEncodeH265ReferenceListsEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265ReferenceListsEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265ReferenceListsEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265ReferenceListsEXT.referenceList0EntryCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265ReferenceListsEXT.pReferenceList0Entries);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265ReferenceListsEXT.referenceList1EntryCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265ReferenceListsEXT.pReferenceList1Entries);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265ReferenceListsEXT.pReferenceModifications);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265NaluSliceSegmentEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH265NaluSliceSegmentEXT const &videoEncodeH265NaluSliceSegmentEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265NaluSliceSegmentEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265NaluSliceSegmentEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265NaluSliceSegmentEXT.ctbCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265NaluSliceSegmentEXT.pReferenceFinalLists);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265NaluSliceSegmentEXT.pSliceSegmentHeaderStd);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265ProfileEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH265ProfileEXT const &videoEncodeH265ProfileEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265ProfileEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265ProfileEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265ProfileEXT.stdProfileIdc);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265QpEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH265QpEXT const &videoEncodeH265QpEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265QpEXT.qpI);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265QpEXT.qpP);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265QpEXT.qpB);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265RateControlInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH265RateControlInfoEXT const &videoEncodeH265RateControlInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265RateControlInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265RateControlInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265RateControlInfoEXT.gopFrameCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265RateControlInfoEXT.idrPeriod);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265RateControlInfoEXT.consecutiveBFrameCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265RateControlInfoEXT.rateControlStructure);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265RateControlInfoEXT.subLayerCount);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265RateControlLayerInfoEXT>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH265RateControlLayerInfoEXT const &videoEncodeH265RateControlLayerInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265RateControlLayerInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265RateControlLayerInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265RateControlLayerInfoEXT.temporalId);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265RateControlLayerInfoEXT.useInitialRcQp);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265RateControlLayerInfoEXT.initialRcQp);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265RateControlLayerInfoEXT.useMinQp);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265RateControlLayerInfoEXT.minQp);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265RateControlLayerInfoEXT.useMaxQp);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265RateControlLayerInfoEXT.maxQp);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265RateControlLayerInfoEXT.useMaxFrameSize);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265RateControlLayerInfoEXT.maxFrameSize);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersAddInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersAddInfoEXT const &videoEncodeH265SessionParametersAddInfoEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265SessionParametersAddInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265SessionParametersAddInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265SessionParametersAddInfoEXT.vpsStdCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265SessionParametersAddInfoEXT.pVpsStd);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265SessionParametersAddInfoEXT.spsStdCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265SessionParametersAddInfoEXT.pSpsStd);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265SessionParametersAddInfoEXT.ppsStdCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265SessionParametersAddInfoEXT.pPpsStd);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersCreateInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH265SessionParametersCreateInfoEXT const &videoEncodeH265SessionParametersCreateInfoEXT) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265SessionParametersCreateInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265SessionParametersCreateInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265SessionParametersCreateInfoEXT.maxVpsStdCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265SessionParametersCreateInfoEXT.maxSpsStdCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265SessionParametersCreateInfoEXT.maxPpsStdCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265SessionParametersCreateInfoEXT.pParametersAddInfo);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeH265VclFrameInfoEXT>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeH265VclFrameInfoEXT const &videoEncodeH265VclFrameInfoEXT) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265VclFrameInfoEXT.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265VclFrameInfoEXT.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265VclFrameInfoEXT.pReferenceFinalLists);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265VclFrameInfoEXT.naluSliceSegmentEntryCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265VclFrameInfoEXT.pNaluSliceSegmentEntries);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeH265VclFrameInfoEXT.pCurrentPictureInfo);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeInfoKHR const &videoEncodeInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeInfoKHR.flags);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeInfoKHR.qualityLevel);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeInfoKHR.dstBitstreamBuffer);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeInfoKHR.dstBitstreamBufferOffset);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeInfoKHR.dstBitstreamBufferMaxRange);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeInfoKHR.srcPictureResource);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeInfoKHR.pSetupReferenceSlot);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeInfoKHR.referenceSlotCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeInfoKHR.pReferenceSlots);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeInfoKHR.precedingExternallyEncodedBytes);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeRateControlLayerInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeRateControlLayerInfoKHR const &videoEncodeRateControlLayerInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeRateControlLayerInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeRateControlLayerInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeRateControlLayerInfoKHR.averageBitrate);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeRateControlLayerInfoKHR.maxBitrate);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeRateControlLayerInfoKHR.frameRateNumerator);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeRateControlLayerInfoKHR.frameRateDenominator);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeRateControlLayerInfoKHR.virtualBufferSizeInMs);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeRateControlLayerInfoKHR.initialVirtualBufferSizeInMs);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEncodeRateControlInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEncodeRateControlInfoKHR const &videoEncodeRateControlInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeRateControlInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeRateControlInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeRateControlInfoKHR.flags);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeRateControlInfoKHR.rateControlMode);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeRateControlInfoKHR.layerCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoEncodeRateControlInfoKHR.pLayerConfigs);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoEndCodingInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoEndCodingInfoKHR const &videoEndCodingInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoEndCodingInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoEndCodingInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoEndCodingInfoKHR.flags);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR const &videoFormatPropertiesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoFormatPropertiesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoFormatPropertiesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoFormatPropertiesKHR.format);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoGetMemoryPropertiesKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoGetMemoryPropertiesKHR const &videoGetMemoryPropertiesKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoGetMemoryPropertiesKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoGetMemoryPropertiesKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoGetMemoryPropertiesKHR.memoryBindIndex);
		VULKAN_HPP_HASH_COMBINE(seed, videoGetMemoryPropertiesKHR.pMemoryRequirements);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoQueueFamilyProperties2KHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoQueueFamilyProperties2KHR const &videoQueueFamilyProperties2KHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoQueueFamilyProperties2KHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoQueueFamilyProperties2KHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoQueueFamilyProperties2KHR.videoCodecOperations);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoSessionCreateInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoSessionCreateInfoKHR const &videoSessionCreateInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoSessionCreateInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoSessionCreateInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoSessionCreateInfoKHR.queueFamilyIndex);
		VULKAN_HPP_HASH_COMBINE(seed, videoSessionCreateInfoKHR.flags);
		VULKAN_HPP_HASH_COMBINE(seed, videoSessionCreateInfoKHR.pVideoProfile);
		VULKAN_HPP_HASH_COMBINE(seed, videoSessionCreateInfoKHR.pictureFormat);
		VULKAN_HPP_HASH_COMBINE(seed, videoSessionCreateInfoKHR.maxCodedExtent);
		VULKAN_HPP_HASH_COMBINE(seed, videoSessionCreateInfoKHR.referencePicturesFormat);
		VULKAN_HPP_HASH_COMBINE(seed, videoSessionCreateInfoKHR.maxReferencePicturesSlotsCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoSessionCreateInfoKHR.maxReferencePicturesActiveCount);
		VULKAN_HPP_HASH_COMBINE(seed, videoSessionCreateInfoKHR.pStdHeaderVersion);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoSessionParametersCreateInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoSessionParametersCreateInfoKHR const &videoSessionParametersCreateInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoSessionParametersCreateInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoSessionParametersCreateInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoSessionParametersCreateInfoKHR.videoSessionParametersTemplate);
		VULKAN_HPP_HASH_COMBINE(seed, videoSessionParametersCreateInfoKHR.videoSession);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_ENABLE_BETA_EXTENSIONS)
template<>
struct hash<VULKAN_HPP_NAMESPACE::VideoSessionParametersUpdateInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::VideoSessionParametersUpdateInfoKHR const &videoSessionParametersUpdateInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, videoSessionParametersUpdateInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, videoSessionParametersUpdateInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, videoSessionParametersUpdateInfoKHR.updateSequenceCount);
		return seed;
	}
};
#	endif /*VK_ENABLE_BETA_EXTENSIONS*/

#	if defined(VK_USE_PLATFORM_WAYLAND_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::WaylandSurfaceCreateInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::WaylandSurfaceCreateInfoKHR const &waylandSurfaceCreateInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, waylandSurfaceCreateInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, waylandSurfaceCreateInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, waylandSurfaceCreateInfoKHR.flags);
		VULKAN_HPP_HASH_COMBINE(seed, waylandSurfaceCreateInfoKHR.display);
		VULKAN_HPP_HASH_COMBINE(seed, waylandSurfaceCreateInfoKHR.surface);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_WAYLAND_KHR*/

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::Win32KeyedMutexAcquireReleaseInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::Win32KeyedMutexAcquireReleaseInfoKHR const &win32KeyedMutexAcquireReleaseInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, win32KeyedMutexAcquireReleaseInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, win32KeyedMutexAcquireReleaseInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, win32KeyedMutexAcquireReleaseInfoKHR.acquireCount);
		VULKAN_HPP_HASH_COMBINE(seed, win32KeyedMutexAcquireReleaseInfoKHR.pAcquireSyncs);
		VULKAN_HPP_HASH_COMBINE(seed, win32KeyedMutexAcquireReleaseInfoKHR.pAcquireKeys);
		VULKAN_HPP_HASH_COMBINE(seed, win32KeyedMutexAcquireReleaseInfoKHR.pAcquireTimeouts);
		VULKAN_HPP_HASH_COMBINE(seed, win32KeyedMutexAcquireReleaseInfoKHR.releaseCount);
		VULKAN_HPP_HASH_COMBINE(seed, win32KeyedMutexAcquireReleaseInfoKHR.pReleaseSyncs);
		VULKAN_HPP_HASH_COMBINE(seed, win32KeyedMutexAcquireReleaseInfoKHR.pReleaseKeys);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::Win32KeyedMutexAcquireReleaseInfoNV>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::Win32KeyedMutexAcquireReleaseInfoNV const &win32KeyedMutexAcquireReleaseInfoNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, win32KeyedMutexAcquireReleaseInfoNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, win32KeyedMutexAcquireReleaseInfoNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, win32KeyedMutexAcquireReleaseInfoNV.acquireCount);
		VULKAN_HPP_HASH_COMBINE(seed, win32KeyedMutexAcquireReleaseInfoNV.pAcquireSyncs);
		VULKAN_HPP_HASH_COMBINE(seed, win32KeyedMutexAcquireReleaseInfoNV.pAcquireKeys);
		VULKAN_HPP_HASH_COMBINE(seed, win32KeyedMutexAcquireReleaseInfoNV.pAcquireTimeoutMilliseconds);
		VULKAN_HPP_HASH_COMBINE(seed, win32KeyedMutexAcquireReleaseInfoNV.releaseCount);
		VULKAN_HPP_HASH_COMBINE(seed, win32KeyedMutexAcquireReleaseInfoNV.pReleaseSyncs);
		VULKAN_HPP_HASH_COMBINE(seed, win32KeyedMutexAcquireReleaseInfoNV.pReleaseKeys);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

#	if defined(VK_USE_PLATFORM_WIN32_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::Win32SurfaceCreateInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::Win32SurfaceCreateInfoKHR const &win32SurfaceCreateInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, win32SurfaceCreateInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, win32SurfaceCreateInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, win32SurfaceCreateInfoKHR.flags);
		VULKAN_HPP_HASH_COMBINE(seed, win32SurfaceCreateInfoKHR.hinstance);
		VULKAN_HPP_HASH_COMBINE(seed, win32SurfaceCreateInfoKHR.hwnd);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_WIN32_KHR*/

template<>
struct hash<VULKAN_HPP_NAMESPACE::WriteDescriptorSet>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::WriteDescriptorSet const &writeDescriptorSet) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, writeDescriptorSet.sType);
		VULKAN_HPP_HASH_COMBINE(seed, writeDescriptorSet.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, writeDescriptorSet.dstSet);
		VULKAN_HPP_HASH_COMBINE(seed, writeDescriptorSet.dstBinding);
		VULKAN_HPP_HASH_COMBINE(seed, writeDescriptorSet.dstArrayElement);
		VULKAN_HPP_HASH_COMBINE(seed, writeDescriptorSet.descriptorCount);
		VULKAN_HPP_HASH_COMBINE(seed, writeDescriptorSet.descriptorType);
		VULKAN_HPP_HASH_COMBINE(seed, writeDescriptorSet.pImageInfo);
		VULKAN_HPP_HASH_COMBINE(seed, writeDescriptorSet.pBufferInfo);
		VULKAN_HPP_HASH_COMBINE(seed, writeDescriptorSet.pTexelBufferView);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::WriteDescriptorSetAccelerationStructureKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::WriteDescriptorSetAccelerationStructureKHR const &writeDescriptorSetAccelerationStructureKHR) const
	    VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, writeDescriptorSetAccelerationStructureKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, writeDescriptorSetAccelerationStructureKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, writeDescriptorSetAccelerationStructureKHR.accelerationStructureCount);
		VULKAN_HPP_HASH_COMBINE(seed, writeDescriptorSetAccelerationStructureKHR.pAccelerationStructures);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::WriteDescriptorSetAccelerationStructureNV>
{
	std::size_t
	operator()(VULKAN_HPP_NAMESPACE::WriteDescriptorSetAccelerationStructureNV const &writeDescriptorSetAccelerationStructureNV) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, writeDescriptorSetAccelerationStructureNV.sType);
		VULKAN_HPP_HASH_COMBINE(seed, writeDescriptorSetAccelerationStructureNV.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, writeDescriptorSetAccelerationStructureNV.accelerationStructureCount);
		VULKAN_HPP_HASH_COMBINE(seed, writeDescriptorSetAccelerationStructureNV.pAccelerationStructures);
		return seed;
	}
};

template<>
struct hash<VULKAN_HPP_NAMESPACE::WriteDescriptorSetInlineUniformBlock>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::WriteDescriptorSetInlineUniformBlock const &writeDescriptorSetInlineUniformBlock) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, writeDescriptorSetInlineUniformBlock.sType);
		VULKAN_HPP_HASH_COMBINE(seed, writeDescriptorSetInlineUniformBlock.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, writeDescriptorSetInlineUniformBlock.dataSize);
		VULKAN_HPP_HASH_COMBINE(seed, writeDescriptorSetInlineUniformBlock.pData);
		return seed;
	}
};

#	if defined(VK_USE_PLATFORM_XCB_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::XcbSurfaceCreateInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::XcbSurfaceCreateInfoKHR const &xcbSurfaceCreateInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, xcbSurfaceCreateInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, xcbSurfaceCreateInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, xcbSurfaceCreateInfoKHR.flags);
		VULKAN_HPP_HASH_COMBINE(seed, xcbSurfaceCreateInfoKHR.connection);
		VULKAN_HPP_HASH_COMBINE(seed, xcbSurfaceCreateInfoKHR.window);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_XCB_KHR*/

#	if defined(VK_USE_PLATFORM_XLIB_KHR)
template<>
struct hash<VULKAN_HPP_NAMESPACE::XlibSurfaceCreateInfoKHR>
{
	std::size_t operator()(VULKAN_HPP_NAMESPACE::XlibSurfaceCreateInfoKHR const &xlibSurfaceCreateInfoKHR) const VULKAN_HPP_NOEXCEPT
	{
		std::size_t seed = 0;
		VULKAN_HPP_HASH_COMBINE(seed, xlibSurfaceCreateInfoKHR.sType);
		VULKAN_HPP_HASH_COMBINE(seed, xlibSurfaceCreateInfoKHR.pNext);
		VULKAN_HPP_HASH_COMBINE(seed, xlibSurfaceCreateInfoKHR.flags);
		VULKAN_HPP_HASH_COMBINE(seed, xlibSurfaceCreateInfoKHR.dpy);
		VULKAN_HPP_HASH_COMBINE(seed, xlibSurfaceCreateInfoKHR.window);
		return seed;
	}
};
#	endif /*VK_USE_PLATFORM_XLIB_KHR*/

#endif  // 14 <= VULKAN_HPP_CPP_VERSION

}  // namespace std
#endif  // VULKAN_HASH_HPP
