From d85d07c0ec4eb418ab2cbeef7cf3dda54b545a0e Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Mon, 13 Jan 2025 00:16:50 +0100 Subject: [PATCH] [dxvk] Infer swap chain color space from image views --- src/d3d11/d3d11_swapchain.cpp | 8 ++++---- src/d3d9/d3d9_swapchain.cpp | 7 +++---- src/dxvk/dxvk_swapchain_blitter.cpp | 22 +++++++++------------- src/dxvk/dxvk_swapchain_blitter.h | 9 +-------- src/dxvk/hud/dxvk_hud.cpp | 9 ++++----- src/dxvk/hud/dxvk_hud.h | 4 +--- src/dxvk/hud/dxvk_hud_renderer.cpp | 9 +++------ src/dxvk/hud/dxvk_hud_renderer.h | 5 +---- 8 files changed, 26 insertions(+), 47 deletions(-) diff --git a/src/d3d11/d3d11_swapchain.cpp b/src/d3d11/d3d11_swapchain.cpp index aceb2055f..d86471874 100644 --- a/src/d3d11/d3d11_swapchain.cpp +++ b/src/d3d11/d3d11_swapchain.cpp @@ -434,15 +434,15 @@ namespace dxvk { auto contextObjects = ctx->beginExternalRendering(); cBlitter->beginPresent(contextObjects, - cBackBuffer, cColorSpace, VkRect2D(), - cSwapImage, cColorSpace, VkRect2D()); + cBackBuffer, VkRect2D(), + cSwapImage, VkRect2D()); if (cHud != nullptr) { cHud->update(); - cHud->render(contextObjects, cBackBuffer, cColorSpace); + cHud->render(contextObjects, cBackBuffer); } - cBlitter->endPresent(contextObjects, cBackBuffer, cColorSpace); + cBlitter->endPresent(contextObjects, cBackBuffer); // Submit current command list and present ctx->synchronizeWsi(cSync); diff --git a/src/d3d9/d3d9_swapchain.cpp b/src/d3d9/d3d9_swapchain.cpp index 1b3f8318b..a662a7681 100644 --- a/src/d3d9/d3d9_swapchain.cpp +++ b/src/d3d9/d3d9_swapchain.cpp @@ -878,17 +878,16 @@ namespace dxvk { auto contextObjects = ctx->beginExternalRendering(); cBlitter->beginPresent(contextObjects, - cDstView, cColorSpace, cDstRect, - cSrcView, cColorSpace, cSrcRect); + cDstView, cDstRect, cSrcView, cSrcRect); if (cHud) { if (!cRepeat) cHud->update(); - cHud->render(contextObjects, cDstView, cColorSpace); + cHud->render(contextObjects, cDstView); } - cBlitter->endPresent(contextObjects, cDstView, cColorSpace); + cBlitter->endPresent(contextObjects, cDstView); // Submit command list and present ctx->synchronizeWsi(cSync); diff --git a/src/dxvk/dxvk_swapchain_blitter.cpp b/src/dxvk/dxvk_swapchain_blitter.cpp index aca8718a0..40ae2e527 100644 --- a/src/dxvk/dxvk_swapchain_blitter.cpp +++ b/src/dxvk/dxvk_swapchain_blitter.cpp @@ -38,10 +38,8 @@ namespace dxvk { void DxvkSwapchainBlitter::beginPresent( const DxvkContextObjects& ctx, const Rc& dstView, - VkColorSpaceKHR dstColorSpace, VkRect2D dstRect, const Rc& srcView, - VkColorSpaceKHR srcColorSpace, VkRect2D srcRect) { std::unique_lock lock(m_mutex); @@ -102,17 +100,14 @@ namespace dxvk { ctx.cmd->cmdBeginRendering(&renderInfo); - performDraw(ctx, - dstView, dstColorSpace, dstRect, - srcView, srcColorSpace, srcRect, - VK_FALSE); + performDraw(ctx, dstView, dstRect, + srcView, srcRect, VK_FALSE); } void DxvkSwapchainBlitter::endPresent( const DxvkContextObjects& ctx, - const Rc& dstView, - VkColorSpaceKHR dstColorSpace) { + const Rc& dstView) { std::unique_lock lock(m_mutex); if (m_cursorView) { @@ -120,9 +115,8 @@ namespace dxvk { cursorArea.extent.width = m_cursorImage->info().extent.width; cursorArea.extent.height = m_cursorImage->info().extent.height; - performDraw(ctx, dstView, dstColorSpace, m_cursorRect, - m_cursorView, VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, cursorArea, - VK_TRUE); + performDraw(ctx, dstView, m_cursorRect, + m_cursorView, cursorArea, VK_TRUE); } ctx.cmd->cmdEndRendering(); @@ -212,6 +206,7 @@ namespace dxvk { | VK_ACCESS_SHADER_READ_BIT; imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL; imageInfo.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + imageInfo.colorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR; imageInfo.debugName = "Swapchain cursor"; m_cursorImage = m_device->createImage(imageInfo, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); @@ -246,12 +241,13 @@ namespace dxvk { void DxvkSwapchainBlitter::performDraw( const DxvkContextObjects& ctx, const Rc& dstView, - VkColorSpaceKHR dstColorSpace, VkRect2D dstRect, const Rc& srcView, - VkColorSpaceKHR srcColorSpace, VkRect2D srcRect, VkBool32 enableBlending) { + VkColorSpaceKHR dstColorSpace = dstView->image()->info().colorSpace; + VkColorSpaceKHR srcColorSpace = srcView->image()->info().colorSpace; + if (unlikely(m_device->isDebugEnabled())) { ctx.cmd->cmdInsertDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer, vk::makeLabel(0xdcc0f0, "Swapchain blit")); diff --git a/src/dxvk/dxvk_swapchain_blitter.h b/src/dxvk/dxvk_swapchain_blitter.h index 9db9bb6a7..5f38a7ee0 100644 --- a/src/dxvk/dxvk_swapchain_blitter.h +++ b/src/dxvk/dxvk_swapchain_blitter.h @@ -93,7 +93,6 @@ namespace dxvk { * The swap chain image will remain bound for rendering. * \param [in] ctx Context objects * \param [in] dstView Swap chain image view - * \param [in] dstColorSpace Swap chain color space * \param [in] dstRect Destination rectangle * \param [in] srcView Image to present * \param [in] srcColorSpace Image color space @@ -102,10 +101,8 @@ namespace dxvk { void beginPresent( const DxvkContextObjects& ctx, const Rc& dstView, - VkColorSpaceKHR dstColorSpace, VkRect2D dstRect, const Rc& srcView, - VkColorSpaceKHR srcColorSpace, VkRect2D srcRect); /** @@ -114,12 +111,10 @@ namespace dxvk { * Finishes rendering and prepares the image for presentation. * \param [in] ctx Context objects * \param [in] dstView Swap chain image view - * \param [in] dstColorSpace Swap chain color space */ void endPresent( const DxvkContextObjects& ctx, - const Rc& dstView, - VkColorSpaceKHR dstColorSpace); + const Rc& dstView); /** * \brief Sets gamma ramp @@ -211,10 +206,8 @@ namespace dxvk { void performDraw( const DxvkContextObjects& ctx, const Rc& dstView, - VkColorSpaceKHR dstColorSpace, VkRect2D dstRect, const Rc& srcView, - VkColorSpaceKHR srcColorSpace, VkRect2D srcRect, VkBool32 enableBlending); diff --git a/src/dxvk/hud/dxvk_hud.cpp b/src/dxvk/hud/dxvk_hud.cpp index 16aab06aa..643942d71 100644 --- a/src/dxvk/hud/dxvk_hud.cpp +++ b/src/dxvk/hud/dxvk_hud.cpp @@ -41,13 +41,12 @@ namespace dxvk::hud { void Hud::render( const DxvkContextObjects& ctx, - const Rc& dstView, - VkColorSpaceKHR dstColorSpace) { - auto key = m_renderer.getPipelineKey(dstView, dstColorSpace); + const Rc& dstView) { + auto key = m_renderer.getPipelineKey(dstView); - m_renderer.beginFrame(ctx, dstView, dstColorSpace, m_options); + m_renderer.beginFrame(ctx, dstView, m_options); m_hudItems.render(ctx, key, m_options, m_renderer); - m_renderer.flushDraws(ctx, dstView, dstColorSpace, m_options); + m_renderer.flushDraws(ctx, dstView, m_options); } diff --git a/src/dxvk/hud/dxvk_hud.h b/src/dxvk/hud/dxvk_hud.h index 06668f2a1..75fc6b4a9 100644 --- a/src/dxvk/hud/dxvk_hud.h +++ b/src/dxvk/hud/dxvk_hud.h @@ -35,12 +35,10 @@ namespace dxvk::hud { * Renders the HUD to the given context. * \param [in] ctx Context objects for rendering * \param [in] dstView Swap chain image view - * \param [in] dstColorSpace Color space */ void render( const DxvkContextObjects& ctx, - const Rc& dstView, - VkColorSpaceKHR dstColorSpace); + const Rc& dstView); /** * \brief Adds a HUD item if enabled diff --git a/src/dxvk/hud/dxvk_hud_renderer.cpp b/src/dxvk/hud/dxvk_hud_renderer.cpp index fa5159794..19c283e6c 100644 --- a/src/dxvk/hud/dxvk_hud_renderer.cpp +++ b/src/dxvk/hud/dxvk_hud_renderer.cpp @@ -57,7 +57,6 @@ namespace dxvk::hud { void HudRenderer::beginFrame( const DxvkContextObjects& ctx, const Rc& dstView, - VkColorSpaceKHR dstColorSpace, const HudOptions& options) { if (unlikely(m_device->isDebugEnabled())) { ctx.cmd->cmdInsertDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer, @@ -116,7 +115,6 @@ namespace dxvk::hud { void HudRenderer::flushDraws( const DxvkContextObjects& ctx, const Rc& dstView, - VkColorSpaceKHR dstColorSpace, const HudOptions& options) { if (m_textDraws.empty()) return; @@ -192,7 +190,7 @@ namespace dxvk::hud { VkDescriptorBufferInfo textBufferDescriptor = m_textBuffer->getDescriptor(textSizeAligned, drawInfoSize).buffer; VkDescriptorBufferInfo drawBufferDescriptor = m_textBuffer->getDescriptor(drawArgOffset, drawArgWriteSize).buffer; - drawTextIndirect(ctx, getPipelineKey(dstView, dstColorSpace), + drawTextIndirect(ctx, getPipelineKey(dstView), drawBufferDescriptor, textBufferDescriptor, m_textBufferView->handle(), m_textDraws.size()); @@ -261,11 +259,10 @@ namespace dxvk::hud { HudPipelineKey HudRenderer::getPipelineKey( - const Rc& dstView, - VkColorSpaceKHR dstColorSpace) const { + const Rc& dstView) const { HudPipelineKey key; key.format = dstView->info().format; - key.colorSpace = dstColorSpace; + key.colorSpace = dstView->image()->info().colorSpace; return key; } diff --git a/src/dxvk/hud/dxvk_hud_renderer.h b/src/dxvk/hud/dxvk_hud_renderer.h index 068a0518f..289d574dc 100644 --- a/src/dxvk/hud/dxvk_hud_renderer.h +++ b/src/dxvk/hud/dxvk_hud_renderer.h @@ -103,7 +103,6 @@ namespace dxvk::hud { void beginFrame( const DxvkContextObjects& ctx, const Rc& dstView, - VkColorSpaceKHR dstColorSpace, const HudOptions& options); void drawText( @@ -123,12 +122,10 @@ namespace dxvk::hud { void flushDraws( const DxvkContextObjects& ctx, const Rc& dstView, - VkColorSpaceKHR dstColorSpace, const HudOptions& options); HudPipelineKey getPipelineKey( - const Rc& dstView, - VkColorSpaceKHR dstColorSpace) const; + const Rc& dstView) const; HudSpecConstants getSpecConstants( const HudPipelineKey& key) const;