#ifndef VULKAN_STATE_H #define VULKAN_STATE_H #include "volk.h" #include "vk_mem_alloc.h" #include "tier0/platform.h" #include "tier1/utlvector.h" #include "tier2/iappsystem.h" #include "materialsystem/imaterialsystem.h" #define REQUIRED_EXTENSION(ext) bool bIsSupported_##ext; #define OPTIONAL_EXTENSION(ext) bool bIsSupported_##ext; extern struct SupportedVulkanExtensions_t { #include "device_extensions.h" } g_vkAvailableExtensions; #undef REQUIRED_EXTENSION #undef OPTIONAL_EXTENSION enum EVulkanCommandType { COMMAND_TYPE_GENERAL, COMMAND_TYPE_BEGIN, COMMAND_TYPE_DRAW, COMMAND_TYPE_END, }; enum EDependencyMode { DEPENDENCY_MODE_SHADER_IMAGE_READ, DEPENDENCY_MODE_SHADER_BUFFER_READ, DEPENDENCY_MODE_SHADER_IMAGE_WRITE, DEPENDENCY_MODE_SHADER_BUFFER_WRITE, DEPENDENCY_MODE_SHADER_ACCELERATION_STRUCTURE, DEPENDENCY_MODE_DRAWCALL_VERTEX_BUFFER, DEPENDENCY_MODE_DRAWCALL_INDEX_BUFFER, DEPENDENCY_MODE_DRAWCALL_OUTPUT_IMAGE, DEPENDENCY_MODE_IMAGE_SOURCE, DEPENDENCY_MODE_IMAGE_DESTINATION, }; #define EXPOSE_VULKAN_COMMAND( name ) \ class CVulkanCommand_##name; \ CVulkanCommand_##name *name(); \ #define DECLARE_VULKAN_COMMAND( name ) \ class CVulkanCommand_##name \ { \ public: \ virtual void Execute() override; \ }; \ CVulkanCommand_##name *name(); \ { \ return new CVulkanCommand_##name \ } \ void CVulkanCommand_##name::Execute() \ abstract_class CVkCommand { public: void AddDependency( IRenderingObject *pObject, EDependencyMode eDependencyMode ); virtual void Execute(); struct VulkanCommandDepenency_t { IRenderingObject *m_pObject; EDependencyMode m_eDependencyMode; }; CUtlVector m_depedencies; }; abstract_class IVkCommandBuffer: public IAppSystem { public: virtual void AddCommand( EVulkanCommandType eType, CVkCommand * ) = 0; virtual void Submit() = 0; }; IVkCommandBuffer *VulkanCommandBuffer(); #undef __cplusplus #include "vulkan/vk_enum_string_helper.h" #define __cplusplus 202400L #define VULKAN_RESULT_PRINT(r, func) \ if (r != VK_SUCCESS) \ Plat_FatalErrorFunc(#func " failed: %s\n", string_VkResult(r)) #endif