[PATCH i-g-t 3/4] tests/kms_atomic: Add solid fill plane subtest
Kamil Konieczny
kamil.konieczny at linux.intel.com
Tue Dec 19 13:59:20 UTC 2023
Hi Jessica,
On 2023-12-15 at 16:40:23 -0800, Jessica Zhang wrote:
> Add a basic test for solid fill planes.
>
> This test will first commit a single-color framebuffer plane then
> a solid fill plane with the same contents. It then validates the solid
> fill plane by comparing the resulting CRC with the CRC of the reference
> framebuffer commit.
>
> Signed-off-by: Jessica Zhang <quic_jesszhan at quicinc.com>
> ---
> tests/kms_atomic.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 94 insertions(+)
>
> diff --git a/tests/kms_atomic.c b/tests/kms_atomic.c
> old mode 100644
> new mode 100755
> index 2b6e9a8f0383..8f81e65ad84f
> --- a/tests/kms_atomic.c
> +++ b/tests/kms_atomic.c
> @@ -128,6 +128,13 @@ enum kms_atomic_check_relax {
> PLANE_RELAX_FB = (1 << 1)
> };
>
> +struct solid_fill_blob {
> + uint32_t r;
> + uint32_t g;
> + uint32_t b;
> + uint32_t pad;
> +};
> +
> static inline int damage_rect_width(struct drm_mode_rect *r)
> {
> return r->x2 - r->x1;
> @@ -1322,6 +1329,79 @@ static void atomic_plane_damage(data_t *data)
> igt_remove_fb(data->drm_fd, &fb_2);
> }
>
> +static void test_solid_fill_plane(data_t *data, igt_output_t *output, igt_plane_t *plane)
> +{
> + struct drm_mode_create_blob c;
> + struct drm_mode_destroy_blob d;
> + drmModeModeInfo *mode = igt_output_get_mode(output);
> + struct drm_mode_rect rect = { 0 };
> + struct igt_fb ref_fb;
> + igt_pipe_crc_t *pipe_crc;
> + igt_crc_t ref_crc, new_crc;
> + enum pipe pipe = data->pipe->pipe;
> + int height, width;
> + int ret;
> +
> + struct solid_fill_blob blob_data = {
> + .r = 0x00000000,
> + .g = 0x00000000,
> + .b = 0xff000000,
> + .pad = 0x0,
> + };
> +
> + rect.x1 = 0;
> + rect.x2 = mode->hdisplay;
> + rect.y1 = 0;
> + rect.y2 = mode->vdisplay;
> +
> + height = rect.y2 - rect.y1;
> + width = rect.x2 - rect.x1;
> +
> + igt_require(igt_plane_has_prop(plane, IGT_PLANE_SOLID_FILL));
> + igt_require(igt_plane_has_prop(plane, IGT_PLANE_PIXEL_SOURCE));
> +
> + c.data = (uintptr_t) &blob_data;
> + c.length = sizeof(blob_data);
> +
> + pipe_crc = igt_pipe_crc_new(data->drm_fd, pipe,
> + IGT_PIPE_CRC_SOURCE_AUTO);
> +
> + /* get reference CRC */
> + igt_create_color_fb(data->drm_fd, width, height,
> + DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_LINEAR,
> + 0.0, 0.0, 1.0, &ref_fb);
> + igt_plane_set_fb(plane, &ref_fb);
> + igt_plane_set_position(plane, rect.x1, rect.y1);
> + igt_display_commit2(&data->display, COMMIT_ATOMIC);
> +
> + igt_pipe_crc_start(pipe_crc);
> + igt_pipe_crc_get_current(data->drm_fd, pipe_crc, &ref_crc);
> +
> + ret = drmIoctl(data->display.drm_fd, DRM_IOCTL_MODE_CREATEPROPBLOB, &c);
> + igt_assert(ret == 0);
> +
> + /* test solid fill plane */
> + igt_plane_set_solid_fill(plane, &rect, c.blob_id);
> + igt_plane_set_prop_enum(plane, IGT_PLANE_PIXEL_SOURCE, "SOLID_FILL");
> +
> + igt_display_commit2(&data->display, COMMIT_ATOMIC);
> + igt_pipe_crc_get_current(data->drm_fd, pipe_crc, &new_crc);
> + igt_assert_crc_equal(&ref_crc, &new_crc);
> +
> + /* Switch back to FB pixel source */
> + igt_plane_set_prop_value(plane, IGT_PLANE_SOLID_FILL, 0);
> + igt_plane_set_prop_enum(plane, IGT_PLANE_PIXEL_SOURCE, "FB");
> + igt_display_commit2(&data->display, COMMIT_ATOMIC);
> +
> + d.blob_id = c.blob_id;
> + ret = drmIoctl(data->drm_fd, DRM_IOCTL_MODE_DESTROYPROPBLOB, &d);
> + igt_assert(ret == 0);
> +
> + igt_pipe_crc_stop(pipe_crc);
> + igt_pipe_crc_free(pipe_crc);
> + igt_remove_fb(data->drm_fd, &ref_fb);
> +}
> +
> static void atomic_setup(data_t *data, enum pipe pipe, igt_output_t *output)
> {
> drmModeModeInfo *mode;
> @@ -1634,6 +1714,20 @@ igt_main_args("e", NULL, help_str, opt_handler, NULL)
> }
> }
>
Please add also description at begin of file, one at each test added,
something like:
* SUBTEST: plane-primary-solid-fill
* Description: fill primary planes with solid color
Above example can be incorrect, please correct it as needed.
For verification look if there are any build warnings at patchwork, like:
Warning: Missing documentation for igt at kms_atomic@plane-cursor-solid-fill
Warning: Missing documentation for igt at kms_atomic@plane-primary-solid-fill
+cc Bhanu
Regards,
Kamil
> + igt_describe("Test case for solid fill primary planes");
> + igt_subtest_with_dynamic("plane-primary-solid-fill") {
> + for_each_pipe_with_single_output(&data.display, pipe, output) {
> + if (!pipe_output_combo_valid(&data.display, pipe, output))
> + continue;
> +
> + igt_dynamic_f("pipe-%s-%s", kmstest_pipe_name(pipe), igt_output_name(output)) {
> + atomic_setup(&data, pipe, output);
> + test_solid_fill_plane(&data, output, data.primary);
> + atomic_clear(&data, pipe, output);
> + }
> + }
> + }
> +
> igt_fixture {
> igt_display_fini(&data.display);
> drm_close_driver(data.drm_fd);
>
> --
> 2.43.0
>
More information about the igt-dev
mailing list