From b19293430a7e73c06cdec0e742468f0028b6d674 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Tue, 12 Jan 2021 12:14:53 +0100 Subject: [PATCH] [dxvk] Execute depth/stencil image upload on graphics queue Silences a validation error. --- src/dxvk/dxvk_context.cpp | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 851be08f..31762c6d 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -2112,15 +2112,23 @@ namespace dxvk { elementCount, formatInfo->elementSize, pitchPerRow, pitchPerLayer); + DxvkCmdBuffer cmdBuffer = DxvkCmdBuffer::SdmaBuffer; + DxvkBarrierSet* barriers = &m_sdmaAcquires; + + if (subresources.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) { + cmdBuffer = DxvkCmdBuffer::InitBuffer; + barriers = &m_initBarriers; + } + // Discard previous subresource contents - m_sdmaAcquires.accessImage(image, + barriers->accessImage(image, vk::makeSubresourceRange(subresources), VK_IMAGE_LAYOUT_UNDEFINED, 0, 0, image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT); - m_sdmaAcquires.recordCommands(m_cmd); + barriers->recordCommands(m_cmd); // Perform copy on the transfer queue VkBufferImageCopy region; @@ -2131,22 +2139,24 @@ namespace dxvk { region.imageOffset = imageOffset; region.imageExtent = imageExtent; - m_cmd->cmdCopyBufferToImage(DxvkCmdBuffer::SdmaBuffer, + m_cmd->cmdCopyBufferToImage(cmdBuffer, stagingHandle.handle, image->handle(), image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL), 1, ®ion); // Transfer ownership to graphics queue - m_sdmaBarriers.releaseImage(m_initBarriers, - image, vk::makeSubresourceRange(subresources), - m_device->queues().transfer.queueFamily, - image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL), - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_ACCESS_TRANSFER_WRITE_BIT, - m_device->queues().graphics.queueFamily, - image->info().layout, - image->info().stages, - image->info().access); + if (cmdBuffer == DxvkCmdBuffer::SdmaBuffer) { + m_sdmaBarriers.releaseImage(m_initBarriers, + image, vk::makeSubresourceRange(subresources), + m_device->queues().transfer.queueFamily, + image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL), + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_ACCESS_TRANSFER_WRITE_BIT, + m_device->queues().graphics.queueFamily, + image->info().layout, + image->info().stages, + image->info().access); + } m_cmd->trackResource(image); m_cmd->trackResource(stagingSlice.buffer());