[igt-dev] [RFC PATCH 3/4][i-g-t] tests/kms_color: add 3D LUT mode tests

Alex Hung alex.hung at amd.com
Tue Oct 4 21:16:25 UTC 2022


This sample test whether whether a GPU driver returns sane 3D LUT
modes supported by the hardware.

Note: The kernel 3DLUT API proposal "Proposal for Pre-blending 3D LUT
interfaces" is sent to dri-devel mailing list.

Signed-off-by: Alex Hung <alex.hung at amd.com>
---
 tests/kms_color.c        | 34 ++++++++++++++++++++++++++++++++++
 tests/kms_color_helper.c | 36 ++++++++++++++++++++++++++++++++++++
 tests/kms_color_helper.h |  1 +
 3 files changed, 71 insertions(+)

diff --git a/tests/kms_color.c b/tests/kms_color.c
index 00742afa..1539c750 100644
--- a/tests/kms_color.c
+++ b/tests/kms_color.c
@@ -859,6 +859,36 @@ static bool invalid_plane_ctm_test(data_t *data, igt_plane_t *plane)
 	return true;
 }
 
+static bool plane_3dlut_mode_test(data_t *data, igt_plane_t *plane)
+{
+	igt_display_t *display = &data->display;
+	drmModePropertyPtr lut_3d_mode = NULL;
+	uint32_t i;
+
+	igt_info("Plane 3D LUT test is running on pipe-%s plane-%s(%s)\n",
+			kmstest_pipe_name(plane->pipe->pipe),
+			kmstest_plane_type_name(plane->type),
+			is_hdr_plane(plane) ? "hdr":"sdr");
+
+	igt_require(igt_plane_has_prop(plane, IGT_PLANE_3D_LUT_MODE));
+	igt_require(igt_plane_has_prop(plane, IGT_PLANE_3D_LUT));
+
+	lut_3d_mode = get_plane_gamma_degamma_mode(plane, IGT_PLANE_3D_LUT_MODE);
+	for (i = 0; i < lut_3d_mode->count_enums; i++) {
+		igt_info("Verifying 3D LUT mode: \'%s\'\n", lut_3d_mode->enums[i].name);
+
+		verify_3dlut_mode(data, lut_3d_mode->enums[i].value);
+		igt_plane_set_prop_enum(plane,
+					IGT_PLANE_3D_LUT_MODE,
+					lut_3d_mode->enums[i].name);
+		igt_assert(igt_display_commit2(display, display->is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY) == 0);
+	}
+
+	drmModeFreeProperty(lut_3d_mode);
+
+	return true;
+}
+
 static bool plane_gamma_test(data_t *data, igt_plane_t *plane)
 {
 	igt_output_t *output;
@@ -1549,6 +1579,10 @@ static void run_tests_for_plane(data_t *data, enum pipe pipe)
 	igt_subtest_f("pipe-%s-invalid-plane-ctm-matrix-sizes",
 			kmstest_pipe_name(pipe))
 		run_plane_color_test(data, pipe, invalid_plane_ctm_test);
+
+	igt_describe("Verify for plane 3dlut modes");
+	igt_subtest_f("pipe-%s-plane-3dlut-modes", kmstest_pipe_name(pipe))
+		run_plane_color_test(data, pipe, plane_3dlut_mode_test);
 }
 
 igt_main
diff --git a/tests/kms_color_helper.c b/tests/kms_color_helper.c
index 7ea8282d..5ed313e9 100644
--- a/tests/kms_color_helper.c
+++ b/tests/kms_color_helper.c
@@ -423,6 +423,42 @@ segment_data_t *get_segment_data(data_t *data,
 	return info;
 }
 
+void verify_3dlut_mode(data_t *data, uint64_t blob_id)
+{
+	struct drm_mode_3dlut_mode *mode_3dlut = NULL;
+	drmModePropertyBlobPtr blob;
+	uint32_t i, j, count;
+
+	blob = drmModeGetPropertyBlob(data->drm_fd, blob_id);
+	igt_assert(blob);
+	igt_assert(blob->length);
+
+	mode_3dlut = (struct drm_mode_3dlut_mode *) blob->data;
+	count = blob->length / sizeof(mode_3dlut[0]);
+	igt_assert(count);
+
+	/* TODO more tests? */
+	for (i = 0; i < count; i++) {
+		igt_assert(mode_3dlut[i].lut_size);
+		igt_assert(mode_3dlut[i].bit_depth);
+
+		for (j = 0; j < 3; j++) {
+			igt_assert(mode_3dlut[i].lut_stride[j]);
+			igt_assert_lte(mode_3dlut[i].lut_size,
+				       mode_3dlut[i].lut_stride[j]);
+		}
+
+		/* check whether color formats are support */
+		if (mode_3dlut[i].color_format != DRM_FORMAT_XRGB16161616 &&
+		    mode_3dlut[i].color_format != DRM_FORMAT_XBGR16161616)
+			igt_info("format 0x%X is not supported\n", mode_3dlut[i].color_format);
+
+	}
+
+	drmModeFreePropertyBlob(blob);
+
+}
+
 void set_advance_gamma(data_t *data, igt_pipe_t *pipe, enum gamma_type type)
 {
 	igt_display_t *display = &data->display;
diff --git a/tests/kms_color_helper.h b/tests/kms_color_helper.h
index c863874f..994ba2be 100644
--- a/tests/kms_color_helper.h
+++ b/tests/kms_color_helper.h
@@ -117,6 +117,7 @@ gamma_lut_t *pipe_create_linear_lut(segment_data_t *info);
 struct drm_color_lut_ext *create_linear_lut(segment_data_t *info);
 struct drm_color_lut_ext *create_max_lut(segment_data_t *info);
 segment_data_t *get_segment_data(data_t *data, uint64_t blob_id, char *mode);
+void verify_3dlut_mode(data_t *data, uint64_t blob_id);
 void set_pipe_gamma(igt_pipe_t *pipe, uint64_t value,
 		    struct drm_color_lut *lut, uint32_t size);
 void set_advance_gamma(data_t *data, igt_pipe_t *pipe, enum gamma_type type);
-- 
2.25.1



More information about the igt-dev mailing list