mirror of
https://github.com/hyprwm/Hyprland.git
synced 2025-08-12 02:25:54 -07:00
renderer: Do not set hdr metadata unless needed (#9014)
This commit is contained in:
@@ -194,13 +194,13 @@ CColorManagementSurface::CColorManagementSurface(SP<CXxColorManagementSurfaceV4>
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_hasImageDescription = true;
|
setHasImageDescription(true);
|
||||||
m_imageDescription = imageDescription->get()->settings;
|
m_imageDescription = imageDescription->get()->settings;
|
||||||
});
|
});
|
||||||
resource->setUnsetImageDescription([this](CXxColorManagementSurfaceV4* r) {
|
resource->setUnsetImageDescription([this](CXxColorManagementSurfaceV4* r) {
|
||||||
LOGM(TRACE, "Unset image description for surface={}", (uintptr_t)r);
|
LOGM(TRACE, "Unset image description for surface={}", (uintptr_t)r);
|
||||||
m_imageDescription = SImageDescription{};
|
m_imageDescription = SImageDescription{};
|
||||||
m_hasImageDescription = false;
|
setHasImageDescription(false);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -222,6 +222,24 @@ bool CColorManagementSurface::hasImageDescription() {
|
|||||||
return m_hasImageDescription;
|
return m_hasImageDescription;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CColorManagementSurface::setHasImageDescription(bool has) {
|
||||||
|
m_hasImageDescription = has;
|
||||||
|
m_needsNewMetadata = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const hdr_output_metadata& CColorManagementSurface::hdrMetadata() {
|
||||||
|
return m_hdrMetadata;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CColorManagementSurface::setHDRMetadata(const hdr_output_metadata& metadata) {
|
||||||
|
m_hdrMetadata = metadata;
|
||||||
|
m_needsNewMetadata = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CColorManagementSurface::needsHdrMetadataUpdate() {
|
||||||
|
return m_needsNewMetadata;
|
||||||
|
}
|
||||||
|
|
||||||
CColorManagementFeedbackSurface::CColorManagementFeedbackSurface(SP<CXxColorManagementFeedbackSurfaceV4> resource_, SP<CWLSurfaceResource> surface_) :
|
CColorManagementFeedbackSurface::CColorManagementFeedbackSurface(SP<CXxColorManagementFeedbackSurfaceV4> resource_, SP<CWLSurfaceResource> surface_) :
|
||||||
surface(surface_), resource(resource_) {
|
surface(surface_), resource(resource_) {
|
||||||
if (!good())
|
if (!good())
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <drm_mode.h>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
@@ -54,12 +55,18 @@ class CColorManagementSurface {
|
|||||||
|
|
||||||
const SImageDescription& imageDescription();
|
const SImageDescription& imageDescription();
|
||||||
bool hasImageDescription();
|
bool hasImageDescription();
|
||||||
|
void setHasImageDescription(bool has);
|
||||||
|
const hdr_output_metadata& hdrMetadata();
|
||||||
|
void setHDRMetadata(const hdr_output_metadata& metadata);
|
||||||
|
bool needsHdrMetadataUpdate();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SP<CXxColorManagementSurfaceV4> resource;
|
SP<CXxColorManagementSurfaceV4> resource;
|
||||||
wl_client* pClient = nullptr;
|
wl_client* pClient = nullptr;
|
||||||
SImageDescription m_imageDescription;
|
SImageDescription m_imageDescription;
|
||||||
bool m_hasImageDescription = false;
|
bool m_hasImageDescription = false;
|
||||||
|
bool m_needsNewMetadata = false;
|
||||||
|
hdr_output_metadata m_hdrMetadata;
|
||||||
|
|
||||||
friend class CFrogColorManagementSurface;
|
friend class CFrogColorManagementSurface;
|
||||||
};
|
};
|
||||||
|
@@ -92,7 +92,7 @@ CFrogColorManagementSurface::CFrogColorManagementSurface(SP<CFrogColorManagedSur
|
|||||||
case FROG_COLOR_MANAGED_SURFACE_TRANSFER_FUNCTION_SRGB:
|
case FROG_COLOR_MANAGED_SURFACE_TRANSFER_FUNCTION_SRGB:
|
||||||
surface->colorManagement->m_imageDescription.transferFunction = XX_COLOR_MANAGER_V4_TRANSFER_FUNCTION_SRGB;
|
surface->colorManagement->m_imageDescription.transferFunction = XX_COLOR_MANAGER_V4_TRANSFER_FUNCTION_SRGB;
|
||||||
|
|
||||||
surface->colorManagement->m_hasImageDescription = true;
|
surface->colorManagement->setHasImageDescription(true);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
resource->setSetKnownContainerColorVolume([this](CFrogColorManagedSurface* r, frogColorManagedSurfacePrimaries primariesName) {
|
resource->setSetKnownContainerColorVolume([this](CFrogColorManagedSurface* r, frogColorManagedSurfacePrimaries primariesName) {
|
||||||
@@ -103,12 +103,12 @@ CFrogColorManagementSurface::CFrogColorManagementSurface(SP<CFrogColorManagedSur
|
|||||||
case FROG_COLOR_MANAGED_SURFACE_PRIMARIES_REC2020: surface->colorManagement->m_imageDescription.primaries = NColorPrimaries::BT2020; break;
|
case FROG_COLOR_MANAGED_SURFACE_PRIMARIES_REC2020: surface->colorManagement->m_imageDescription.primaries = NColorPrimaries::BT2020; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
surface->colorManagement->m_hasImageDescription = true;
|
surface->colorManagement->setHasImageDescription(true);
|
||||||
});
|
});
|
||||||
resource->setSetRenderIntent([this](CFrogColorManagedSurface* r, frogColorManagedSurfaceRenderIntent intent) {
|
resource->setSetRenderIntent([this](CFrogColorManagedSurface* r, frogColorManagedSurfaceRenderIntent intent) {
|
||||||
LOGM(TRACE, "Set frog cm intent {}", (uint32_t)intent);
|
LOGM(TRACE, "Set frog cm intent {}", (uint32_t)intent);
|
||||||
pqIntentSent = intent == FROG_COLOR_MANAGED_SURFACE_RENDER_INTENT_PERCEPTUAL;
|
pqIntentSent = intent == FROG_COLOR_MANAGED_SURFACE_RENDER_INTENT_PERCEPTUAL;
|
||||||
surface->colorManagement->m_hasImageDescription = true;
|
surface->colorManagement->setHasImageDescription(true);
|
||||||
});
|
});
|
||||||
resource->setSetHdrMetadata([this](CFrogColorManagedSurface* r, uint32_t r_x, uint32_t r_y, uint32_t g_x, uint32_t g_y, uint32_t b_x, uint32_t b_y, uint32_t w_x, uint32_t w_y,
|
resource->setSetHdrMetadata([this](CFrogColorManagedSurface* r, uint32_t r_x, uint32_t r_y, uint32_t g_x, uint32_t g_y, uint32_t b_x, uint32_t b_y, uint32_t w_x, uint32_t w_y,
|
||||||
uint32_t max_lum, uint32_t min_lum, uint32_t cll, uint32_t fall) {
|
uint32_t max_lum, uint32_t min_lum, uint32_t cll, uint32_t fall) {
|
||||||
@@ -122,7 +122,7 @@ CFrogColorManagementSurface::CFrogColorManagementSurface(SP<CFrogColorManagedSur
|
|||||||
surface->colorManagement->m_imageDescription.maxCLL = cll;
|
surface->colorManagement->m_imageDescription.maxCLL = cll;
|
||||||
surface->colorManagement->m_imageDescription.maxFALL = fall;
|
surface->colorManagement->m_imageDescription.maxFALL = fall;
|
||||||
|
|
||||||
surface->colorManagement->m_hasImageDescription = true;
|
surface->colorManagement->setHasImageDescription(true);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1460,9 +1460,10 @@ bool CHyprRenderer::commitPendingAndDoExplicitSync(PHLMONITOR pMonitor) {
|
|||||||
pMonitor->output->state->setExplicitInFence(inFD);
|
pMonitor->output->state->setExplicitInFence(inFD);
|
||||||
|
|
||||||
static auto PWIDE = CConfigValue<Hyprlang::INT>("experimental:wide_color_gamut");
|
static auto PWIDE = CConfigValue<Hyprlang::INT>("experimental:wide_color_gamut");
|
||||||
if (pMonitor->output->state->state().wideColorGamut != *PWIDE)
|
if (pMonitor->output->state->state().wideColorGamut != *PWIDE) {
|
||||||
Debug::log(TRACE, "Setting wide color gamut {}", *PWIDE ? "on" : "off");
|
Debug::log(TRACE, "Setting wide color gamut {}", *PWIDE ? "on" : "off");
|
||||||
pMonitor->output->state->setWideColorGamut(*PWIDE);
|
pMonitor->output->state->setWideColorGamut(*PWIDE);
|
||||||
|
}
|
||||||
|
|
||||||
static auto PHDR = CConfigValue<Hyprlang::INT>("experimental:hdr");
|
static auto PHDR = CConfigValue<Hyprlang::INT>("experimental:hdr");
|
||||||
|
|
||||||
@@ -1472,12 +1473,20 @@ bool CHyprRenderer::commitPendingAndDoExplicitSync(PHLMONITOR pMonitor) {
|
|||||||
if (pMonitor->activeWorkspace && pMonitor->activeWorkspace->m_bHasFullscreenWindow && pMonitor->activeWorkspace->m_efFullscreenMode == FSMODE_FULLSCREEN) {
|
if (pMonitor->activeWorkspace && pMonitor->activeWorkspace->m_bHasFullscreenWindow && pMonitor->activeWorkspace->m_efFullscreenMode == FSMODE_FULLSCREEN) {
|
||||||
const auto WINDOW = pMonitor->activeWorkspace->getFullscreenWindow();
|
const auto WINDOW = pMonitor->activeWorkspace->getFullscreenWindow();
|
||||||
const auto SURF = WINDOW->m_pWLSurface->resource();
|
const auto SURF = WINDOW->m_pWLSurface->resource();
|
||||||
if (SURF->colorManagement.valid() && SURF->colorManagement->hasImageDescription())
|
if (SURF->colorManagement.valid() && SURF->colorManagement->hasImageDescription()) {
|
||||||
pMonitor->output->state->setHDRMetadata(createHDRMetadata(SURF->colorManagement.get()->imageDescription(), pMonitor->output->parsedEDID));
|
bool needsHdrMetadataUpdate = SURF->colorManagement->needsHdrMetadataUpdate() || m_previousFSWindow != WINDOW;
|
||||||
else
|
if (SURF->colorManagement->needsHdrMetadataUpdate())
|
||||||
|
SURF->colorManagement->setHDRMetadata(createHDRMetadata(SURF->colorManagement.get()->imageDescription(), pMonitor->output->parsedEDID));
|
||||||
|
if (needsHdrMetadataUpdate)
|
||||||
|
pMonitor->output->state->setHDRMetadata(SURF->colorManagement->hdrMetadata());
|
||||||
|
} else
|
||||||
pMonitor->output->state->setHDRMetadata(*PHDR ? createHDRMetadata(2, pMonitor->output->parsedEDID) : createHDRMetadata(0, pMonitor->output->parsedEDID));
|
pMonitor->output->state->setHDRMetadata(*PHDR ? createHDRMetadata(2, pMonitor->output->parsedEDID) : createHDRMetadata(0, pMonitor->output->parsedEDID));
|
||||||
} else
|
m_previousFSWindow = WINDOW;
|
||||||
pMonitor->output->state->setHDRMetadata(*PHDR ? createHDRMetadata(2, pMonitor->output->parsedEDID) : createHDRMetadata(0, pMonitor->output->parsedEDID));
|
} else {
|
||||||
|
if ((pMonitor->output->state->state().hdrMetadata.hdmi_metadata_type1.eotf == 2) != *PHDR)
|
||||||
|
pMonitor->output->state->setHDRMetadata(*PHDR ? createHDRMetadata(2, pMonitor->output->parsedEDID) : createHDRMetadata(0, pMonitor->output->parsedEDID));
|
||||||
|
m_previousFSWindow.reset();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pMonitor->ctmUpdated) {
|
if (pMonitor->ctmUpdated) {
|
||||||
|
@@ -129,6 +129,7 @@ class CHyprRenderer {
|
|||||||
|
|
||||||
bool commitPendingAndDoExplicitSync(PHLMONITOR pMonitor);
|
bool commitPendingAndDoExplicitSync(PHLMONITOR pMonitor);
|
||||||
|
|
||||||
|
WP<CWindow> m_previousFSWindow;
|
||||||
bool m_bCursorHidden = false;
|
bool m_bCursorHidden = false;
|
||||||
bool m_bCursorHasSurface = false;
|
bool m_bCursorHasSurface = false;
|
||||||
SP<CRenderbuffer> m_pCurrentRenderbuffer = nullptr;
|
SP<CRenderbuffer> m_pCurrentRenderbuffer = nullptr;
|
||||||
|
Reference in New Issue
Block a user