summaryrefslogtreecommitdiff
path: root/src/backends/native
diff options
context:
space:
mode:
authorSebastian Wick <sebastian.wick@redhat.com>2023-02-18 02:14:27 +0100
committerMarge Bot <marge-bot@gnome.org>2023-02-23 17:20:36 +0000
commit8ccbc21d232e8cce27570f33f1c213920249f94b (patch)
tree3b2d23e57d9db781803c54b344a6156f96ff6d65 /src/backends/native
parent0180ffdaa1566b0770777bb796ca228c9393274e (diff)
downloadmutter-8ccbc21d232e8cce27570f33f1c213920249f94b.tar.gz
backends/native: Use MetaKmsCrtcGamma for the KMS gamma color update
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2861>
Diffstat (limited to 'src/backends/native')
-rw-r--r--src/backends/native/meta-crtc-kms.c28
-rw-r--r--src/backends/native/meta-kms-crtc.c74
-rw-r--r--src/backends/native/meta-kms-crtc.h25
-rw-r--r--src/backends/native/meta-kms-update.c15
4 files changed, 74 insertions, 68 deletions
diff --git a/src/backends/native/meta-crtc-kms.c b/src/backends/native/meta-crtc-kms.c
index 561407f48..8199cc689 100644
--- a/src/backends/native/meta-crtc-kms.c
+++ b/src/backends/native/meta-crtc-kms.c
@@ -130,9 +130,16 @@ meta_crtc_kms_get_gamma_lut (MetaCrtc *crtc)
crtc_gamma =
meta_monitor_manager_native_get_cached_crtc_gamma (monitor_manager_native,
crtc_kms);
+ if (!crtc_gamma)
+ {
+ crtc_state = meta_kms_crtc_get_current_state (kms_crtc);
+ crtc_gamma = crtc_state->gamma.value;
+ }
+
+ lut = g_new0 (MetaGammaLut, 1);
+
if (crtc_gamma)
{
- lut = g_new0 (MetaGammaLut, 1);
lut->size = crtc_gamma->size;
lut->red = g_memdup2 (crtc_gamma->red,
lut->size * sizeof (uint16_t));
@@ -140,19 +147,14 @@ meta_crtc_kms_get_gamma_lut (MetaCrtc *crtc)
lut->size * sizeof (uint16_t));
lut->blue = g_memdup2 (crtc_gamma->blue,
lut->size * sizeof (uint16_t));
- return lut;
}
-
- crtc_state = meta_kms_crtc_get_current_state (kms_crtc);
-
- lut = g_new0 (MetaGammaLut, 1);
- lut->size = crtc_state->gamma.size;
- lut->red = g_memdup2 (crtc_state->gamma.red,
- lut->size * sizeof (uint16_t));
- lut->green = g_memdup2 (crtc_state->gamma.green,
- lut->size * sizeof (uint16_t));
- lut->blue = g_memdup2 (crtc_state->gamma.blue,
- lut->size * sizeof (uint16_t));
+ else
+ {
+ lut->size = 0;
+ lut->red = NULL;
+ lut->green = NULL;
+ lut->blue = NULL;
+ }
return lut;
}
diff --git a/src/backends/native/meta-kms-crtc.c b/src/backends/native/meta-kms-crtc.c
index 1562a50aa..da287b2b2 100644
--- a/src/backends/native/meta-kms-crtc.c
+++ b/src/backends/native/meta-kms-crtc.c
@@ -107,21 +107,32 @@ read_gamma_state (MetaKmsCrtc *crtc,
MetaKmsImplDevice *impl_device,
drmModeCrtc *drm_crtc)
{
- g_assert (!crtc_state->gamma.red &&
- !crtc_state->gamma.green &&
- !crtc_state->gamma.blue);
+ g_assert (crtc_state->gamma.value == NULL);
crtc_state->gamma.size = drm_crtc->gamma_size;
- crtc_state->gamma.red = g_new0 (uint16_t, drm_crtc->gamma_size);
- crtc_state->gamma.green = g_new0 (uint16_t, drm_crtc->gamma_size);
- crtc_state->gamma.blue = g_new0 (uint16_t, drm_crtc->gamma_size);
+ crtc_state->gamma.supported = drm_crtc->gamma_size != 0;
+ crtc_state->gamma.value = meta_kms_crtc_gamma_new (drm_crtc->gamma_size,
+ NULL, NULL, NULL);
+
+ crtc_state->gamma.value->red = g_new0 (uint16_t, drm_crtc->gamma_size);
+ crtc_state->gamma.value->green = g_new0 (uint16_t, drm_crtc->gamma_size);
+ crtc_state->gamma.value->blue = g_new0 (uint16_t, drm_crtc->gamma_size);
drmModeCrtcGetGamma (meta_kms_impl_device_get_fd (impl_device),
crtc->id,
- crtc_state->gamma.size,
- crtc_state->gamma.red,
- crtc_state->gamma.green,
- crtc_state->gamma.blue);
+ crtc_state->gamma.value->size,
+ crtc_state->gamma.value->red,
+ crtc_state->gamma.value->green,
+ crtc_state->gamma.value->blue);
+}
+
+static gboolean
+gamma_equal (MetaKmsCrtcState *state,
+ MetaKmsCrtcState *other_state)
+{
+ return state->gamma.size == other_state->gamma.size &&
+ state->gamma.supported == other_state->gamma.supported &&
+ meta_kms_crtc_gamma_equal (state->gamma.value, other_state->gamma.value);
}
static MetaKmsResourceChanges
@@ -140,33 +151,12 @@ meta_kms_crtc_state_changes (MetaKmsCrtcState *state,
if (!meta_drm_mode_equal (&state->drm_mode, &other_state->drm_mode))
return META_KMS_RESOURCE_CHANGE_FULL;
- if (state->gamma.size != other_state->gamma.size)
- return META_KMS_RESOURCE_CHANGE_GAMMA;
-
- if (memcmp (state->gamma.blue, other_state->gamma.blue,
- state->gamma.size * sizeof (uint16_t)) != 0)
- return META_KMS_RESOURCE_CHANGE_GAMMA;
-
- if (memcmp (state->gamma.green, other_state->gamma.green,
- state->gamma.size * sizeof (uint16_t)) != 0)
- return META_KMS_RESOURCE_CHANGE_GAMMA;
-
- if (memcmp (state->gamma.red, other_state->gamma.red,
- state->gamma.size * sizeof (uint16_t)) != 0)
+ if (!gamma_equal (state, other_state))
return META_KMS_RESOURCE_CHANGE_GAMMA;
return META_KMS_RESOURCE_CHANGE_NONE;
}
-static void
-clear_gamma_state (MetaKmsCrtcState *crtc_state)
-{
- crtc_state->gamma.size = 0;
- g_clear_pointer (&crtc_state->gamma.red, g_free);
- g_clear_pointer (&crtc_state->gamma.green, g_free);
- g_clear_pointer (&crtc_state->gamma.blue, g_free);
-}
-
static MetaKmsResourceChanges
meta_kms_crtc_read_state (MetaKmsCrtc *crtc,
MetaKmsImplDevice *impl_device,
@@ -213,7 +203,8 @@ meta_kms_crtc_read_state (MetaKmsCrtc *crtc,
changes = meta_kms_crtc_state_changes (&crtc->current_state, &crtc_state);
}
- clear_gamma_state (&crtc->current_state);
+ g_clear_pointer (&crtc->current_state.gamma.value,
+ meta_kms_crtc_gamma_free);
crtc->current_state = crtc_state;
meta_topic (META_DEBUG_KMS,
@@ -322,15 +313,11 @@ meta_kms_crtc_predict_state_in_impl (MetaKmsCrtc *crtc,
if (color_update->crtc != crtc)
continue;
- clear_gamma_state (&crtc->current_state);
- crtc->current_state.gamma.size = gamma->size;
- crtc->current_state.gamma.red =
- g_memdup2 (gamma->red, gamma->size * sizeof (uint16_t));
- crtc->current_state.gamma.green =
- g_memdup2 (gamma->green, gamma->size * sizeof (uint16_t));
- crtc->current_state.gamma.blue =
- g_memdup2 (gamma->blue, gamma->size * sizeof (uint16_t));
-
+ g_clear_pointer (&crtc->current_state.gamma.value, meta_kms_crtc_gamma_free);
+ crtc->current_state.gamma.value = meta_kms_crtc_gamma_new (gamma->size,
+ gamma->red,
+ gamma->green,
+ gamma->blue);
break;
}
}
@@ -402,7 +389,7 @@ meta_kms_crtc_finalize (GObject *object)
{
MetaKmsCrtc *crtc = META_KMS_CRTC (object);
- clear_gamma_state (&crtc->current_state);
+ g_clear_pointer (&crtc->current_state.gamma.value, meta_kms_crtc_gamma_free);
G_OBJECT_CLASS (meta_kms_crtc_parent_class)->finalize (object);
}
@@ -411,6 +398,7 @@ static void
meta_kms_crtc_init (MetaKmsCrtc *crtc)
{
crtc->current_state.gamma.size = 0;
+ crtc->current_state.gamma.value = NULL;
}
static void
diff --git a/src/backends/native/meta-kms-crtc.h b/src/backends/native/meta-kms-crtc.h
index 83f1899eb..def285685 100644
--- a/src/backends/native/meta-kms-crtc.h
+++ b/src/backends/native/meta-kms-crtc.h
@@ -28,6 +28,14 @@
#include "core/util-private.h"
#include "meta/boxes.h"
+typedef struct _MetaKmsCrtcGamma
+{
+ int size;
+ uint16_t *red;
+ uint16_t *green;
+ uint16_t *blue;
+} MetaKmsCrtcGamma;
+
typedef struct _MetaKmsCrtcState
{
gboolean is_active;
@@ -37,22 +45,12 @@ typedef struct _MetaKmsCrtcState
drmModeModeInfo drm_mode;
struct {
- uint16_t *red;
- uint16_t *green;
- uint16_t *blue;
-
+ MetaKmsCrtcGamma *value;
int size;
+ gboolean supported;
} gamma;
} MetaKmsCrtcState;
-typedef struct _MetaKmsCrtcGamma
-{
- int size;
- uint16_t *red;
- uint16_t *green;
- uint16_t *blue;
-} MetaKmsCrtcGamma;
-
#define META_TYPE_KMS_CRTC (meta_kms_crtc_get_type ())
META_EXPORT_TEST
G_DECLARE_FINAL_TYPE (MetaKmsCrtc, meta_kms_crtc,
@@ -80,4 +78,7 @@ MetaKmsCrtcGamma * meta_kms_crtc_gamma_new (int size,
const uint16_t *green,
const uint16_t *blue);
+gboolean meta_kms_crtc_gamma_equal (MetaKmsCrtcGamma *gamma,
+ MetaKmsCrtcGamma *other_gamma);
+
#endif /* META_KMS_CRTC_H */
diff --git a/src/backends/native/meta-kms-update.c b/src/backends/native/meta-kms-update.c
index 8c7647059..226bf478b 100644
--- a/src/backends/native/meta-kms-update.c
+++ b/src/backends/native/meta-kms-update.c
@@ -397,6 +397,8 @@ ensure_color_update (MetaKmsUpdate *update,
void
meta_kms_crtc_gamma_free (MetaKmsCrtcGamma *gamma)
{
+ g_return_if_fail (gamma != NULL);
+
g_free (gamma->red);
g_free (gamma->green);
g_free (gamma->blue);
@@ -422,6 +424,19 @@ meta_kms_crtc_gamma_new (int size,
return gamma;
}
+gboolean
+meta_kms_crtc_gamma_equal (MetaKmsCrtcGamma *gamma,
+ MetaKmsCrtcGamma *other_gamma)
+{
+ return gamma->size == other_gamma->size &&
+ memcmp (gamma->red, other_gamma->red,
+ gamma->size * sizeof (uint16_t)) == 0 &&
+ memcmp (gamma->green, other_gamma->green,
+ gamma->size * sizeof (uint16_t)) == 0 &&
+ memcmp (gamma->blue, other_gamma->blue,
+ gamma->size * sizeof (uint16_t)) == 0;
+}
+
void
meta_kms_update_set_crtc_gamma (MetaKmsUpdate *update,
MetaKmsCrtc *crtc,