summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorUjinT34 <41110182+UjinT34@users.noreply.github.com>2025-03-22 20:34:01 +0300
committerGitHub <noreply@github.com>2025-03-22 18:34:01 +0100
commit6ab5a0befb45e90eb45b8d6582e68d13147297dc (patch)
treef018d08a045b95f25e480dc9121dd0fc96e1902c /src
parent6384f4acf4e2988bcb35d3dfc5821f07867a34d0 (diff)
renderer: fix cm_fs_passthrough (#9698)
Diffstat (limited to 'src')
-rw-r--r--src/config/ConfigDescriptions.hpp4
-rw-r--r--src/config/ConfigManager.cpp2
-rw-r--r--src/render/OpenGL.cpp16
-rw-r--r--src/render/Renderer.cpp5
4 files changed, 15 insertions, 12 deletions
diff --git a/src/config/ConfigDescriptions.hpp b/src/config/ConfigDescriptions.hpp
index 77cd8667..54223c1c 100644
--- a/src/config/ConfigDescriptions.hpp
+++ b/src/config/ConfigDescriptions.hpp
@@ -1381,8 +1381,8 @@ inline static const std::vector<SConfigOptionDescription> CONFIG_OPTIONS = {
SConfigOptionDescription{
.value = "render:cm_fs_passthrough",
.description = "Passthrough color settings for fullscreen apps when possible",
- .type = CONFIG_OPTION_BOOL,
- .data = SConfigOptionDescription::SBoolData{true},
+ .type = CONFIG_OPTION_INT,
+ .data = SConfigOptionDescription::SRangeData{.value = 2, .min = 0, .max = 2},
},
SConfigOptionDescription{
.value = "render:cm_enabled",
diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp
index 35c5a502..983681c9 100644
--- a/src/config/ConfigManager.cpp
+++ b/src/config/ConfigManager.cpp
@@ -693,7 +693,7 @@ CConfigManager::CConfigManager() {
registerConfigVar("render:expand_undersized_textures", Hyprlang::INT{1});
registerConfigVar("render:xp_mode", Hyprlang::INT{0});
registerConfigVar("render:ctm_animation", Hyprlang::INT{2});
- registerConfigVar("render:cm_fs_passthrough", Hyprlang::INT{1});
+ registerConfigVar("render:cm_fs_passthrough", Hyprlang::INT{2});
registerConfigVar("render:cm_enabled", Hyprlang::INT{1});
registerConfigVar("ecosystem:no_update_news", Hyprlang::INT{0});
diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp
index e2f72fff..6f148ba9 100644
--- a/src/render/OpenGL.cpp
+++ b/src/render/OpenGL.cpp
@@ -1379,13 +1379,15 @@ void CHyprOpenGLImpl::renderTextureInternalWithDamage(SP<CTexture> tex, const CB
glTexParameteri(tex->m_iTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
}
- const bool SURFACE_HAS_CM = m_RenderData.surface && m_RenderData.surface->colorManagement && m_RenderData.surface->colorManagement->hasImageDescription();
-
- const bool skipCM = !*PENABLECM /* CM disabled by the user */
- || !m_RenderData.surface /* No surface - no point in CM */
- || !m_bCMSupported /* CM unsupported - hw failed to compile the shader probably */
- || (!SURFACE_HAS_CM && m_RenderData.pMonitor->imageDescription == SImageDescription{}) /* Surface doesn't have CM and monitor isn't CM'd */
- || (*PPASS && m_RenderData.pMonitor->activeWorkspace && m_RenderData.pMonitor->activeWorkspace->m_bHasFullscreenWindow &&
+ const auto imageDescription =
+ m_RenderData.surface.valid() && m_RenderData.surface->colorManagement.valid() ? m_RenderData.surface->colorManagement->imageDescription() : SImageDescription{};
+
+ const bool skipCM = !*PENABLECM /* CM disabled by the user */
+ || !m_RenderData.surface /* No surface - no point in CM */
+ || !m_bCMSupported /* CM unsupported - hw failed to compile the shader probably */
+ || (imageDescription == m_RenderData.pMonitor->imageDescription) /* Source and target have the same image description */
+ || ((*PPASS == 1 || (*PPASS == 2 && imageDescription.transferFunction == CM_TRANSFER_FUNCTION_ST2084_PQ)) && m_RenderData.pMonitor->activeWorkspace &&
+ m_RenderData.pMonitor->activeWorkspace->m_bHasFullscreenWindow &&
m_RenderData.pMonitor->activeWorkspace->m_efFullscreenMode == FSMODE_FULLSCREEN) /* Fullscreen window with pass cm enabled */;
glUseProgram(shader->program);
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp
index cf77c000..6f78e896 100644
--- a/src/render/Renderer.cpp
+++ b/src/render/Renderer.cpp
@@ -1460,14 +1460,15 @@ bool CHyprRenderer::commitPendingAndDoExplicitSync(PHLMONITOR pMonitor) {
const auto SURF =
ROOT_SURF->findFirstPreorder([ROOT_SURF](SP<CWLSurfaceResource> surf) { return surf->colorManagement.valid() && surf->extends() == ROOT_SURF->extends(); });
+ const bool wantHDR = PHDR && *PPASS == 2;
if (SURF && SURF->colorManagement.valid() && SURF->colorManagement->hasImageDescription()) {
bool needsHdrMetadataUpdate = SURF->colorManagement->needsHdrMetadataUpdate() || pMonitor->m_previousFSWindow != WINDOW;
if (SURF->colorManagement->needsHdrMetadataUpdate())
SURF->colorManagement->setHDRMetadata(createHDRMetadata(SURF->colorManagement->imageDescription(), pMonitor->output->parsedEDID));
if (needsHdrMetadataUpdate)
pMonitor->output->state->setHDRMetadata(SURF->colorManagement->hdrMetadata());
- } else if ((pMonitor->output->state->state().hdrMetadata.hdmi_metadata_type1.eotf == 2) != PHDR)
- pMonitor->output->state->setHDRMetadata(PHDR ? createHDRMetadata(pMonitor->imageDescription, pMonitor->output->parsedEDID) : NO_HDR_METADATA);
+ } else if ((pMonitor->output->state->state().hdrMetadata.hdmi_metadata_type1.eotf == 2) != wantHDR)
+ pMonitor->output->state->setHDRMetadata(wantHDR ? createHDRMetadata(pMonitor->imageDescription, pMonitor->output->parsedEDID) : NO_HDR_METADATA);
pMonitor->m_previousFSWindow = WINDOW;
} else {
if ((pMonitor->output->state->state().hdrMetadata.hdmi_metadata_type1.eotf == 2) != PHDR)