[igt-dev] [PATCH i-g-t 2/5] tests/amdgpu: Test combination of plane degamma and CRTC regamma

Rodrigo Siqueira Rodrigo.Siqueira at amd.com
Mon Nov 29 19:56:56 UTC 2021


From: Stylon Wang <stylon.wang at amd.com>

Signed-off-by: Stylon Wang <stylon.wang at amd.com>
---
 tests/amdgpu/amd_color.c | 114 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 114 insertions(+)

diff --git a/tests/amdgpu/amd_color.c b/tests/amdgpu/amd_color.c
index 418f8934..84f0a995 100644
--- a/tests/amdgpu/amd_color.c
+++ b/tests/amdgpu/amd_color.c
@@ -146,6 +146,20 @@ static void lut_gen_max(lut_t *lut, uint16_t mask)
 	}
 }
 
+/* Generates the half curve gamma LUT. */
+static void lut_gen_half(lut_t *lut, uint16_t mask)
+{
+	uint32_t i;
+
+	for (i = 0; i < lut->size; ++i) {
+		uint32_t v = i? (0xffff & mask)/2 : 0;
+
+		lut->data[i].red = v;
+		lut->data[i].blue = v;
+		lut->data[i].green = v;
+	}
+}
+
 static void lut_free(lut_t *lut)
 {
 	if (lut->data) {
@@ -699,6 +713,20 @@ static void draw_fill_color_bar(igt_fb_t *fb, int w, int h)
 	igt_put_cairo_ctx(cr);
 }
 
+/* draw color bars with half the brightness*/
+static void draw_fill_color_bar_half(igt_fb_t *fb, int w, int h)
+{
+	cairo_t *cr;
+	int gh = h/3;
+	int rh = h-gh*2;
+
+	cr = igt_get_cairo_ctx(fb->fd, fb);
+	igt_paint_color(cr, 0, 0, w, gh, 0.5, 0.0, 0.0);
+	igt_paint_color(cr, 0, gh, w, gh, 0.0, 0.5, 0.0);
+	igt_paint_color(cr, 0, gh*2, w, rh, 0.0, 0.0, 0.5);
+	igt_put_cairo_ctx(cr);
+}
+
 /* draw color bars in gradient without all-black pixels */
 static void draw_gradient_color_bar(igt_fb_t *fb, int w, int h)
 {
@@ -753,6 +781,90 @@ static void test_plane_max_degamma(data_t *data)
 	lut_free(&lut_max);
 }
 
+static bool test_plane_crtc_gamma(data_t *data, uint32_t format, igt_crc_t ref_crc)
+{
+	igt_display_t *display = &data->display;
+	igt_fb_t afb;
+	igt_crc_t new_crc;
+	lut_t lut_max, lut_half;
+	enum igt_color_encoding e = IGT_COLOR_YCBCR_BT709;
+	enum igt_color_range r = IGT_COLOR_YCBCR_LIMITED_RANGE;
+	bool result = true;
+
+	igt_info("Testing format " IGT_FORMAT_FMT " (%s, %s) on %s.%u\n",
+		 IGT_FORMAT_ARGS(format),
+		 igt_color_encoding_to_str(e),
+		 igt_color_range_to_str(r),
+		 kmstest_pipe_name(data->pipe_id), data->primary->index);
+
+	lut_init(&lut_max, data->plane_degamma_lut_size);
+	lut_gen_max(&lut_max, 0xffff);
+	lut_init(&lut_half, data->plane_degamma_lut_size);
+	lut_gen_half(&lut_half, 0xffff);
+
+	igt_create_fb_with_bo_size(data->fd, data->w, data->h,
+				   format, 0,
+				   e, r,
+				   &afb, 0, 0);
+	draw_gradient_color_bar(&afb, data->w, data->h);
+
+	igt_plane_set_fb(data->primary, &afb);
+	set_plane_degamma_lut(data, &lut_max);
+	set_regamma_lut(data, &lut_half);
+	igt_display_commit2(display, COMMIT_ATOMIC);
+	igt_pipe_crc_collect_crc(data->pipe_crc, &new_crc);
+
+	if (!igt_check_crc_equal(&ref_crc, &new_crc)) {
+		result = false;
+		igt_warn("CRC mismatches with format " IGT_FORMAT_FMT "\n",
+			 IGT_FORMAT_ARGS(format));
+	}
+
+	igt_plane_set_fb(data->primary, NULL);
+	igt_remove_fb(data->fd, &afb);
+	lut_free(&lut_max);
+	return result;
+}
+
+static void test_plane_crtc_gamma_formats(data_t *data)
+{
+	int i;
+	igt_plane_t *plane;
+	igt_display_t *display = &data->display;
+	igt_fb_t rfb;
+	igt_crc_t ref_crc;
+	bool result = true;
+
+	test_init(data);
+	plane = data->primary;
+
+	/* draw test pattern and take CRC as reference */
+	igt_create_fb(data->fd, data->w, data->h, DRM_FORMAT_XRGB8888, 0, &rfb);
+	draw_fill_color_bar_half(&rfb, data->w, data->h);
+	igt_plane_set_fb(data->primary, &rfb);
+	set_plane_degamma_lut(data, NULL);
+	set_regamma_lut(data, NULL);
+	igt_display_commit2(display, COMMIT_ATOMIC);
+	igt_pipe_crc_collect_crc(data->pipe_crc, &ref_crc);
+	igt_plane_set_fb(data->primary, NULL);
+	igt_remove_fb(data->fd, &rfb);
+
+	/* test on all supported formats */
+	for (i = plane->format_mod_count-1; i >= 0; i--) {
+		if (!igt_fb_supported_format(plane->formats[i]))
+				continue;
+		result &= test_plane_crtc_gamma(data,  plane->formats[i], ref_crc);
+	}
+
+	set_plane_degamma_lut(data, NULL);
+	set_regamma_lut(data, NULL);
+	igt_display_commit2(display, COMMIT_ATOMIC);
+
+	igt_assert_f(result, "At least one CRC mismatch happened\n");
+
+	test_fini(data);
+}
+
 igt_main
 {
 	data_t data;
@@ -782,6 +894,8 @@ igt_main
 	igt_subtest("plane-ctm-mixed-mapping") test_plane_ctm_mixed_mapping(&data);
 	igt_subtest("plane-max-degamma") test_plane_max_degamma(&data);
 
+	igt_subtest("plane-crtc-degamma") test_plane_crtc_gamma_formats(&data);
+
 	igt_fixture
 	{
 		igt_display_fini(&data.display);
-- 
2.25.1



More information about the igt-dev mailing list