backends/native: Handle gamma sizes independent of the KMS LUT

Allows for creating LUTs at some fixed size which maintains enough
precision for concatenating or otherwise manipulating the LUT without
having to care about the precision of the hardware.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2861>
This commit is contained in:
Sebastian Wick 2023-02-18 18:32:24 +01:00 committed by Marge Bot
parent 4eb581ffc1
commit abdd8c54f3
4 changed files with 63 additions and 15 deletions

View File

@ -218,6 +218,64 @@ meta_gamma_lut_copy (const MetaGammaLut *gamma)
return meta_gamma_lut_new (gamma->size, gamma->red, gamma->green, gamma->blue);
}
MetaGammaLut *
meta_gamma_lut_copy_to_size (const MetaGammaLut *gamma,
int target_size)
{
MetaGammaLut *out;
g_return_val_if_fail (gamma != NULL, NULL);
if (gamma->size == target_size)
return meta_gamma_lut_copy (gamma);
out = meta_gamma_lut_new (target_size, NULL, NULL, NULL);
out->red = g_new0 (uint16_t, target_size);
out->green = g_new0 (uint16_t, target_size);
out->blue = g_new0 (uint16_t, target_size);
if (target_size >= gamma->size)
{
int i, j;
int slots;
slots = target_size / gamma->size;
for (i = 0; i < gamma->size; i++)
{
for (j = 0; j < slots; j++)
{
out->red[i * slots + j] = gamma->red[i];
out->green[i * slots + j] = gamma->green[i];
out->blue[i * slots + j] = gamma->blue[i];
}
}
for (j = i * slots; j < target_size; j++)
{
out->red[j] = gamma->red[i - 1];
out->green[j] = gamma->green[i - 1];
out->blue[j] = gamma->blue[i - 1];
}
}
else
{
int i;
int idx;
for (i = 0; i < target_size; i++)
{
idx = i * (gamma->size - 1) / (target_size - 1);
out->red[i] = gamma->red[idx];
out->green[i] = gamma->green[idx];
out->blue[i] = gamma->blue[idx];
}
}
return out;
}
gboolean
meta_gamma_lut_equal (const MetaGammaLut *gamma,
const MetaGammaLut *other_gamma)

View File

@ -104,6 +104,9 @@ MetaGammaLut * meta_gamma_lut_new_sized (int size);
META_EXPORT_TEST
MetaGammaLut * meta_gamma_lut_copy (const MetaGammaLut *gamma);
MetaGammaLut * meta_gamma_lut_copy_to_size (const MetaGammaLut *gamma,
int target_size);
META_EXPORT_TEST
gboolean meta_gamma_lut_equal (const MetaGammaLut *gamma,
const MetaGammaLut *other_gamma);

View File

@ -206,27 +206,13 @@ meta_crtc_kms_set_gamma_lut (MetaCrtc *crtc,
const MetaGammaLut *lut)
{
MetaCrtcKms *crtc_kms = META_CRTC_KMS (crtc);
MetaKmsCrtc *kms_crtc = meta_crtc_kms_get_kms_crtc (crtc_kms);
MetaBackend *backend = meta_gpu_get_backend (meta_crtc_get_gpu (crtc));
MetaMonitorManagerNative *monitor_manager_native =
monitor_manager_from_crtc (crtc);
ClutterActor *stage = meta_backend_get_stage (backend);
const MetaKmsCrtcState *crtc_state;
g_autofree char *gamma_ramp_string = NULL;
MetaGammaLut *new_gamma;
crtc_state = meta_kms_crtc_get_current_state (kms_crtc);
if (lut->size != crtc_state->gamma.size)
{
MetaKmsDevice *kms_device = meta_kms_crtc_get_device (kms_crtc);
g_warning ("Tried to set a different gamma LUT size on %u (%s)",
meta_kms_crtc_get_id (kms_crtc),
meta_kms_device_get_path (kms_device));
return;
}
gamma_ramp_string = generate_gamma_ramp_string (lut);
meta_topic (META_DEBUG_COLOR,
"Setting CRTC (%" G_GUINT64_FORMAT ") gamma to %s",

View File

@ -401,12 +401,13 @@ meta_kms_update_set_crtc_gamma (MetaKmsUpdate *update,
{
MetaKmsCrtcColorUpdate *color_update;
MetaGammaLut *gamma_update = NULL;
const MetaKmsCrtcState *crtc_state = meta_kms_crtc_get_current_state (crtc);
g_assert (!meta_kms_update_is_locked (update));
g_assert (meta_kms_crtc_get_device (crtc) == update->device);
if (gamma)
gamma_update = meta_gamma_lut_copy (gamma);
gamma_update = meta_gamma_lut_copy_to_size (gamma, crtc_state->gamma.size);
color_update = ensure_color_update (update, crtc);
color_update->gamma.state = gamma_update;