Hi atipre, On 2026-10-25 at 14:24:20 -0400, atipre wrote: > The existing writeback tests validate captured framebuffer contents, but > do not keep pipe CRC capture active across writeback completion. This > misses the VKMS bug where writeback cleanup disables the composer while > CRC capture still needs it, leaving subsequent CRC reads waiting for > samples that never arrive. > > Add writeback-preserves-crc. Complete the initial modeset before starting > capture and establish reference CRCs for separate red and blue input > framebuffers. Keep capture open across four alternating writebacks, wait > for each output fence, and compare three fresh CRC samples with the > corresponding reference after each writeback. Use atomic updates without > ALLOW_MODESET once capture starts, and release capture from the final > fixture so a failed subtest also closes it. > > Check output fence status in the shared wait helper so a signalled error > fence cannot be treated as a successful writeback. > > On ARM64 QEMU with one and two CPUs, the new subtest fails on unmodified > mainline and passes with the local VKMS composer-user lifetime > fix. Four existing applicable writeback subtests pass on both kernels; > the two XRGB2101010 subtests skip because the format probe rejects them. > > Signed-off-by: atipre <[email protected]>
It would be preferable to have Full Name instead of nick, should this be: Signed-off-by: Tipre Aditya <[email protected]> ? If yes, add also same From: at beginnig or configure your git. +cc Swati and Karthik Cc: Karthik B S <[email protected]> Cc: Swati Sharma <[email protected]> Regards, Kamil > --- > tests/kms_writeback.c | 62 +++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 62 insertions(+) > > diff --git a/tests/kms_writeback.c b/tests/kms_writeback.c > index 7c30e8e..71317cf 100644 > --- a/tests/kms_writeback.c > +++ b/tests/kms_writeback.c > @@ -64,6 +64,10 @@ > * > * SUBTEST: writeback-pixel-formats > * Description: Check the writeback format > + * > + * SUBTEST: writeback-preserves-crc > + * Description: CRC capture remains active across completed writebacks > + * Driver requirement: i915, xe, vkms > */ > > IGT_TEST_DESCRIPTION( > @@ -317,6 +321,7 @@ static void get_and_wait_out_fence(igt_output_t *output) > > ret = sync_fence_wait(output->writeback_out_fence_fd, 1000); > igt_assert_f(ret == 0, "sync_fence_wait failed: %s\n", strerror(-ret)); > + igt_assert_eq(sync_fence_status(output->writeback_out_fence_fd), 1); > close(output->writeback_out_fence_fd); > output->writeback_out_fence_fd = -1; > } > @@ -537,6 +542,7 @@ int igt_main_args("b:c:f:dl", long_options, help_str, > opt_handler, NULL) > igt_output_t *output; > igt_plane_t *plane; > igt_fb_t input_fb, input_fb_10bit; > + static igt_pipe_crc_t *pipe_crc; > drmModeModeInfo mode; > unsigned int fb_id; > int ret; > @@ -709,7 +715,63 @@ int igt_main_args("b:c:f:dl", long_options, help_str, > opt_handler, NULL) > igt_remove_fb(display.drm_fd, &output_fb); > } > > + igt_describe("CRC capture remains active across completed writebacks"); > + igt_subtest("writeback-preserves-crc") { > + igt_fb_t blue_fb, output_fb; > + igt_fb_t *colors[] = { &input_fb, &blue_fb }; > + igt_crc_t reference[2], crc; > + int i, j; > + > + igt_skip_on(data.dump_check || data.list_modes); > + igt_require(data.supported_colors & XRGB8888); > + igt_require_pipe_crc(display.drm_fd); > + > + igt_create_color_fb(display.drm_fd, mode.hdisplay, > mode.vdisplay, > + DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_LINEAR, > + 0.0, 0.0, 1.0, &blue_fb); > + igt_create_fb(display.drm_fd, mode.hdisplay, mode.vdisplay, > + DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_LINEAR, > + &output_fb); > + fill_fb(&input_fb, 0x00ff0000); > + igt_plane_set_fb(plane, &input_fb); > + igt_output_set_writeback_fb(output, NULL); > + igt_display_commit_atomic(&display, > DRM_MODE_ATOMIC_ALLOW_MODESET, NULL); > + > + /* Finish the modeset before starting continuous CRC capture. */ > + pipe_crc = igt_pipe_crc_new(display.drm_fd, > output->config.crtc_index, > + IGT_PIPE_CRC_SOURCE_AUTO); > + igt_pipe_crc_start(pipe_crc); > + > + /* Establish both references before writeback can affect > capture. */ > + for (i = 0; i < ARRAY_SIZE(colors); i++) { > + igt_plane_set_fb(plane, colors[i]); > + igt_display_commit_atomic(&display, 0, NULL); > + igt_pipe_crc_get_current(display.drm_fd, pipe_crc, > &reference[i]); > + } > + > + for (i = 0; i < 4; i++) { > + int color = i % ARRAY_SIZE(colors); > + > + igt_plane_set_fb(plane, colors[color]); > + igt_output_set_writeback_fb(output, &output_fb); > + igt_display_commit_atomic(&display, 0, NULL); > + get_and_wait_out_fence(output); > + > + /* Require fresh frames without stopping or restarting > capture. */ > + for (j = 0; j < 3; j++) { > + igt_pipe_crc_get_current(display.drm_fd, > pipe_crc, &crc); > + igt_assert_crc_equal(&reference[color], &crc); > + } > + } > + > + igt_plane_set_fb(plane, &input_fb); > + igt_display_commit_atomic(&display, 0, NULL); > + igt_remove_fb(display.drm_fd, &blue_fb); > + igt_remove_fb(display.drm_fd, &output_fb); > + } > + > igt_fixture() { > + igt_pipe_crc_free(pipe_crc); > cleanup_writeback(&display, output); > igt_remove_fb(display.drm_fd, &input_fb); > > > base-commit: bb76404eac7032ba85c53eac15b76e4fadaff0de > -- > 2.50.1 (Apple Git-155) >
