From ac1dfbacb68680cf89441e4e99ee1b10762536f9 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Tue, 8 Oct 2024 12:03:59 +0200 Subject: [PATCH] [dxvk] Move image initialization to init command buffer --- src/dxvk/dxvk_cmdlist.h | 10 ++++++---- src/dxvk/dxvk_context.cpp | 36 ++++++++++++++++++++++++++++-------- src/dxvk/dxvk_context.h | 1 + 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/src/dxvk/dxvk_cmdlist.h b/src/dxvk/dxvk_cmdlist.h index 0bae790f6..d72914d73 100644 --- a/src/dxvk/dxvk_cmdlist.h +++ b/src/dxvk/dxvk_cmdlist.h @@ -546,28 +546,30 @@ namespace dxvk { void cmdClearColorImage( + DxvkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges) { - m_cmd.usedFlags.set(DxvkCmdBuffer::ExecBuffer); + m_cmd.usedFlags.set(cmdBuffer); - m_vkd->vkCmdClearColorImage(m_cmd.execBuffer, + m_vkd->vkCmdClearColorImage(getCmdBuffer(cmdBuffer), image, imageLayout, pColor, rangeCount, pRanges); } void cmdClearDepthStencilImage( + DxvkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue* pDepthStencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges) { - m_cmd.usedFlags.set(DxvkCmdBuffer::ExecBuffer); + m_cmd.usedFlags.set(cmdBuffer); - m_vkd->vkCmdClearDepthStencilImage(m_cmd.execBuffer, + m_vkd->vkCmdClearDepthStencilImage(getCmdBuffer(cmdBuffer), image, imageLayout, pDepthStencil, rangeCount, pRanges); } diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 6eba8b9e7..4d6548054 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -13,6 +13,7 @@ namespace dxvk { m_common (&device->m_objects), m_sdmaAcquires(DxvkCmdBuffer::SdmaBuffer), m_sdmaBarriers(DxvkCmdBuffer::SdmaBuffer), + m_initAcquires(DxvkCmdBuffer::InitBuffer), m_initBarriers(DxvkCmdBuffer::InitBuffer), m_execAcquires(DxvkCmdBuffer::ExecBuffer), m_execBarriers(DxvkCmdBuffer::ExecBuffer), @@ -1059,13 +1060,15 @@ namespace dxvk { } else { VkImageLayout clearLayout = image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); - m_initBarriers.accessImage(image, subresources, + m_initAcquires.accessImage(image, subresources, initialLayout, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 0, clearLayout, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT); + m_initAcquires.recordCommands(m_cmd); + auto formatInfo = image->formatInfo(); if (formatInfo->flags.any(DxvkFormatFlag::BlockCompressed, DxvkFormatFlag::MultiPlane)) { @@ -1115,7 +1118,7 @@ namespace dxvk { copyInfo.regionCount = 1; copyInfo.pRegions = ©Region; - m_cmd->cmdCopyBufferToImage(DxvkCmdBuffer::ExecBuffer, ©Info); + m_cmd->cmdCopyBufferToImage(DxvkCmdBuffer::InitBuffer, ©Info); } } @@ -1125,17 +1128,17 @@ namespace dxvk { if (subresources.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) { VkClearDepthStencilValue value = { }; - m_cmd->cmdClearDepthStencilImage(image->handle(), - clearLayout, &value, 1, &subresources); + m_cmd->cmdClearDepthStencilImage(DxvkCmdBuffer::InitBuffer, + image->handle(), clearLayout, &value, 1, &subresources); } else { VkClearColorValue value = { }; - m_cmd->cmdClearColorImage(image->handle(), - clearLayout, &value, 1, &subresources); + m_cmd->cmdClearColorImage(DxvkCmdBuffer::InitBuffer, + image->handle(), clearLayout, &value, 1, &subresources); } } - m_execBarriers.accessImage(image, subresources, + m_initBarriers.accessImage(image, subresources, clearLayout, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, @@ -6892,7 +6895,24 @@ namespace dxvk { m_zeroBuffer = m_device->createBuffer(bufInfo, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); - this->initBuffer(m_zeroBuffer); + DxvkBufferSliceHandle slice = m_zeroBuffer->getSliceHandle(); + + m_cmd->cmdFillBuffer(DxvkCmdBuffer::InitBuffer, + slice.handle, slice.offset, slice.length, 0); + + VkMemoryBarrier2 barrier = { VK_STRUCTURE_TYPE_MEMORY_BARRIER_2 }; + barrier.srcStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT; + barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + barrier.dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT; + barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; + + VkDependencyInfo depInfo = { VK_STRUCTURE_TYPE_DEPENDENCY_INFO }; + depInfo.memoryBarrierCount = 1; + depInfo.pMemoryBarriers = &barrier; + + m_cmd->cmdPipelineBarrier(DxvkCmdBuffer::InitBuffer, &depInfo); + m_cmd->addStatCtr(DxvkStatCounter::CmdBarrierCount, 1); + return m_zeroBuffer; } diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index 4d1b72d01..fb9822bd0 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -1408,6 +1408,7 @@ namespace dxvk { DxvkBarrierSet m_sdmaAcquires; DxvkBarrierSet m_sdmaBarriers; + DxvkBarrierSet m_initAcquires; DxvkBarrierSet m_initBarriers; DxvkBarrierSet m_execAcquires; DxvkBarrierSet m_execBarriers;