From: Mahesh Kumar <mahesh1.kumar@xxxxxxxxx> This patch adds a subtest related to pixel format testing. The test tries to create framebuffer with all supported pixel formats on every plane, and tries to draw them using cairo and commits the same on display. Changes since v1: - Make the test more generic and try on all planes, including legacy cursor. Signed-off-by: Mahesh Kumar <mahesh1.kumar@xxxxxxxxx> Signed-off-by: Jyoti Yadav <jyoti.r.yadav@xxxxxxxxx> Signed-off-by: Vidya Srinivas <vidya.srinivas@xxxxxxxxx> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@xxxxxxxxxxxxxxx> --- tests/kms_plane.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/tests/kms_plane.c b/tests/kms_plane.c index 92bf67f1018c..9672763fe619 100644 --- a/tests/kms_plane.c +++ b/tests/kms_plane.c @@ -368,6 +368,105 @@ test_plane_panning(data_t *data, enum pipe pipe, unsigned int flags) igt_skip_on(connected_outs == 0); } +static bool can_draw(uint32_t drm_format) +{ + const uint32_t *drm_formats; + int format_count, i; + + igt_get_all_cairo_formats(&drm_formats, &format_count); + + for (i = 0; i < format_count; i++) + if (drm_formats[i] == drm_format) + return true; + + return false; +} + +static void test_format_plane(data_t *data, enum pipe pipe, + igt_output_t *output, igt_plane_t *plane) +{ + igt_plane_t *primary; + struct igt_fb primary_fb, fb; + drmModeModeInfo *mode; + cairo_t *cr; + int i; + uint32_t format; + uint64_t width, height; + + mode = igt_output_get_mode(output); + if (plane->type != DRM_PLANE_TYPE_CURSOR) { + width = mode->hdisplay; + height = mode->vdisplay; + } else { + if (!plane->drm_plane) { + igt_debug("Only legacy cursor ioctl supported, skipping cursor plane\n"); + return; + } + do_or_die(drmGetCap(data->drm_fd, DRM_CAP_CURSOR_WIDTH, &width)); + do_or_die(drmGetCap(data->drm_fd, DRM_CAP_CURSOR_HEIGHT, &height)); + } + + igt_debug("Testing connector %s on %s plane %s.%u\n", + igt_output_name(output), kmstest_plane_type_name(plane->type), + kmstest_pipe_name(pipe), plane->index); + + igt_create_fb(data->drm_fd, mode->hdisplay, mode->vdisplay, + DRM_FORMAT_XRGB8888, LOCAL_DRM_FORMAT_MOD_NONE, &primary_fb); + + igt_output_set_pipe(output, pipe); + primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY); + igt_plane_set_fb(primary, &primary_fb); + + igt_display_commit2(&data->display, data->display.is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY); + + for (i = 0; i < plane->drm_plane->count_formats; i++) { + format = plane->drm_plane->formats[i]; + + if (!can_draw(format)) + continue; + + igt_debug("Testing format 0x%x on %s.%u\n", + format, kmstest_pipe_name(pipe), plane->index); + + igt_create_fb(data->drm_fd, width, height, + format, LOCAL_DRM_FORMAT_MOD_NONE, &fb); + + cr = igt_get_cairo_ctx(data->drm_fd, &fb); + igt_paint_color(cr, 0, 0, width, height, + 0.0, 1.0, 0.0); + if (width >= 164 && height >= 164) + igt_paint_color(cr, 100, 100, 64, 64, 0.0, 0.0, 0.0); + igt_assert(cairo_status(cr) == 0); + cairo_destroy(cr); + + igt_plane_set_fb(plane, &fb); + igt_display_commit2(&data->display, COMMIT_UNIVERSAL); + + igt_remove_fb(data->drm_fd, &fb); + } + + igt_plane_set_fb(primary, NULL); + igt_plane_set_fb(plane, NULL); + igt_remove_fb(data->drm_fd, &primary_fb); +} + +static void +test_pixel_formats(data_t *data, enum pipe pipe) +{ + igt_output_t *output; + + igt_display_require_output_on_pipe(&data->display, pipe); + + for_each_valid_output_on_pipe(&data->display, pipe, output) { + igt_plane_t *plane; + + for_each_plane_on_pipe(&data->display, pipe, plane) + test_format_plane(data, pipe, output, plane); + + igt_output_set_pipe(output, PIPE_ANY); + } +} + static void run_tests_for_pipe_plane(data_t *data, enum pipe pipe) { @@ -376,6 +475,10 @@ run_tests_for_pipe_plane(data_t *data, enum pipe pipe) igt_require(data->display.pipes[pipe].n_planes > 0); } + igt_subtest_f("pixel-format-pipe-%s-planes", + kmstest_pipe_name(pipe)) + test_pixel_formats(data, pipe); + igt_subtest_f("plane-position-covered-pipe-%s-planes", kmstest_pipe_name(pipe)) test_plane_position(data, pipe, TEST_POSITION_FULLY_COVERED); -- 2.15.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx