From 3b833988fea112242716b0ada51997a947edd421 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 12 Feb 2022 14:26:42 +0100 Subject: [PATCH] [dxvk] Use staging buffer for gamma ramp uploads --- src/dxvk/dxvk_swapchain_blitter.cpp | 37 ++++++++++++++++++++++------- src/dxvk/dxvk_swapchain_blitter.h | 4 +++- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/dxvk/dxvk_swapchain_blitter.cpp b/src/dxvk/dxvk_swapchain_blitter.cpp index df1ce05a9..f915340dd 100644 --- a/src/dxvk/dxvk_swapchain_blitter.cpp +++ b/src/dxvk/dxvk_swapchain_blitter.cpp @@ -73,11 +73,31 @@ namespace dxvk { void DxvkSwapchainBlitter::setGammaRamp( uint32_t cpCount, const DxvkGammaCp* cpData) { - m_gammaRamp.resize(cpCount); + VkDeviceSize size = cpCount * sizeof(*cpData); - for (uint32_t i = 0; i < cpCount; i++) - m_gammaRamp[i] = cpData[i]; + if (cpCount) { + if (m_gammaBuffer == nullptr || m_gammaBuffer->info().size < size) { + DxvkBufferCreateInfo bufInfo; + bufInfo.size = size; + bufInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; + bufInfo.stages = VK_PIPELINE_STAGE_TRANSFER_BIT; + bufInfo.access = VK_ACCESS_TRANSFER_READ_BIT; + m_gammaBuffer = m_device->createBuffer(bufInfo, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | + VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + } + + if (!m_gammaSlice.handle) + m_gammaSlice = m_gammaBuffer->allocSlice(); + + std::memcpy(m_gammaSlice.mapPtr, cpData, size); + } else { + m_gammaBuffer = nullptr; + m_gammaSlice = DxvkBufferSliceHandle(); + } + + m_gammaCpCount = cpCount; m_gammaDirty = true; } @@ -210,7 +230,7 @@ namespace dxvk { void DxvkSwapchainBlitter::updateGammaTexture(DxvkContext* ctx) { - uint32_t n = uint32_t(m_gammaRamp.size()); + uint32_t n = m_gammaCpCount; if (n) { // Reuse existing image if possible @@ -248,13 +268,14 @@ namespace dxvk { m_gammaView = m_device->createImageView(m_gammaImage, viewInfo); } - ctx->updateImage(m_gammaImage, + ctx->invalidateBuffer(m_gammaBuffer, m_gammaSlice); + ctx->copyBufferToImage(m_gammaImage, VkImageSubresourceLayers { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 }, VkOffset3D { 0, 0, 0 }, VkExtent3D { n, 1, 1 }, - m_gammaRamp.data(), - sizeof(DxvkGammaCp) * n, - sizeof(DxvkGammaCp) * n); + m_gammaBuffer, 0, 0, 0); + + m_gammaSlice = DxvkBufferSliceHandle(); } else { m_gammaImage = nullptr; m_gammaView = nullptr; diff --git a/src/dxvk/dxvk_swapchain_blitter.h b/src/dxvk/dxvk_swapchain_blitter.h index b6db5f81d..915bb53e1 100644 --- a/src/dxvk/dxvk_swapchain_blitter.h +++ b/src/dxvk/dxvk_swapchain_blitter.h @@ -76,10 +76,12 @@ namespace dxvk { Rc m_fsResolve; Rc m_vs; + Rc m_gammaBuffer; Rc m_gammaImage; Rc m_gammaView; + uint32_t m_gammaCpCount = 0; bool m_gammaDirty = false; - std::vector m_gammaRamp; + DxvkBufferSliceHandle m_gammaSlice = { }; Rc m_resolveImage; Rc m_resolveView;