From c2665304c3c28431dc1dcf87c64472691edc53ef Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Thu, 15 Dec 2022 09:00:26 +0000 Subject: [PATCH] rendervulkan: Hook up colorspace mask --- src/rendervulkan.cpp | 2 +- src/rendervulkan.hpp | 11 +++++++++++ src/steamcompmgr.cpp | 12 ++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/rendervulkan.cpp b/src/rendervulkan.cpp index de3ccbe..975a820 100644 --- a/src/rendervulkan.cpp +++ b/src/rendervulkan.cpp @@ -3352,7 +3352,7 @@ bool vulkan_composite( const struct FrameInfo_t *frameInfo, std::shared_ptrbindPipeline( g_device.pipeline(SHADER_TYPE_BLIT, frameInfo->layerCount, frameInfo->ycbcrMask())); + cmdBuffer->bindPipeline( g_device.pipeline(SHADER_TYPE_BLIT, frameInfo->layerCount, frameInfo->ycbcrMask(), 0u, frameInfo->colorspaceMask())); bind_all_layers(cmdBuffer.get(), frameInfo); cmdBuffer->bindTarget(compositeImage); cmdBuffer->pushConstants(frameInfo); diff --git a/src/rendervulkan.hpp b/src/rendervulkan.hpp index 3cdd763..e3d7e78 100644 --- a/src/rendervulkan.hpp +++ b/src/rendervulkan.hpp @@ -79,6 +79,7 @@ enum GamescopeAppTextureColorspace { GAMESCOPE_APP_TEXTURE_COLORSPACE_SCRGB, GAMESCOPE_APP_TEXTURE_COLORSPACE_HDR10_PQ, }; +const uint32_t GamescopeAppTextureColorspace_Bits = 2; inline GamescopeAppTextureColorspace VkColorSpaceToGamescopeAppTextureColorSpace(VkColorSpaceKHR colorspace) { @@ -229,6 +230,8 @@ struct FrameInfo_t bool blackBorder; bool linearFilter; + GamescopeAppTextureColorspace colorspace; + bool isYcbcr() const { if ( !tex ) @@ -265,6 +268,14 @@ struct FrameInfo_t } return result; } + uint32_t colorspaceMask() const { + uint32_t result = 0; + for (int i = 0; i < layerCount; i++) + { + result |= layers[ i ].colorspace << i * GamescopeAppTextureColorspace_Bits; + } + return result; + } }; extern bool g_bIsCompositeDebug; diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp index 1d50188..a3ee920 100644 --- a/src/steamcompmgr.cpp +++ b/src/steamcompmgr.cpp @@ -173,6 +173,14 @@ struct commit_t wlserver_unlock(); } + GamescopeAppTextureColorspace colorspace() const + { + if (feedback) + return VkColorSpaceToGamescopeAppTextureColorSpace(feedback->vk_colorspace); + + return GAMESCOPE_APP_TEXTURE_COLORSPACE_SRGB; + } + struct wlr_buffer *buf = nullptr; uint32_t fb_id = 0; std::shared_ptr vulkanTex; @@ -1400,6 +1408,7 @@ void MouseCursor::paint(win *window, win *fit, struct FrameInfo_t *frameInfo) layer->linearFilter = false; layer->blackBorder = false; + layer->colorspace = GAMESCOPE_APP_TEXTURE_COLORSPACE_SRGB; } void MouseCursor::updateCursorFeedback( bool bForce ) @@ -1443,6 +1452,7 @@ paint_cached_base_layer(const std::shared_ptr& commit, const BaseLayer layer->offset.y = base.offset[1]; layer->opacity = base.opacity * flOpacityScale; + layer->colorspace = commit->colorspace(); layer->tex = commit->vulkanTex; layer->fbid = commit->fb_id; @@ -1616,6 +1626,7 @@ paint_window(win *w, win *scaleW, struct FrameInfo_t *frameInfo, layer->fbid = lastCommit->fb_id; layer->linearFilter = (w->isOverlay || w->isExternalOverlay) ? true : g_upscaleFilter != GamescopeUpscaleFilter::NEAREST; + layer->colorspace = lastCommit->colorspace(); if ( flags & PaintWindowFlag::BasePlane ) { @@ -1964,6 +1975,7 @@ paint_all(bool async) layer->fbid = layer->tex->fbid(); layer->linearFilter = false; + layer->colorspace = GAMESCOPE_APP_TEXTURE_COLORSPACE_SRGB; int ret = drm_prepare( &g_DRM, async, &frameInfo );