From c4fedd503fe6b43dd373affcf55127194978ac79 Mon Sep 17 00:00:00 2001 From: Pekka Paalanen Date: Mon, 9 May 2022 13:59:16 +0300 Subject: [PATCH] backend-drm: move code to kms-color.c This creates a new file for KMS related color code, to avoid making drm.c even longer. The moved code was just added in 5151f9fe9e9bacc6860931af60adba28cfd431a7 so the new file copyrights are written based on that. Signed-off-by: Pekka Paalanen --- libweston/backend-drm/drm-internal.h | 3 + libweston/backend-drm/drm.c | 66 ------------------- libweston/backend-drm/kms-color.c | 99 ++++++++++++++++++++++++++++ libweston/backend-drm/meson.build | 1 + 4 files changed, 103 insertions(+), 66 deletions(-) create mode 100644 libweston/backend-drm/kms-color.c diff --git a/libweston/backend-drm/drm-internal.h b/libweston/backend-drm/drm-internal.h index 23da81c0..87049de5 100644 --- a/libweston/backend-drm/drm-internal.h +++ b/libweston/backend-drm/drm-internal.h @@ -726,6 +726,9 @@ drm_fb_get_from_bo(struct gbm_bo *bo, struct drm_backend *backend, void drm_output_set_cursor_view(struct drm_output *output, struct weston_view *ev); +int +drm_output_ensure_hdr_output_metadata_blob(struct drm_output *output); + #ifdef BUILD_DRM_GBM extern struct drm_fb * drm_fb_get_from_view(struct drm_output_state *state, struct weston_view *ev, diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c index b55696c9..5625d7cf 100644 --- a/libweston/backend-drm/drm.c +++ b/libweston/backend-drm/drm.c @@ -51,7 +51,6 @@ #include #include #include "drm-internal.h" -#include "libdrm-updates.h" #include "shared/helpers.h" #include "shared/timespec-util.h" #include "shared/string-helpers.h" @@ -441,71 +440,6 @@ drm_output_render(struct drm_output_state *state, pixman_region32_t *damage) pixman_region32_fini(&scanout_damage); } -static int -drm_output_ensure_hdr_output_metadata_blob(struct drm_output *output) -{ - struct hdr_output_metadata meta; - uint32_t blob_id = 0; - int ret; - - if (output->hdr_output_metadata_blob_id) - return 0; - - /* - * Set up the data for Dynamic Range and Mastering InfoFrame, - * CTA-861-G, a.k.a the static HDR metadata. - */ - - memset(&meta, 0, sizeof meta); - - meta.metadata_type = 0; /* Static Metadata Type 1 */ - - /* Duplicated field in UABI struct */ - meta.hdmi_metadata_type1.metadata_type = meta.metadata_type; - - switch (output->base.eotf_mode) { - case WESTON_EOTF_MODE_NONE: - assert(0 && "bad eotf_mode: none"); - return -1; - case WESTON_EOTF_MODE_SDR: - /* - * Do not send any static HDR metadata. Video sinks should - * respond by switching to traditional SDR mode. If they - * do not, the kernel should fix that up. - */ - assert(output->hdr_output_metadata_blob_id == 0); - return 0; - case WESTON_EOTF_MODE_TRADITIONAL_HDR: - meta.hdmi_metadata_type1.eotf = 1; /* from CTA-861-G */ - break; - case WESTON_EOTF_MODE_ST2084: - meta.hdmi_metadata_type1.eotf = 2; /* from CTA-861-G */ - break; - case WESTON_EOTF_MODE_HLG: - meta.hdmi_metadata_type1.eotf = 3; /* from CTA-861-G */ - break; - } - - if (meta.hdmi_metadata_type1.eotf == 0) { - assert(0 && "bad eotf_mode"); - return -1; - } - - /* The other fields are intentionally left as zeroes. */ - - ret = drmModeCreatePropertyBlob(output->backend->drm.fd, - &meta, sizeof meta, &blob_id); - if (ret != 0) { - weston_log("Error: failed to create KMS blob for HDR metadata on output '%s': %s\n", - output->base.name, strerror(-ret)); - return -1; - } - - output->hdr_output_metadata_blob_id = blob_id; - - return 0; -} - static int drm_output_repaint(struct weston_output *output_base, pixman_region32_t *damage) { diff --git a/libweston/backend-drm/kms-color.c b/libweston/backend-drm/kms-color.c new file mode 100644 index 00000000..ae479754 --- /dev/null +++ b/libweston/backend-drm/kms-color.c @@ -0,0 +1,99 @@ +/* + * Copyright 2021-2022 Collabora, Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "config.h" + +#include +#include +#include +#include + +#include "drm-internal.h" +#include "libdrm-updates.h" + +int +drm_output_ensure_hdr_output_metadata_blob(struct drm_output *output) +{ + struct hdr_output_metadata meta; + uint32_t blob_id = 0; + int ret; + + if (output->hdr_output_metadata_blob_id) + return 0; + + /* + * Set up the data for Dynamic Range and Mastering InfoFrame, + * CTA-861-G, a.k.a the static HDR metadata. + */ + + memset(&meta, 0, sizeof meta); + + meta.metadata_type = 0; /* Static Metadata Type 1 */ + + /* Duplicated field in UABI struct */ + meta.hdmi_metadata_type1.metadata_type = meta.metadata_type; + + switch (output->base.eotf_mode) { + case WESTON_EOTF_MODE_NONE: + assert(0 && "bad eotf_mode: none"); + return -1; + case WESTON_EOTF_MODE_SDR: + /* + * Do not send any static HDR metadata. Video sinks should + * respond by switching to traditional SDR mode. If they + * do not, the kernel should fix that up. + */ + assert(output->hdr_output_metadata_blob_id == 0); + return 0; + case WESTON_EOTF_MODE_TRADITIONAL_HDR: + meta.hdmi_metadata_type1.eotf = 1; /* from CTA-861-G */ + break; + case WESTON_EOTF_MODE_ST2084: + meta.hdmi_metadata_type1.eotf = 2; /* from CTA-861-G */ + break; + case WESTON_EOTF_MODE_HLG: + meta.hdmi_metadata_type1.eotf = 3; /* from CTA-861-G */ + break; + } + + if (meta.hdmi_metadata_type1.eotf == 0) { + assert(0 && "bad eotf_mode"); + return -1; + } + + /* The other fields are intentionally left as zeroes. */ + + ret = drmModeCreatePropertyBlob(output->backend->drm.fd, + &meta, sizeof meta, &blob_id); + if (ret != 0) { + weston_log("Error: failed to create KMS blob for HDR metadata on output '%s': %s\n", + output->base.name, strerror(-ret)); + return -1; + } + + output->hdr_output_metadata_blob_id = blob_id; + + return 0; +} diff --git a/libweston/backend-drm/meson.build b/libweston/backend-drm/meson.build index 9e7c0cff..e913f4b9 100644 --- a/libweston/backend-drm/meson.build +++ b/libweston/backend-drm/meson.build @@ -29,6 +29,7 @@ srcs_drm = [ 'fb.c', 'modes.c', 'kms.c', + 'kms-color.c', 'state-helpers.c', 'state-propose.c', linux_dmabuf_unstable_v1_protocol_c,