quakeforge/include/QF/Vulkan/barrier.h
Bill Currie 17b00a3d05 [vulkan] Enable synchronization validation
And clean up the resulting errors. While some were tricky, there weren't
all that many: just some attachment issues and the multi-stage image
copy for scraps.

Fixing scraps required a barrier between copies. It might be overkill,
but a transfer_dst to transfer_dst image barrier worked.

Fixing attachments was a bit trickier:
 - depth needed early and late fragment tests to be treated as one stage
 - all attachments that were read later needed storeOp = none (using the
   extension)
 - and then finalLayout needed to be correct to avoid ghost transitions
 - as well, for some reason the deffered gbuffer subpass needed a depth
   dependency on the translucent pass even though neither one writes to
   the depth attachment (possibly a validation bug, needs more
   investigation).
2024-01-28 09:00:01 +09:00

54 lines
1.4 KiB
C

#ifndef __QF_Vulkan_barrier_h
#define __QF_Vulkan_barrier_h
#ifndef VK_NO_PROTOTYPES
#define VK_NO_PROTOTYPES
#endif
#include <vulkan/vulkan.h>
typedef struct qfv_imagebarrier_s {
VkPipelineStageFlags srcStages;
VkPipelineStageFlags dstStages;
VkImageMemoryBarrier barrier;
} qfv_imagebarrier_t;
typedef struct qfv_bufferbarrier_s {
VkPipelineStageFlags srcStages;
VkPipelineStageFlags dstStages;
VkBufferMemoryBarrier barrier;
} qfv_bufferbarrier_t;
// image layout transitions
enum {
qfv_LT_Undefined_to_TransferDst,
qfv_LT_Undefined_to_General,
qfv_LT_Undefined_to_ShaderReadOnly,
qfv_LT_TransferDst_to_TransferDst,
qfv_LT_TransferDst_to_TransferSrc,
qfv_LT_TransferDst_to_General,
qfv_LT_TransferDst_to_ShaderReadOnly,
qfv_LT_TransferSrc_to_ShaderReadOnly,
qfv_LT_ShaderReadOnly_to_TransferDst,
qfv_LT_Undefined_to_DepthStencil,
qfv_LT_Undefined_to_Color,
};
// buffer barriers
enum {
qfv_BB_Unknown_to_TransferWrite,
qfv_BB_TransferWrite_to_VertexAttrRead,
qfv_BB_TransferWrite_to_IndexRead,
qfv_BB_TransferWrite_to_UniformRead,
qfv_BB_TransferWrite_to_ShaderRW,
qfv_BB_ShaderRW_to_ShaderRO,
qfv_BB_ShaderRW_to_ShaderRO_VA,
qfv_BB_ShaderRO_to_ShaderWrite,
qfv_BB_ShaderRO_VA_to_ShaderWrite,
qfv_BB_ShaderWrite_to_ShaderRO,
qfv_BB_ShaderWrite_to_ShaderRW,
};
extern const qfv_imagebarrier_t imageBarriers[];
extern const qfv_bufferbarrier_t bufferBarriers[];
#endif//__QF_Vulkan_barrier_h