From b7fe653aac6c39806b41fa46f983904ceffbf789 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Thu, 26 Jun 2025 13:12:05 +0200 Subject: [PATCH] output, backend/drm: add wlr_output.color_primaries This contains the output's color primaries, if known. --- backend/drm/util.c | 17 +++++++++++++++++ include/backend/drm/drm.h | 1 + include/wlr/types/wlr_output.h | 2 ++ 3 files changed, 20 insertions(+) diff --git a/backend/drm/util.c b/backend/drm/util.c index dd2b37351..76276849d 100644 --- a/backend/drm/util.c +++ b/backend/drm/util.c @@ -50,6 +50,14 @@ enum wlr_output_mode_aspect_ratio get_picture_aspect_ratio(const drmModeModeInfo } } +static void copy_chromaticity_cie1931(struct wlr_color_cie1931_xy *dst, + const struct di_chromaticity_cie1931 *src) { + *dst = (struct wlr_color_cie1931_xy){ + .x = src->x, + .y = src->y, + }; +} + void parse_edid(struct wlr_drm_connector *conn, size_t len, const uint8_t *data) { struct wlr_output *output = &conn->output; @@ -83,6 +91,15 @@ void parse_edid(struct wlr_drm_connector *conn, size_t len, const uint8_t *data) output->model = di_info_get_model(info); output->serial = di_info_get_serial(info); + const struct di_color_primaries *primaries = di_info_get_default_color_primaries(info); + if (primaries->has_primaries && primaries->has_default_white_point) { + copy_chromaticity_cie1931(&conn->color_primaries.red, &primaries->primary[0]); + copy_chromaticity_cie1931(&conn->color_primaries.green, &primaries->primary[1]); + copy_chromaticity_cie1931(&conn->color_primaries.blue, &primaries->primary[2]); + copy_chromaticity_cie1931(&conn->color_primaries.white, &primaries->default_white); + output->color_primaries = &conn->color_primaries; + } + const struct di_supported_signal_colorimetry *colorimetry = di_info_get_supported_signal_colorimetry(info); bool has_bt2020 = colorimetry->bt2020_cycc || colorimetry->bt2020_ycc || colorimetry->bt2020_rgb; if (conn->props.colorspace != 0 && has_bt2020) { diff --git a/include/backend/drm/drm.h b/include/backend/drm/drm.h index af4231f54..7aa10c76d 100644 --- a/include/backend/drm/drm.h +++ b/include/backend/drm/drm.h @@ -195,6 +195,7 @@ struct wlr_drm_connector { drmModeConnection status; uint32_t id; uint64_t max_bpc_bounds[2]; + struct wlr_color_primaries color_primaries; // might be zero struct wlr_drm_lease *lease; struct wlr_drm_crtc *crtc; diff --git a/include/wlr/types/wlr_output.h b/include/wlr/types/wlr_output.h index 6a0dd0455..634b8498b 100644 --- a/include/wlr/types/wlr_output.h +++ b/include/wlr/types/wlr_output.h @@ -197,6 +197,8 @@ struct wlr_output { uint32_t supported_primaries; // bitfield of enum wlr_color_named_primaries uint32_t supported_transfer_functions; // bitfield of enum wlr_color_transfer_function + const struct wlr_color_primaries *color_primaries; // NULL if unset + bool enabled; float scale; enum wl_output_subpixel subpixel;