1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-21 22:54:16 +01:00

[dxvk] Move image initialization to init command buffer

This commit is contained in:
Philip Rebohle 2024-10-08 12:03:59 +02:00 committed by Philip Rebohle
parent 0f6f543583
commit ac1dfbacb6
3 changed files with 35 additions and 12 deletions

View File

@ -546,28 +546,30 @@ namespace dxvk {
void cmdClearColorImage( void cmdClearColorImage(
DxvkCmdBuffer cmdBuffer,
VkImage image, VkImage image,
VkImageLayout imageLayout, VkImageLayout imageLayout,
const VkClearColorValue* pColor, const VkClearColorValue* pColor,
uint32_t rangeCount, uint32_t rangeCount,
const VkImageSubresourceRange* pRanges) { 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, image, imageLayout, pColor,
rangeCount, pRanges); rangeCount, pRanges);
} }
void cmdClearDepthStencilImage( void cmdClearDepthStencilImage(
DxvkCmdBuffer cmdBuffer,
VkImage image, VkImage image,
VkImageLayout imageLayout, VkImageLayout imageLayout,
const VkClearDepthStencilValue* pDepthStencil, const VkClearDepthStencilValue* pDepthStencil,
uint32_t rangeCount, uint32_t rangeCount,
const VkImageSubresourceRange* pRanges) { 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, image, imageLayout, pDepthStencil,
rangeCount, pRanges); rangeCount, pRanges);
} }

View File

@ -13,6 +13,7 @@ namespace dxvk {
m_common (&device->m_objects), m_common (&device->m_objects),
m_sdmaAcquires(DxvkCmdBuffer::SdmaBuffer), m_sdmaAcquires(DxvkCmdBuffer::SdmaBuffer),
m_sdmaBarriers(DxvkCmdBuffer::SdmaBuffer), m_sdmaBarriers(DxvkCmdBuffer::SdmaBuffer),
m_initAcquires(DxvkCmdBuffer::InitBuffer),
m_initBarriers(DxvkCmdBuffer::InitBuffer), m_initBarriers(DxvkCmdBuffer::InitBuffer),
m_execAcquires(DxvkCmdBuffer::ExecBuffer), m_execAcquires(DxvkCmdBuffer::ExecBuffer),
m_execBarriers(DxvkCmdBuffer::ExecBuffer), m_execBarriers(DxvkCmdBuffer::ExecBuffer),
@ -1059,13 +1060,15 @@ namespace dxvk {
} else { } else {
VkImageLayout clearLayout = image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); VkImageLayout clearLayout = image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
m_initBarriers.accessImage(image, subresources, m_initAcquires.accessImage(image, subresources,
initialLayout, initialLayout,
VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 0, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 0,
clearLayout, clearLayout,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_TRANSFER_WRITE_BIT); VK_ACCESS_TRANSFER_WRITE_BIT);
m_initAcquires.recordCommands(m_cmd);
auto formatInfo = image->formatInfo(); auto formatInfo = image->formatInfo();
if (formatInfo->flags.any(DxvkFormatFlag::BlockCompressed, DxvkFormatFlag::MultiPlane)) { if (formatInfo->flags.any(DxvkFormatFlag::BlockCompressed, DxvkFormatFlag::MultiPlane)) {
@ -1115,7 +1118,7 @@ namespace dxvk {
copyInfo.regionCount = 1; copyInfo.regionCount = 1;
copyInfo.pRegions = &copyRegion; copyInfo.pRegions = &copyRegion;
m_cmd->cmdCopyBufferToImage(DxvkCmdBuffer::ExecBuffer, &copyInfo); m_cmd->cmdCopyBufferToImage(DxvkCmdBuffer::InitBuffer, &copyInfo);
} }
} }
@ -1125,17 +1128,17 @@ namespace dxvk {
if (subresources.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) { if (subresources.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
VkClearDepthStencilValue value = { }; VkClearDepthStencilValue value = { };
m_cmd->cmdClearDepthStencilImage(image->handle(), m_cmd->cmdClearDepthStencilImage(DxvkCmdBuffer::InitBuffer,
clearLayout, &value, 1, &subresources); image->handle(), clearLayout, &value, 1, &subresources);
} else { } else {
VkClearColorValue value = { }; VkClearColorValue value = { };
m_cmd->cmdClearColorImage(image->handle(), m_cmd->cmdClearColorImage(DxvkCmdBuffer::InitBuffer,
clearLayout, &value, 1, &subresources); image->handle(), clearLayout, &value, 1, &subresources);
} }
} }
m_execBarriers.accessImage(image, subresources, m_initBarriers.accessImage(image, subresources,
clearLayout, clearLayout,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
@ -6892,7 +6895,24 @@ namespace dxvk {
m_zeroBuffer = m_device->createBuffer(bufInfo, m_zeroBuffer = m_device->createBuffer(bufInfo,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); 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; return m_zeroBuffer;
} }

View File

@ -1408,6 +1408,7 @@ namespace dxvk {
DxvkBarrierSet m_sdmaAcquires; DxvkBarrierSet m_sdmaAcquires;
DxvkBarrierSet m_sdmaBarriers; DxvkBarrierSet m_sdmaBarriers;
DxvkBarrierSet m_initAcquires;
DxvkBarrierSet m_initBarriers; DxvkBarrierSet m_initBarriers;
DxvkBarrierSet m_execAcquires; DxvkBarrierSet m_execAcquires;
DxvkBarrierSet m_execBarriers; DxvkBarrierSet m_execBarriers;