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

[dxvk] Factor out swapchain blitter texture uploads

This commit is contained in:
Philip Rebohle 2024-10-04 15:17:05 +02:00
parent dbaa4d8df4
commit 4420c39b62
2 changed files with 31 additions and 16 deletions

View File

@ -261,17 +261,26 @@ namespace dxvk {
m_gammaView = m_gammaImage->createView(viewInfo); m_gammaView = m_gammaImage->createView(viewInfo);
} }
uploadTexture(ctx, m_gammaImage, m_gammaBuffer);
m_gammaBuffer = nullptr;
}
void DxvkSwapchainBlitter::uploadTexture(
const DxvkContextObjects& ctx,
const Rc<DxvkImage>& image,
const Rc<DxvkBuffer>& buffer) {
VkImageMemoryBarrier2 barrier = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2 }; VkImageMemoryBarrier2 barrier = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2 };
barrier.srcStageMask = m_gammaImage->info().stages; barrier.srcStageMask = image->info().stages;
barrier.srcAccessMask = m_gammaImage->info().access; barrier.srcAccessMask = image->info().access;
barrier.dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT; barrier.dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT;
barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
barrier.newLayout = m_gammaImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); barrier.newLayout = image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
barrier.image = m_gammaImage->handle(); barrier.image = image->handle();
barrier.subresourceRange = m_gammaImage->getAvailableSubresources(); barrier.subresourceRange = image->getAvailableSubresources();
VkDependencyInfo depInfo = { VK_STRUCTURE_TYPE_DEPENDENCY_INFO }; VkDependencyInfo depInfo = { VK_STRUCTURE_TYPE_DEPENDENCY_INFO };
depInfo.imageMemoryBarrierCount = 1; depInfo.imageMemoryBarrierCount = 1;
@ -279,18 +288,18 @@ namespace dxvk {
ctx.cmd->cmdPipelineBarrier(DxvkCmdBuffer::ExecBuffer, &depInfo); ctx.cmd->cmdPipelineBarrier(DxvkCmdBuffer::ExecBuffer, &depInfo);
DxvkBufferSliceHandle bufferSlice = m_gammaBuffer->getSliceHandle(); DxvkBufferSliceHandle bufferSlice = buffer->getSliceHandle();
VkBufferImageCopy2 copyRegion = { VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2 }; VkBufferImageCopy2 copyRegion = { VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2 };
copyRegion.bufferOffset = bufferSlice.offset; copyRegion.bufferOffset = bufferSlice.offset;
copyRegion.imageExtent = { m_gammaCpCount, 1u, 1u }; copyRegion.imageExtent = image->info().extent;
copyRegion.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; copyRegion.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
copyRegion.imageSubresource.layerCount = 1u; copyRegion.imageSubresource.layerCount = 1u;
VkCopyBufferToImageInfo2 copy = { VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2 }; VkCopyBufferToImageInfo2 copy = { VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2 };
copy.srcBuffer = bufferSlice.handle; copy.srcBuffer = bufferSlice.handle;
copy.dstImage = m_gammaImage->handle(); copy.dstImage = image->handle();
copy.dstImageLayout = m_gammaImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); copy.dstImageLayout = image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
copy.regionCount = 1; copy.regionCount = 1;
copy.pRegions = &copyRegion; copy.pRegions = &copyRegion;
@ -298,17 +307,15 @@ namespace dxvk {
barrier.srcStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT; barrier.srcStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT;
barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
barrier.dstStageMask = m_gammaImage->info().stages; barrier.dstStageMask = image->info().stages;
barrier.dstAccessMask = m_gammaImage->info().access; barrier.dstAccessMask = image->info().access;
barrier.oldLayout = barrier.newLayout; barrier.oldLayout = barrier.newLayout;
barrier.newLayout = m_gammaImage->info().layout; barrier.newLayout = image->info().layout;
ctx.cmd->cmdPipelineBarrier(DxvkCmdBuffer::ExecBuffer, &depInfo); ctx.cmd->cmdPipelineBarrier(DxvkCmdBuffer::ExecBuffer, &depInfo);
ctx.cmd->trackResource<DxvkAccess::Read>(m_gammaBuffer->getAllocation()); ctx.cmd->trackResource<DxvkAccess::Read>(buffer->getAllocation());
ctx.cmd->trackResource<DxvkAccess::Write>(m_gammaImage->getAllocation()); ctx.cmd->trackResource<DxvkAccess::Write>(image->getAllocation());
m_gammaBuffer = nullptr;
} }

View File

@ -180,6 +180,14 @@ namespace dxvk {
void uploadGammaImage( void uploadGammaImage(
const DxvkContextObjects& ctx); const DxvkContextObjects& ctx);
void uploadCursorImage(
const DxvkContextObjects& ctx);
void uploadTexture(
const DxvkContextObjects& ctx,
const Rc<DxvkImage>& image,
const Rc<DxvkBuffer>& buffer);
void createSampler(); void createSampler();
void createShaders(); void createShaders();