global update
This commit is contained in:
@@ -163,3 +163,116 @@ DECLARE_VULKAN_COMMAND(ResolveImage)
|
||||
vkCmdResolveImage2(hCommandBuffer, &i);
|
||||
}
|
||||
|
||||
static VkPipelineStageFlags2 GetStage( EStageHazard stage )
|
||||
{
|
||||
switch (stage)
|
||||
{
|
||||
case STAGE_HAZARD_COMPUTE:
|
||||
return VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT;
|
||||
case STAGE_HAZARD_TRANSFER:
|
||||
return VK_PIPELINE_STAGE_2_TRANSFER_BIT;
|
||||
case STAGE_HAZARD_RASTER_COLOR_OUT:
|
||||
return VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT;
|
||||
case STAGE_HAZARD_NONE:
|
||||
return VK_PIPELINE_STAGE_2_NONE;
|
||||
case STAGE_HAZARD_RASTER_EARLY_DEPTH_OUT:
|
||||
return VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT;
|
||||
case STAGE_HAZARD_RASTER_LATE_DEPTH_OUT:
|
||||
return VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT;
|
||||
}
|
||||
|
||||
}
|
||||
static VkAccessFlags2 GetAccessSrc( uint32_t hazard, EStageHazard stage )
|
||||
{
|
||||
VkAccessFlags2 f = 0;
|
||||
if (hazard & BARRIER_HAZARD_DRAW_ARGUMENTS)
|
||||
f |= VK_ACCESS_2_SHADER_WRITE_BIT;
|
||||
if (hazard & BARRIER_HAZARD_DESCRIPTOR)
|
||||
f |= VK_ACCESS_2_SHADER_WRITE_BIT;
|
||||
if (stage == STAGE_HAZARD_RASTER_EARLY_DEPTH_OUT)
|
||||
{
|
||||
if (hazard & BARRIER_HAZARD_DEPTH_STENCIL)
|
||||
f |= VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
|
||||
}
|
||||
if (stage == STAGE_HAZARD_RASTER_COLOR_OUT)
|
||||
{
|
||||
if (hazard & BARRIER_HAZARD_RASTER_COLOR)
|
||||
f |= VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT;
|
||||
|
||||
}
|
||||
if (hazard == 0)
|
||||
f |= VK_ACCESS_2_MEMORY_READ_BIT | VK_ACCESS_2_MEMORY_WRITE_BIT;
|
||||
return f;
|
||||
|
||||
}
|
||||
static VkAccessFlags2 GetAccessDst( uint32_t hazard, EStageHazard stage )
|
||||
{
|
||||
VkAccessFlags2 f = 0;
|
||||
if (hazard & BARRIER_HAZARD_DRAW_ARGUMENTS)
|
||||
f |= VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT;
|
||||
if (hazard & BARRIER_HAZARD_DESCRIPTOR)
|
||||
f |= VK_ACCESS_2_SHADER_READ_BIT;
|
||||
if (hazard & BARRIER_HAZARD_DEPTH_STENCIL)
|
||||
f |= VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
|
||||
if (hazard & BARRIER_HAZARD_RASTER_COLOR)
|
||||
f |= VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT;
|
||||
if (hazard == 0)
|
||||
f |= VK_ACCESS_2_MEMORY_READ_BIT | VK_ACCESS_2_MEMORY_WRITE_BIT;
|
||||
return f;
|
||||
}
|
||||
static VkImageLayout GetLayout( EImageLayoutHazard hazard )
|
||||
{
|
||||
switch (hazard)
|
||||
{
|
||||
case IMAGE_LAYOUT_COLOR:
|
||||
return VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
case IMAGE_LAYOUT_DEPTH_STENCIL:
|
||||
return VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
|
||||
case IMAGE_LAYOUT_GENERAL:
|
||||
return VK_IMAGE_LAYOUT_GENERAL;
|
||||
case IMAGE_LAYOUT_PRESENT:
|
||||
return VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
|
||||
case IMAGE_LAYOUT_UNDEFINED:
|
||||
return VK_IMAGE_LAYOUT_UNDEFINED;
|
||||
case IMAGE_LAYOUT_TRANSFER_SRC:
|
||||
return VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
|
||||
case IMAGE_LAYOUT_TRANSFER_DST:
|
||||
return VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
DECLARE_VULKAN_COMMAND(Barrier)
|
||||
{
|
||||
|
||||
VkMemoryBarrier2 barrier = {};
|
||||
barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER_2;
|
||||
barrier.srcStageMask = GetStage(eStageIn);
|
||||
barrier.srcAccessMask = GetAccessSrc(eHazard, eStageIn);
|
||||
barrier.dstStageMask = GetStage(eStageOut);
|
||||
barrier.dstAccessMask = GetAccessDst(eHazard, eStageOut);
|
||||
VkDependencyInfo dependency = {};
|
||||
dependency.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO;
|
||||
dependency.memoryBarrierCount = 1;
|
||||
dependency.pMemoryBarriers = &barrier;
|
||||
vkCmdPipelineBarrier2(hCommandBuffer, &dependency);
|
||||
}
|
||||
|
||||
DECLARE_VULKAN_COMMAND(LayoutBarrier)
|
||||
{
|
||||
VkImageMemoryBarrier2 barrier = {};
|
||||
barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2;
|
||||
barrier.srcStageMask = GetStage(eStageIn);
|
||||
barrier.srcAccessMask = GetAccessSrc(eHazard, eStageIn);
|
||||
barrier.dstStageMask = GetStage(eStageOut);
|
||||
barrier.dstAccessMask = GetAccessDst(eHazard, eStageOut);
|
||||
barrier.image = ((CVkImage*)pImage)->m_image;
|
||||
barrier.subresourceRange = ((CVkImage*)pImage)->m_range;
|
||||
barrier.oldLayout = GetLayout(eLayoutIn);
|
||||
barrier.newLayout = GetLayout(eLayoutOut);
|
||||
VkDependencyInfo dependency = {};
|
||||
dependency.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO;
|
||||
dependency.imageMemoryBarrierCount = 1;
|
||||
dependency.pImageMemoryBarriers = &barrier;
|
||||
vkCmdPipelineBarrier2(hCommandBuffer, &dependency);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user