diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 19ac5da5e95e617ed589b163e94d33daea47742a..fc88aeffc59af85b6b7339bb5634676bc6bb0044 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,8 +1,11 @@ include: - - remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/145b1bc7ef1702d2bd71584010d7113c6786a506/templates/fedora.yml' - - remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/34f4ade99434043f88e164933f570301fd18b125/templates/ci-fairy.yml' - - project: 'Infrastructure/openshift-images/gnome-release-service' - file: '/ci-templates/release-module.yml' + - remote: 'https://gitlab.gnome.org/Infrastructure/freedesktop-ci-templates/-/raw/145b1bc7ef1702d2bd71584010d7113c6786a506/templates/fedora.yml' + - remote: 'https://gitlab.gnome.org/Infrastructure/freedesktop-ci-templates/-/raw/34f4ade99434043f88e164933f570301fd18b125/templates/ci-fairy.yml' + - component: gitlab.gnome.org/GNOME/citemplates/release-service@master + inputs: + job-stage: deploy + dist-job-name: "dist-mutter-tarball" + tarball-artifact-path: $TARBALL_ARTIFACT_PATH - component: gitlab.gnome.org/GNOME/citemplates/gnomeos-build-sysext@1.0.0-alpha.1 inputs: meson-options: @@ -30,6 +33,7 @@ stages: variables: FDO_UPSTREAM_REPO: GNOME/mutter + TARBALL_ARTIFACT_PATH: build/meson-dist/$CI_PROJECT_NAME-$CI_COMMIT_TAG.tar.xz .skip-git-clone: variables: @@ -679,27 +683,6 @@ test-mutter-coverity: paths: - coverity -distinfo: - extends: - - .fdo.distribution-image@fedora - - .mutter.fedora@x86_64 - - .build-mutter-base - - .test-setup - stage: deploy - needs: - - job: build-fedora-container@x86_64 - artifacts: false - script: - - meson setup . build - - .gitlab-ci/export-artifact-path build > dist.env - artifacts: - reports: - dotenv: dist.env - paths: - - dist.env - rules: - - if: '$CI_COMMIT_TAG' - dist-mutter: extends: - .fdo.distribution-image@fedora @@ -772,22 +755,12 @@ installed-tests-mutter@x86_64: dist-mutter-tarball: extends: dist-mutter - needs: - - distinfo artifacts: expose_as: 'Get tarball here' + name: "${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}" + when: always paths: - $TARBALL_ARTIFACT_PATH - reports: - dotenv: dist.env - rules: - - if: '$CI_COMMIT_TAG' - -release-module: - stage: deploy - needs: - - dist-mutter-tarball - extends: .release-module rules: - if: '$CI_COMMIT_TAG' diff --git a/.gitlab-ci/export-artifact-path b/.gitlab-ci/export-artifact-path deleted file mode 100755 index f9a7534fda5040231cc762dbfe6a4a1eccfef9b3..0000000000000000000000000000000000000000 --- a/.gitlab-ci/export-artifact-path +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/gjs -m -// SPDX-FileCopyrightText: 2024 Florian Müllner -// -// SPDX-License-Identifier: GPL-2.0-or-later - -import Gio from 'gi://Gio'; -import {programArgs, programInvocationName, exit} from 'system'; - -const [buildDir] = programArgs; -if (!buildDir) { - printerr(`usage: ${programInvocationName} `); - exit(1); -} - -const subprocess = Gio.Subprocess.new( - ['meson', 'introspect', '--projectinfo', buildDir], - Gio.SubprocessFlags.STDOUT_PIPE); -const [, out] = subprocess.communicate_utf8(null, null); - -const {descriptive_name, version} = JSON.parse(out); -print(`TARBALL_ARTIFACT_PATH=${buildDir}/meson-dist/${descriptive_name}-${version}.tar.xz`); diff --git a/src/backends/native/meta-kms-impl-device-atomic.c b/src/backends/native/meta-kms-impl-device-atomic.c index 2a4889a164c16996af82981efc5e6a37236d1b73..678811adbfef1c0838cc8649b3b262a2d08517fe 100644 --- a/src/backends/native/meta-kms-impl-device-atomic.c +++ b/src/backends/native/meta-kms-impl-device-atomic.c @@ -757,6 +757,39 @@ process_plane_assignment (MetaKmsImplDevice *impl_device, error)) return FALSE; } + + if (plane_assignment->color_encoding.has_update) + { + meta_topic (META_DEBUG_KMS, + "[atomic] Setting plane (%u, %s) color encoding to %u", + meta_kms_plane_get_id (plane), + meta_kms_impl_device_get_path (impl_device), + plane_assignment->color_encoding.value); + + if (!add_plane_property (impl_device, + plane, req, + META_KMS_PLANE_PROP_YCBCR_COLOR_ENCODING, + plane_assignment->color_encoding.value, + error)) + return FALSE; + } + + if (plane_assignment->color_range.has_update) + { + meta_topic (META_DEBUG_KMS, + "[atomic] Setting plane (%u, %s) color range to %u", + meta_kms_plane_get_id (plane), + meta_kms_impl_device_get_path (impl_device), + plane_assignment->color_range.value); + + if (!add_plane_property (impl_device, + plane, req, + META_KMS_PLANE_PROP_YCBCR_COLOR_RANGE, + plane_assignment->color_range.value, + error)) + return FALSE; + } + return TRUE; } diff --git a/src/backends/native/meta-kms-plane-private.h b/src/backends/native/meta-kms-plane-private.h index 21df3b72628aec1f99f0a1d6b3a3a3c2f486b2f0..c34488ec91ca334df22fe5ee099fa3fd1ffc3546 100644 --- a/src/backends/native/meta-kms-plane-private.h +++ b/src/backends/native/meta-kms-plane-private.h @@ -43,6 +43,8 @@ typedef enum _MetaKmsPlaneProp META_KMS_PLANE_PROP_HOTSPOT_X, META_KMS_PLANE_PROP_HOTSPOT_Y, META_KMS_PLANE_PROP_SIZE_HINTS, + META_KMS_PLANE_PROP_YCBCR_COLOR_ENCODING, + META_KMS_PLANE_PROP_YCBCR_COLOR_RANGE, META_KMS_PLANE_N_PROPS } MetaKmsPlaneProp; diff --git a/src/backends/native/meta-kms-plane.c b/src/backends/native/meta-kms-plane.c index d85b9ed06c1511957ea4fea507438851ac0b242d..d8eef0a8bcf1542804afef536c80b6a7843cbf3c 100644 --- a/src/backends/native/meta-kms-plane.c +++ b/src/backends/native/meta-kms-plane.c @@ -34,6 +34,8 @@ typedef struct _MetaKmsPlanePropTable { MetaKmsProp props[META_KMS_PLANE_N_PROPS]; MetaKmsEnum rotation_bitmask[META_KMS_PLANE_ROTATION_BIT_N_PROPS]; + MetaKmsEnum color_encodings[META_KMS_PLANE_YCBCR_COLOR_ENCODING_N_PROPS]; + MetaKmsEnum color_ranges[META_KMS_PLANE_YCBCR_COLOR_RANGE_N_PROPS]; } MetaKmsPlanePropTable; struct _MetaKmsPlane @@ -177,6 +179,34 @@ meta_kms_plane_update_set_rotation (MetaKmsPlane *plane, meta_kms_plane_assignment_set_rotation (plane_assignment, kms_rotation); } +void +meta_kms_plane_update_set_color_encoding (MetaKmsPlane *plane, + MetaKmsPlaneAssignment *plane_assignment, + MetaKmsPlaneYCbCrColorEncoding encoding) +{ + MetaKmsProp *prop = + &plane->prop_table.props[META_KMS_PLANE_PROP_YCBCR_COLOR_ENCODING]; + + g_return_if_fail (meta_kms_plane_is_color_encoding_handled (plane, encoding)); + + if (prop->value != encoding) + meta_kms_plane_assignment_set_color_encoding (plane_assignment, encoding); +} + +void +meta_kms_plane_update_set_color_range (MetaKmsPlane *plane, + MetaKmsPlaneAssignment *plane_assignment, + MetaKmsPlaneYCbCrColorRange range) +{ + MetaKmsProp *prop = + &plane->prop_table.props[META_KMS_PLANE_YCBCR_COLOR_RANGE_LIMITED]; + + g_return_if_fail (meta_kms_plane_is_color_range_handled (plane, range)); + + if (prop->value != range) + meta_kms_plane_assignment_set_color_range (plane_assignment, range); +} + gboolean meta_kms_plane_is_transform_handled (MetaKmsPlane *plane, MtkMonitorTransform transform) @@ -209,6 +239,26 @@ meta_kms_plane_is_transform_handled (MetaKmsPlane *plane, return FALSE; } +gboolean +meta_kms_plane_is_color_encoding_handled (MetaKmsPlane *plane, + MetaKmsPlaneYCbCrColorEncoding encoding) +{ + MetaKmsProp *prop = + &plane->prop_table.props[META_KMS_PLANE_PROP_YCBCR_COLOR_ENCODING]; + + return prop->supported_variants & (1 << encoding); +} + +gboolean +meta_kms_plane_is_color_range_handled (MetaKmsPlane *plane, + MetaKmsPlaneYCbCrColorRange range) +{ + MetaKmsProp *prop = + &plane->prop_table.props[META_KMS_PLANE_PROP_YCBCR_COLOR_RANGE]; + + return prop->supported_variants & (1 << range); +} + gboolean meta_kms_plane_supports_cursor_hotspot (MetaKmsPlane *plane) { @@ -618,6 +668,22 @@ init_properties (MetaKmsPlane *plane, .name = "SIZE_HINTS", .type = DRM_MODE_PROP_BLOB, }, + [META_KMS_PLANE_PROP_YCBCR_COLOR_ENCODING] = + { + .name = "COLOR_ENCODING", + .type = DRM_MODE_PROP_ENUM, + .enum_values = prop_table->color_encodings, + .num_enum_values = META_KMS_PLANE_YCBCR_COLOR_ENCODING_N_PROPS, + .default_value = META_KMS_PLANE_YCBCR_COLOR_ENCODING_BT709, + }, + [META_KMS_PLANE_PROP_YCBCR_COLOR_RANGE] = + { + .name = "COLOR_RANGE", + .type = DRM_MODE_PROP_ENUM, + .enum_values = prop_table->color_ranges, + .num_enum_values = META_KMS_PLANE_YCBCR_COLOR_RANGE_N_PROPS, + .default_value = META_KMS_PLANE_YCBCR_COLOR_RANGE_LIMITED, + }, }, .rotation_bitmask = { [META_KMS_PLANE_ROTATION_BIT_ROTATE_0] = @@ -651,6 +717,30 @@ init_properties (MetaKmsPlane *plane, .bitmask = META_KMS_PLANE_ROTATION_REFLECT_Y, }, }, + .color_encodings = { + [META_KMS_PLANE_YCBCR_COLOR_ENCODING_BT601] = + { + .name = "ITU-R BT.601 YCbCr", + }, + [META_KMS_PLANE_YCBCR_COLOR_ENCODING_BT709] = + { + .name = "ITU-R BT.709 YCbCr", + }, + [META_KMS_PLANE_YCBCR_COLOR_ENCODING_BT2020] = + { + .name = "ITU-R BT.2020 YCbCr", + }, + }, + .color_ranges = { + [META_KMS_PLANE_YCBCR_COLOR_RANGE_LIMITED] = + { + .name = "YCbCr limited range", + }, + [META_KMS_PLANE_YCBCR_COLOR_RANGE_FULL] = + { + .name = "YCbCr full range", + }, + }, }; } diff --git a/src/backends/native/meta-kms-plane.h b/src/backends/native/meta-kms-plane.h index f79820fdbefc395025c5a04cc64ecd8401c3ebc8..adcabfc8a1e74d6a87a34116ffe09969f3bc2677 100644 --- a/src/backends/native/meta-kms-plane.h +++ b/src/backends/native/meta-kms-plane.h @@ -32,6 +32,21 @@ enum _MetaKmsPlaneType META_KMS_PLANE_TYPE_OVERLAY, }; +typedef enum _MetaKmsPlaneYCbCrColorEncoding +{ + META_KMS_PLANE_YCBCR_COLOR_ENCODING_BT601 = 0, + META_KMS_PLANE_YCBCR_COLOR_ENCODING_BT709, + META_KMS_PLANE_YCBCR_COLOR_ENCODING_BT2020, + META_KMS_PLANE_YCBCR_COLOR_ENCODING_N_PROPS, +} MetaKmsPlaneYCbCrColorEncoding; + +typedef enum _MetaKmsPlaneYCbCrColorRanges +{ + META_KMS_PLANE_YCBCR_COLOR_RANGE_LIMITED = 0, + META_KMS_PLANE_YCBCR_COLOR_RANGE_FULL, + META_KMS_PLANE_YCBCR_COLOR_RANGE_N_PROPS, +} MetaKmsPlaneYCbCrColorRange; + typedef struct _MetaKmsPlaneCursorSizeHints { gboolean has_size_hints; @@ -59,6 +74,12 @@ meta_kms_plane_get_cursor_size_hints (MetaKmsPlane *plane); gboolean meta_kms_plane_is_transform_handled (MetaKmsPlane *plane, MtkMonitorTransform transform); +gboolean meta_kms_plane_is_color_encoding_handled (MetaKmsPlane *plane, + MetaKmsPlaneYCbCrColorEncoding encoding); + +gboolean meta_kms_plane_is_color_range_handled (MetaKmsPlane *plane, + MetaKmsPlaneYCbCrColorRange range); + gboolean meta_kms_plane_supports_cursor_hotspot (MetaKmsPlane *plane); GArray * meta_kms_plane_get_modifiers_for_format (MetaKmsPlane *plane, @@ -77,4 +98,12 @@ void meta_kms_plane_update_set_rotation (MetaKmsPlane *plane, MetaKmsPlaneAssignment *plane_assignment, MtkMonitorTransform transform); +void meta_kms_plane_update_set_color_encoding (MetaKmsPlane *plane, + MetaKmsPlaneAssignment *plane_assignment, + MetaKmsPlaneYCbCrColorEncoding encoding); + +void meta_kms_plane_update_set_color_range (MetaKmsPlane *plane, + MetaKmsPlaneAssignment *plane_assignment, + MetaKmsPlaneYCbCrColorRange range); + const char * meta_kms_plane_type_to_string (MetaKmsPlaneType plane_type); diff --git a/src/backends/native/meta-kms-update-private.h b/src/backends/native/meta-kms-update-private.h index fcd45d5512a75d3c363068340c75cb8578122063..e1b39244406bef30149a2264bfe0a794bf9cf31e 100644 --- a/src/backends/native/meta-kms-update-private.h +++ b/src/backends/native/meta-kms-update-private.h @@ -71,6 +71,16 @@ typedef struct _MetaKmsPlaneAssignment int x; int y; } cursor_hotspot; + + struct { + gboolean has_update; + MetaKmsPlaneYCbCrColorEncoding value; + } color_encoding; + + struct { + gboolean has_update; + MetaKmsPlaneYCbCrColorRange value; + } color_range; } MetaKmsPlaneAssignment; typedef struct _MetaKmsModeSet @@ -172,6 +182,12 @@ MetaKmsFeedback * meta_kms_feedback_new_failed (GList *failed_planes, void meta_kms_plane_assignment_set_rotation (MetaKmsPlaneAssignment *plane_assignment, MetaKmsPlaneRotation rotation); +void meta_kms_plane_assignment_set_color_encoding (MetaKmsPlaneAssignment *plane_assignment, + MetaKmsPlaneYCbCrColorEncoding color_encoding); + +void meta_kms_plane_assignment_set_color_range (MetaKmsPlaneAssignment *plane_assignment, + MetaKmsPlaneYCbCrColorRange range); + META_EXPORT_TEST MetaKmsPlaneAssignment * meta_kms_update_get_primary_plane_assignment (MetaKmsUpdate *update, MetaKmsCrtc *crtc); diff --git a/src/backends/native/meta-kms-update.c b/src/backends/native/meta-kms-update.c index a5da81f0c514c2304a2ca0c278c1d98c32c2e467..6366ad9d6d14cb0ac6dcbac3a514dcb1573671bb 100644 --- a/src/backends/native/meta-kms-update.c +++ b/src/backends/native/meta-kms-update.c @@ -658,6 +658,22 @@ meta_kms_plane_assignment_set_rotation (MetaKmsPlaneAssignment *plane_assignment plane_assignment->rotation = rotation; } +void +meta_kms_plane_assignment_set_color_encoding (MetaKmsPlaneAssignment *plane_assignment, + MetaKmsPlaneYCbCrColorEncoding encoding) +{ + plane_assignment->color_encoding.has_update = TRUE; + plane_assignment->color_encoding.value = encoding; +} + +void +meta_kms_plane_assignment_set_color_range (MetaKmsPlaneAssignment *plane_assignment, + MetaKmsPlaneYCbCrColorRange range) +{ + plane_assignment->color_range.has_update = TRUE; + plane_assignment->color_range.value = range; +} + void meta_kms_plane_assignment_set_cursor_hotspot (MetaKmsPlaneAssignment *plane_assignment, int x, diff --git a/src/backends/native/meta-onscreen-native.c b/src/backends/native/meta-onscreen-native.c index db4bbe0f183c5f71394b7e70b3c5802adbbbb70e..357bfdcce245d9e5afb834b6f8a1cec8272788be 100644 --- a/src/backends/native/meta-onscreen-native.c +++ b/src/backends/native/meta-onscreen-native.c @@ -464,6 +464,32 @@ apply_transform (MetaCrtcKms *crtc_kms, hw_transform); } +static void +apply_color_encoding (MetaKmsPlaneAssignment *kms_plane_assignment, + MetaKmsPlane *kms_plane) +{ + if (!meta_kms_plane_is_color_encoding_handled (kms_plane, + META_KMS_PLANE_YCBCR_COLOR_ENCODING_BT709)) + return; + + meta_kms_plane_update_set_color_encoding (kms_plane, + kms_plane_assignment, + META_KMS_PLANE_YCBCR_COLOR_ENCODING_BT709); +} + +static void +apply_color_range (MetaKmsPlaneAssignment *kms_plane_assignment, + MetaKmsPlane *kms_plane) +{ + if (!meta_kms_plane_is_color_range_handled (kms_plane, + META_KMS_PLANE_YCBCR_COLOR_RANGE_LIMITED)) + return; + + meta_kms_plane_update_set_color_range (kms_plane, + kms_plane_assignment, + META_KMS_PLANE_YCBCR_COLOR_RANGE_LIMITED); +} + static MetaKmsPlaneAssignment * assign_primary_plane (MetaCrtcKms *crtc_kms, MetaDrmBuffer *buffer, @@ -503,6 +529,8 @@ assign_primary_plane (MetaCrtcKms *crtc_kms, *dst_rect, flags); apply_transform (crtc_kms, plane_assignment, primary_kms_plane); + apply_color_encoding (plane_assignment, primary_kms_plane); + apply_color_range (plane_assignment, primary_kms_plane); return plane_assignment; } diff --git a/src/compositor/meta-multi-texture-format.c b/src/compositor/meta-multi-texture-format.c index a5079b85c320f1ad1eaac835c285f498441f3520..fa27efa19ac56f7b6becec4366d945268514a4e3 100644 --- a/src/compositor/meta-multi-texture-format.c +++ b/src/compositor/meta-multi-texture-format.c @@ -32,9 +32,9 @@ static const char *shader_global_conversions = " float Y = 255.0/219.0 * (yuva.x - 16.0/255.0); \n" " float su = yuva.y - 128.0/255.0; \n" " float sv = yuva.z - 128.0/255.0; \n" - " res.r = Y + 1.59602678 * sv; \n" - " res.g = Y - 0.39176229 * su - 0.81296764 * sv; \n" - " res.b = Y + 2.01723214 * su; \n" + " res.r = Y + 1.79274107 * sv; \n" + " res.g = Y - 0.21324861 * su - 0.53290933 * sv; \n" + " res.b = Y + 2.11240179 * su; \n" " res.rgb *= yuva.w; \n" " res.a = yuva.w; \n" " return res; \n" diff --git a/src/tests/ref-tests/wayland_buffer_ycbcr-basic_0.ref.png b/src/tests/ref-tests/wayland_buffer_ycbcr-basic_0.ref.png index 2d24f850e78a8838eddc8c178da30533848faffa..3bd6151b3c90b8aa7a19a13f9e31947130265302 100644 Binary files a/src/tests/ref-tests/wayland_buffer_ycbcr-basic_0.ref.png and b/src/tests/ref-tests/wayland_buffer_ycbcr-basic_0.ref.png differ diff --git a/src/tests/ref-tests/wayland_buffer_ycbcr-basic_1.ref.png b/src/tests/ref-tests/wayland_buffer_ycbcr-basic_1.ref.png index 5afbb27e8a13e8807eee929ce488cbd7f3743d34..00f618114c76ae590dd2880453d52d4b91f4f9b9 100644 Binary files a/src/tests/ref-tests/wayland_buffer_ycbcr-basic_1.ref.png and b/src/tests/ref-tests/wayland_buffer_ycbcr-basic_1.ref.png differ diff --git a/src/tests/ref-tests/wayland_buffer_ycbcr-basic_2.ref.png b/src/tests/ref-tests/wayland_buffer_ycbcr-basic_2.ref.png index 2d24f850e78a8838eddc8c178da30533848faffa..3bd6151b3c90b8aa7a19a13f9e31947130265302 100644 Binary files a/src/tests/ref-tests/wayland_buffer_ycbcr-basic_2.ref.png and b/src/tests/ref-tests/wayland_buffer_ycbcr-basic_2.ref.png differ diff --git a/src/tests/ref-tests/wayland_buffer_ycbcr-basic_3.ref.png b/src/tests/ref-tests/wayland_buffer_ycbcr-basic_3.ref.png index ed8d6f3243cf056aee895441ad1aeaa97746bee3..76fb3dfc2f00e336b8e601978594a31e6473abf3 100644 Binary files a/src/tests/ref-tests/wayland_buffer_ycbcr-basic_3.ref.png and b/src/tests/ref-tests/wayland_buffer_ycbcr-basic_3.ref.png differ