mirror of
https://github.com/hyprwm/Hyprland.git
synced 2025-05-19 08:30:22 -07:00
renderer: fix cm_fs_passthrough (#9698)
This commit is contained in:
parent
6384f4acf4
commit
6ab5a0befb
@ -1381,8 +1381,8 @@ inline static const std::vector<SConfigOptionDescription> CONFIG_OPTIONS = {
|
|||||||
SConfigOptionDescription{
|
SConfigOptionDescription{
|
||||||
.value = "render:cm_fs_passthrough",
|
.value = "render:cm_fs_passthrough",
|
||||||
.description = "Passthrough color settings for fullscreen apps when possible",
|
.description = "Passthrough color settings for fullscreen apps when possible",
|
||||||
.type = CONFIG_OPTION_BOOL,
|
.type = CONFIG_OPTION_INT,
|
||||||
.data = SConfigOptionDescription::SBoolData{true},
|
.data = SConfigOptionDescription::SRangeData{.value = 2, .min = 0, .max = 2},
|
||||||
},
|
},
|
||||||
SConfigOptionDescription{
|
SConfigOptionDescription{
|
||||||
.value = "render:cm_enabled",
|
.value = "render:cm_enabled",
|
||||||
|
@ -693,7 +693,7 @@ CConfigManager::CConfigManager() {
|
|||||||
registerConfigVar("render:expand_undersized_textures", Hyprlang::INT{1});
|
registerConfigVar("render:expand_undersized_textures", Hyprlang::INT{1});
|
||||||
registerConfigVar("render:xp_mode", Hyprlang::INT{0});
|
registerConfigVar("render:xp_mode", Hyprlang::INT{0});
|
||||||
registerConfigVar("render:ctm_animation", Hyprlang::INT{2});
|
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("render:cm_enabled", Hyprlang::INT{1});
|
||||||
|
|
||||||
registerConfigVar("ecosystem:no_update_news", Hyprlang::INT{0});
|
registerConfigVar("ecosystem:no_update_news", Hyprlang::INT{0});
|
||||||
|
@ -1379,13 +1379,15 @@ void CHyprOpenGLImpl::renderTextureInternalWithDamage(SP<CTexture> tex, const CB
|
|||||||
glTexParameteri(tex->m_iTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
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 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 */
|
const bool skipCM = !*PENABLECM /* CM disabled by the user */
|
||||||
|| !m_RenderData.surface /* No surface - no point in CM */
|
|| !m_RenderData.surface /* No surface - no point in CM */
|
||||||
|| !m_bCMSupported /* CM unsupported - hw failed to compile the shader probably */
|
|| !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 */
|
|| (imageDescription == m_RenderData.pMonitor->imageDescription) /* Source and target have the same image description */
|
||||||
|| (*PPASS && m_RenderData.pMonitor->activeWorkspace && m_RenderData.pMonitor->activeWorkspace->m_bHasFullscreenWindow &&
|
|| ((*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 */;
|
m_RenderData.pMonitor->activeWorkspace->m_efFullscreenMode == FSMODE_FULLSCREEN) /* Fullscreen window with pass cm enabled */;
|
||||||
|
|
||||||
glUseProgram(shader->program);
|
glUseProgram(shader->program);
|
||||||
|
@ -1460,14 +1460,15 @@ bool CHyprRenderer::commitPendingAndDoExplicitSync(PHLMONITOR pMonitor) {
|
|||||||
const auto SURF =
|
const auto SURF =
|
||||||
ROOT_SURF->findFirstPreorder([ROOT_SURF](SP<CWLSurfaceResource> surf) { return surf->colorManagement.valid() && surf->extends() == ROOT_SURF->extends(); });
|
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()) {
|
if (SURF && SURF->colorManagement.valid() && SURF->colorManagement->hasImageDescription()) {
|
||||||
bool needsHdrMetadataUpdate = SURF->colorManagement->needsHdrMetadataUpdate() || pMonitor->m_previousFSWindow != WINDOW;
|
bool needsHdrMetadataUpdate = SURF->colorManagement->needsHdrMetadataUpdate() || pMonitor->m_previousFSWindow != WINDOW;
|
||||||
if (SURF->colorManagement->needsHdrMetadataUpdate())
|
if (SURF->colorManagement->needsHdrMetadataUpdate())
|
||||||
SURF->colorManagement->setHDRMetadata(createHDRMetadata(SURF->colorManagement->imageDescription(), pMonitor->output->parsedEDID));
|
SURF->colorManagement->setHDRMetadata(createHDRMetadata(SURF->colorManagement->imageDescription(), pMonitor->output->parsedEDID));
|
||||||
if (needsHdrMetadataUpdate)
|
if (needsHdrMetadataUpdate)
|
||||||
pMonitor->output->state->setHDRMetadata(SURF->colorManagement->hdrMetadata());
|
pMonitor->output->state->setHDRMetadata(SURF->colorManagement->hdrMetadata());
|
||||||
} else if ((pMonitor->output->state->state().hdrMetadata.hdmi_metadata_type1.eotf == 2) != PHDR)
|
} else if ((pMonitor->output->state->state().hdrMetadata.hdmi_metadata_type1.eotf == 2) != wantHDR)
|
||||||
pMonitor->output->state->setHDRMetadata(PHDR ? createHDRMetadata(pMonitor->imageDescription, pMonitor->output->parsedEDID) : NO_HDR_METADATA);
|
pMonitor->output->state->setHDRMetadata(wantHDR ? createHDRMetadata(pMonitor->imageDescription, pMonitor->output->parsedEDID) : NO_HDR_METADATA);
|
||||||
pMonitor->m_previousFSWindow = WINDOW;
|
pMonitor->m_previousFSWindow = WINDOW;
|
||||||
} else {
|
} else {
|
||||||
if ((pMonitor->output->state->state().hdrMetadata.hdmi_metadata_type1.eotf == 2) != PHDR)
|
if ((pMonitor->output->state->state().hdrMetadata.hdmi_metadata_type1.eotf == 2) != PHDR)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user