#pragma once #include "dxvk_buffer.h" #include "dxvk_cmdlist.h" #include "dxvk_image.h" namespace dxvk { /** * \brief Barrier set * * Accumulates memory barriers and provides a * method to record all those barriers into a * command buffer at once. */ class DxvkBarrierSet { public: DxvkBarrierSet(); ~DxvkBarrierSet(); void accessBuffer( const DxvkPhysicalBufferSlice& bufSlice, VkPipelineStageFlags srcStages, VkAccessFlags srcAccess, VkPipelineStageFlags dstStages, VkAccessFlags dstAccess); void accessImage( const Rc& image, const VkImageSubresourceRange& subresources, VkImageLayout srcLayout, VkPipelineStageFlags srcStages, VkAccessFlags srcAccess, VkImageLayout dstLayout, VkPipelineStageFlags dstStages, VkAccessFlags dstAccess); bool isBufferDirty( const DxvkPhysicalBufferSlice& bufSlice, DxvkAccessFlags bufAccess); bool isImageDirty( const Rc& image, const VkImageSubresourceRange& imgSubres, DxvkAccessFlags imgAccess); void recordCommands( const Rc& commandList); void reset(); private: struct BufSlice { DxvkPhysicalBufferSlice slice; DxvkAccessFlags access; }; struct ImgSlice { DxvkImage* image; VkImageSubresourceRange subres; DxvkAccessFlags access; }; VkPipelineStageFlags m_srcStages = 0; VkPipelineStageFlags m_dstStages = 0; std::vector m_memBarriers; std::vector m_bufBarriers; std::vector m_imgBarriers; std::vector m_bufSlices; std::vector m_imgSlices; DxvkAccessFlags getAccessTypes(VkAccessFlags flags) const; }; }