Igt-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Alex Hung <alex.hung@amd.com>
To: <igt-dev@lists.freedesktop.org>, <alex.hung@amd.com>
Cc: <harry.wentland@amd.com>
Subject: [PATCH V7 04/37] lib/igt_kms: Introduce DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE
Date: Wed, 26 Mar 2025 17:35:36 -0600	[thread overview]
Message-ID: <20250326233609.2980110-5-alex.hung@amd.com> (raw)
In-Reply-To: <20250326233609.2980110-1-alex.hung@amd.com>

From: Harry Wentland <harry.wentland@amd.com>

Setting the COLOR_PIPELINE plane prop is only allowed when the
DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE is set.

Setting COLOR_RANGE and COLOR_ENCODING is only allowed when the
DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE is NOT set.

v6:
 - Ignore COLOR_RANGE and COLOR_ENCODING plane properties
   when DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE is set

Signed-off-by: Harry Wentland <harry.wentland@amd.com>
---
 include/drm-uapi/drm.h | 15 +++++++++++++++
 lib/igt_kms.c          | 32 ++++++++++++++++++++++++++++++++
 lib/igt_kms.h          |  1 +
 tests/kms_properties.c | 22 ++++++++++++++++------
 4 files changed, 64 insertions(+), 6 deletions(-)

diff --git a/include/drm-uapi/drm.h b/include/drm-uapi/drm.h
index 4e4f7c2c3..6b9af3348 100644
--- a/include/drm-uapi/drm.h
+++ b/include/drm-uapi/drm.h
@@ -869,6 +869,21 @@ struct drm_get_cap {
  */
 #define DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT	6
 
+/**
+ * DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE
+ *
+ * If set to 1, the DRM core will
+ * - expose plane COLOR_PIPELINE properties for pre-blending color management.
+ * - reject setting of these plane properties:
+ *   - COLOR_ENCODING
+ *   - COLOR_RANGE
+ *
+ * The client must enable &DRM_CLIENT_CAP_ATOMIC first.
+ *
+ * This capability is currently in development.
+ */
+#define DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE	7
+
 /* DRM_IOCTL_SET_CLIENT_CAP ioctl argument type */
 struct drm_set_client_cap {
 	__u64 capability;
diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 884d78749..88ed35f07 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -2981,6 +2981,9 @@ void igt_display_require(igt_display_t *display, int drm_fd)
 	if (drmSetClientCap(drm_fd, LOCAL_DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT, 1) == 0)
 		display->has_virt_cursor_plane = 1;
 
+	if (drmSetClientCap(drm_fd, DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE, 1) == 0)
+		display->has_plane_color_pipeline = 1;
+
 	plane_resources = drmModeGetPlaneResources(display->drm_fd);
 	igt_assert(plane_resources);
 
@@ -3608,6 +3611,29 @@ static uint32_t igt_plane_get_fb_id(igt_plane_t *plane)
 	igt_assert_eq(r, 0);	\
 }
 
+static bool
+igt_atomic_ignore_plane_prop(igt_pipe_t *pipe, uint32_t prop)
+{
+	igt_display_t *display = pipe->display;
+
+	if (display->has_plane_color_pipeline) {
+		switch(prop) {
+		case IGT_PLANE_COLOR_ENCODING:
+		case IGT_PLANE_COLOR_RANGE:
+			return true;
+		default:
+			return false;
+		}
+	} else {
+		switch(prop) {
+		default:
+			return false;
+		}
+	}
+
+	return false;
+}
+
 /*
  * Add position and fb changes of a plane to the atomic property set
  */
@@ -3627,6 +3653,12 @@ igt_atomic_prepare_plane_commit(igt_plane_t *plane, igt_pipe_t *pipe,
 	    igt_plane_get_fb_id(plane));
 
 	for (i = 0; i < IGT_NUM_PLANE_PROPS; i++) {
+		if (igt_atomic_ignore_plane_prop(pipe, i)) {
+			igt_debug("plane %s.%d: Ignoring property \"%s\" to 0x%"PRIx64"/%"PRIi64"\n",
+				kmstest_pipe_name(pipe->pipe), plane->index, igt_plane_prop_names[i],
+			plane->values[i], plane->values[i]);			continue;
+		}
+
 		if (!igt_plane_is_prop_changed(plane, i))
 			continue;
 
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index 9b5a940f7..7531ae53b 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -503,6 +503,7 @@ struct igt_display {
 	bool has_cursor_plane;
 	bool is_atomic;
 	bool has_virt_cursor_plane;
+	bool has_plane_color_pipeline;
 	bool first_commit;
 
 	uint64_t *modifiers;
diff --git a/tests/kms_properties.c b/tests/kms_properties.c
index 408e23578..01ec3bedc 100644
--- a/tests/kms_properties.c
+++ b/tests/kms_properties.c
@@ -101,7 +101,7 @@ static void cleanup_pipe(igt_display_t *display, enum pipe pipe, igt_output_t *o
 }
 
 static bool ignore_property(uint32_t obj_type, uint32_t prop_flags,
-			    const char *name, bool atomic)
+			    const char *name, bool atomic, bool has_color_pipeline)
 {
 	if (prop_flags & DRM_MODE_PROP_IMMUTABLE)
 		return true;
@@ -111,6 +111,16 @@ static bool ignore_property(uint32_t obj_type, uint32_t prop_flags,
 		if (atomic && !strcmp(name, "DPMS"))
 			return true;
 		break;
+	case DRM_MODE_OBJECT_PLANE:
+		if (has_color_pipeline && !strcmp(name, "COLOR_RANGE")) {
+			printf("hwhw: ignoring COLOR_RANGE\n");
+			return true;
+		}
+		if (has_color_pipeline && !strcmp(name, "COLOR_ENCODING")) {
+			printf("hwhw: ignoring COLOR_ENCODING\n");
+			return true;
+		}
+		break;
 	default:
 		break;
 	}
@@ -164,7 +174,7 @@ static bool has_additional_test_lookup(uint32_t obj_type, const char *name,
 
 	return false;
 }
-static void test_properties(int fd, uint32_t type, uint32_t id, bool atomic)
+static void test_properties(int fd, uint32_t type, uint32_t id, bool atomic, bool has_color_pipeline)
 {
 	drmModeObjectPropertiesPtr props =
 		drmModeObjectGetProperties(fd, id, type);
@@ -183,7 +193,7 @@ static void test_properties(int fd, uint32_t type, uint32_t id, bool atomic)
 
 		igt_assert(prop);
 
-		if (ignore_property(type, prop->flags, prop->name, atomic)) {
+		if (ignore_property(type, prop->flags, prop->name, atomic, has_color_pipeline)) {
 			igt_debug("Ignoring property \"%s\"\n", prop->name);
 
 			continue;
@@ -230,7 +240,7 @@ static void run_plane_property_tests(igt_display_t *display, enum pipe pipe, igt
 		igt_info("Testing plane properties on %s.#%d-%s (output: %s)\n",
 			 kmstest_pipe_name(pipe), plane->index, kmstest_plane_type_name(plane->type), output->name);
 
-		test_properties(display->drm_fd, DRM_MODE_OBJECT_PLANE, plane->drm_plane->plane_id, atomic);
+		test_properties(display->drm_fd, DRM_MODE_OBJECT_PLANE, plane->drm_plane->plane_id, atomic, display->has_plane_color_pipeline);
 	}
 
 	cleanup_pipe(display, pipe, output, &fb);
@@ -244,7 +254,7 @@ static void run_crtc_property_tests(igt_display_t *display, enum pipe pipe, igt_
 
 	igt_info("Testing crtc properties on %s (output: %s)\n", kmstest_pipe_name(pipe), output->name);
 
-	test_properties(display->drm_fd, DRM_MODE_OBJECT_CRTC, display->pipes[pipe].crtc_id, atomic);
+	test_properties(display->drm_fd, DRM_MODE_OBJECT_CRTC, display->pipes[pipe].crtc_id, atomic, false);
 
 	cleanup_pipe(display, pipe, output, &fb);
 }
@@ -258,7 +268,7 @@ static void run_connector_property_tests(igt_display_t *display, enum pipe pipe,
 
 	igt_info("Testing connector properties on output %s (pipe: %s)\n", output->name, kmstest_pipe_name(pipe));
 
-	test_properties(display->drm_fd, DRM_MODE_OBJECT_CONNECTOR, output->id, atomic);
+	test_properties(display->drm_fd, DRM_MODE_OBJECT_CONNECTOR, output->id, atomic, false);
 
 	if (pipe != PIPE_NONE)
 		cleanup_pipe(display, pipe, output, &fb);
-- 
2.43.0


  parent reply	other threads:[~2025-03-26 23:40 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-26 23:35 [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Alex Hung
2025-03-26 23:35 ` [PATCH V7 01/37] lib/drmtest: Add is_vkms_device() Alex Hung
2025-03-26 23:35 ` [PATCH V7 02/37] tests/kms_writeback: Fix kms_writeback for VKMS Alex Hung
2025-03-26 23:35 ` [PATCH V7 03/37] lib/igt_kms: Move get_writeback_formats_blob to lib Alex Hung
2025-04-03  6:41   ` Sharma, Swati2
2025-03-26 23:35 ` Alex Hung [this message]
2025-03-26 23:35 ` [PATCH V7 05/37] include/drm-uapi: Add COLOROP object Alex Hung
2025-03-26 23:35 ` [PATCH V7 06/37] drm-uapi: Add 3x4 CTM Alex Hung
2025-03-26 23:35 ` [PATCH V7 07/37] drm-uapi: Add 1D LUT drm_colorop_type Alex Hung
2025-03-26 23:35 ` [PATCH V7 08/37] lib/igt_kms: Introduce drm_colorop and COLOR_PIPELINE Alex Hung
2025-04-03 10:04   ` Sharma, Swati2
2025-03-26 23:35 ` [PATCH V7 09/37] tests/kms_properties: Add colorop properties test Alex Hung
2025-03-26 23:35 ` [PATCH V7 10/37] igt/color: Add SW color transform functionality Alex Hung
2025-03-26 23:35 ` [PATCH V7 11/37] lib/igt_fb: Add copy_fb function Alex Hung
2025-03-26 23:35 ` [PATCH V7 12/37] tests/kms_colorop: Add kms_colorop tests Alex Hung
2025-04-03  9:57   ` Sharma, Swati2
2025-03-26 23:35 ` [PATCH V7 13/37] lib/igt_kms: Add support for DATA colorop property Alex Hung
2025-03-26 23:35 ` [PATCH V7 14/37] lib/igt_color: Add support for 3x4 matrices Alex Hung
2025-03-26 23:35 ` [PATCH V7 15/37] tests/kms_colorop: Add 3x4 CTM tests Alex Hung
2025-03-26 23:35 ` [PATCH V7 16/37] tests/kms_colorop: Add bypass test Alex Hung
2025-03-26 23:35 ` [PATCH V7 17/37] tests/kms_colorop: Parametrize the buffer format Alex Hung
2025-03-26 23:35 ` [PATCH V7 18/37] tests/kms_colorop: Add 10bpc test and skip if format not supported Alex Hung
2025-03-26 23:35 ` [PATCH V7 19/37] tests/kms_colorop: Skip if writeback does not support fourcc Alex Hung
2025-03-26 23:35 ` [PATCH V7 20/37] lib/igt_fb: Allow any non-planar format for igt_copy_fb Alex Hung
2025-03-26 23:35 ` [PATCH V7 21/37] kms/colorop: Do proper setup and cleanup Alex Hung
2025-03-26 23:35 ` [PATCH V7 22/37] lib/igt_color: Support color transform for XRGB2101010 Alex Hung
2025-03-26 23:35 ` [PATCH V7 23/37] tests/kms_colorop: Set wide [13, 13] bracket for comparison on amdgpu Alex Hung
2025-03-26 23:35 ` [PATCH V7 24/37] lib/igt_color: Add PQ variants for 0-1 and 0-125 range Alex Hung
2025-03-26 23:35 ` [PATCH V7 25/37] tests/kms_colorop: Add tests for PQ variants Alex Hung
2025-03-26 23:35 ` [PATCH V7 26/37] lib/igt_kms: increase MAX_NUM_COLOROPS to 128 Alex Hung
2025-03-26 23:35 ` [PATCH V7 27/37] tests/kms_colorop: Add a sRGB test for EOTF -> Inverse EOTF -> EOTF Alex Hung
2025-03-26 23:36 ` [PATCH V7 28/37] lib/igt_color: add BT2020/BT709 transfer functions Alex Hung
2025-03-26 23:36 ` [PATCH V7 29/37] tests/kms_colorop: Add tests for BT2020/BT709 TFs Alex Hung
2025-03-26 23:36 ` [PATCH V7 30/37] lib/igt_color: Add 1D LUT color transformation support Alex Hung
2025-03-26 23:36 ` [PATCH V7 31/37] test/kms_colorop: Add tests that exercise the 1D LUT colorops Alex Hung
2025-03-26 23:36 ` [PATCH V7 32/37] tests/kms_colorop: Add multiplier tests Alex Hung
2025-03-26 23:36 ` [PATCH V7 33/37] lib/igt_color: Point license header at skia license Alex Hung
2025-03-26 23:36 ` [PATCH V7 34/37] scripts/convert_3dlut.py Convert a 3D LUT to igt_3dlut_t array for 3D LUT API Alex Hung
2025-03-26 23:36 ` [PATCH V7 35/37] tests/kms_colorop: Add a 3D LUT subtest Alex Hung
2025-03-26 23:36 ` [PATCH V7 36/37] drm-uapi: Update kernel doc for drm_colorop_type Alex Hung
2025-03-26 23:36 ` [PATCH V7 37/37] drm-uapi: Sync up definition with kernel colorop implementation Alex Hung
2025-03-27  0:48 ` ✓ Xe.CI.BAT: success for IGT tests for the KMS Color Pipeline API (rev7) Patchwork
2025-03-27  3:13 ` ✓ i915.CI.BAT: " Patchwork
2025-03-27  5:26 ` ✗ i915.CI.Full: failure " Patchwork
2025-03-27 13:49 ` ✗ Xe.CI.Full: " Patchwork
2025-03-28 12:00 ` Patchwork
2025-04-03 10:12 ` [PATCH V7 00/37] IGT tests for the KMS Color Pipeline API Sharma, Swati2
2025-04-07 23:26   ` Alex Hung
2025-04-06 16:26 ` ✗ Xe.CI.Full: failure for IGT tests for the KMS Color Pipeline API (rev7) Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250326233609.2980110-5-alex.hung@amd.com \
    --to=alex.hung@amd.com \
    --cc=harry.wentland@amd.com \
    --cc=igt-dev@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox