1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-15 07:29:17 +01:00

[dxvk] Execute depth/stencil image upload on graphics queue

Silences a validation error.
This commit is contained in:
Philip Rebohle 2021-01-12 12:14:53 +01:00
parent 8163eb4185
commit b19293430a
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99

View File

@ -2112,15 +2112,23 @@ namespace dxvk {
elementCount, formatInfo->elementSize, elementCount, formatInfo->elementSize,
pitchPerRow, pitchPerLayer); 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 // Discard previous subresource contents
m_sdmaAcquires.accessImage(image, barriers->accessImage(image,
vk::makeSubresourceRange(subresources), vk::makeSubresourceRange(subresources),
VK_IMAGE_LAYOUT_UNDEFINED, 0, 0, VK_IMAGE_LAYOUT_UNDEFINED, 0, 0,
image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL), image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_TRANSFER_WRITE_BIT); VK_ACCESS_TRANSFER_WRITE_BIT);
m_sdmaAcquires.recordCommands(m_cmd); barriers->recordCommands(m_cmd);
// Perform copy on the transfer queue // Perform copy on the transfer queue
VkBufferImageCopy region; VkBufferImageCopy region;
@ -2131,22 +2139,24 @@ namespace dxvk {
region.imageOffset = imageOffset; region.imageOffset = imageOffset;
region.imageExtent = imageExtent; region.imageExtent = imageExtent;
m_cmd->cmdCopyBufferToImage(DxvkCmdBuffer::SdmaBuffer, m_cmd->cmdCopyBufferToImage(cmdBuffer,
stagingHandle.handle, image->handle(), stagingHandle.handle, image->handle(),
image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL), image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
1, &region); 1, &region);
// Transfer ownership to graphics queue // Transfer ownership to graphics queue
m_sdmaBarriers.releaseImage(m_initBarriers, if (cmdBuffer == DxvkCmdBuffer::SdmaBuffer) {
image, vk::makeSubresourceRange(subresources), m_sdmaBarriers.releaseImage(m_initBarriers,
m_device->queues().transfer.queueFamily, image, vk::makeSubresourceRange(subresources),
image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL), m_device->queues().transfer.queueFamily,
VK_PIPELINE_STAGE_TRANSFER_BIT, image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
VK_ACCESS_TRANSFER_WRITE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
m_device->queues().graphics.queueFamily, VK_ACCESS_TRANSFER_WRITE_BIT,
image->info().layout, m_device->queues().graphics.queueFamily,
image->info().stages, image->info().layout,
image->info().access); image->info().stages,
image->info().access);
}
m_cmd->trackResource<DxvkAccess::Write>(image); m_cmd->trackResource<DxvkAccess::Write>(image);
m_cmd->trackResource<DxvkAccess::Read>(stagingSlice.buffer()); m_cmd->trackResource<DxvkAccess::Read>(stagingSlice.buffer());