|
|
@ -492,17 +492,18 @@ void BufferCacheRuntime::UnifiedMemoryHostBarrier() { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void BufferCacheRuntime::UnifiedMemoryShaderWriteBarrier() { |
|
|
void BufferCacheRuntime::UnifiedMemoryShaderWriteBarrier() { |
|
|
const bool has_transform_feedback = device.IsExtTransformFeedbackSupported(); |
|
|
|
|
|
|
|
|
VkAccessFlags src_access = VK_ACCESS_SHADER_WRITE_BIT; |
|
|
|
|
|
VkPipelineStageFlags src_stages = vk::PIPELINE_STAGE_GRAPHICS_COMPUTE; |
|
|
|
|
|
if (device.IsExtTransformFeedbackSupported()) { |
|
|
|
|
|
src_access |= VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT; |
|
|
|
|
|
src_stages |= VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT; |
|
|
|
|
|
} |
|
|
const VkMemoryBarrier write_barrier{ |
|
|
const VkMemoryBarrier write_barrier{ |
|
|
.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, |
|
|
.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, |
|
|
.pNext = nullptr, |
|
|
.pNext = nullptr, |
|
|
.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT | |
|
|
|
|
|
(has_transform_feedback ? VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT : 0), |
|
|
|
|
|
|
|
|
.srcAccessMask = src_access, |
|
|
.dstAccessMask = VK_ACCESS_HOST_READ_BIT, |
|
|
.dstAccessMask = VK_ACCESS_HOST_READ_BIT, |
|
|
}; |
|
|
}; |
|
|
const VkPipelineStageFlags src_stages = |
|
|
|
|
|
vk::PIPELINE_STAGE_GRAPHICS_COMPUTE | |
|
|
|
|
|
(has_transform_feedback ? VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT : 0); |
|
|
|
|
|
scheduler.RequestOutsideRenderPassOperationContext(); |
|
|
scheduler.RequestOutsideRenderPassOperationContext(); |
|
|
scheduler.Record([write_barrier, src_stages](vk::CommandBuffer cmdbuf) { |
|
|
scheduler.Record([write_barrier, src_stages](vk::CommandBuffer cmdbuf) { |
|
|
cmdbuf.PipelineBarrier(src_stages, VK_PIPELINE_STAGE_HOST_BIT, 0, write_barrier); |
|
|
cmdbuf.PipelineBarrier(src_stages, VK_PIPELINE_STAGE_HOST_BIT, 0, write_barrier); |
|
|
|