[igt-dev] [PATCH i-g-t 4/6] tests/kms_ccs: Test bad params for all CCS planes
Juha-Pekka Heikkila
juhapekka.heikkila at gmail.com
Tue Aug 31 17:49:06 UTC 2021
Look ok to me
Reviewed-by: Juha-Pekka Heikkila <juhapekka.heikkila at gmail.com>
On 27.8.2021 17.57, Imre Deak wrote:
> Test creating an FB with incorrect CCS plane parameters for all CCS
> planes. While at it move all the incorrect FB parameter subtests earlier
> before generating an FB. For these subtests we won't modeset and so
> don't need to generate FBs with a test pattern. Exceptions are the
> bad-rotation subtests which also do a modeset.
>
> Signed-off-by: Imre Deak <imre.deak at intel.com>
> ---
> tests/kms_ccs.c | 180 ++++++++++++++++++++++++++++++------------------
> 1 file changed, 112 insertions(+), 68 deletions(-)
>
> diff --git a/tests/kms_ccs.c b/tests/kms_ccs.c
> index 52252c633..7440f8427 100644
> --- a/tests/kms_ccs.c
> +++ b/tests/kms_ccs.c
> @@ -44,9 +44,9 @@ enum test_flags {
> TEST_ALL_PLANES = 1 << 9,
> };
>
> -#define TEST_FAIL_ON_ADDFB2 \
> - (TEST_BAD_PIXEL_FORMAT | TEST_NO_AUX_BUFFER | TEST_BAD_CCS_HANDLE | \
> - TEST_BAD_AUX_STRIDE)
> +#define TEST_BAD_CCS_PLANE (TEST_NO_AUX_BUFFER | TEST_BAD_CCS_HANDLE | \
> + TEST_BAD_AUX_STRIDE)
> +#define TEST_FAIL_ON_ADDFB2 (TEST_BAD_PIXEL_FORMAT | TEST_BAD_CCS_PLANE)
>
> enum test_fb_flags {
> FB_COMPRESSED = 1 << 0,
> @@ -128,6 +128,17 @@ static void addfb_init(struct igt_fb *fb, struct drm_mode_fb_cmd2 *f)
> }
> }
>
> +static void
> +create_fb_prepare_add(int drm_fd, int width, int height,
> + uint32_t format, uint64_t modifier,
> + igt_fb_t *fb, struct drm_mode_fb_cmd2 *f)
> +{
> + igt_create_bo_for_fb(drm_fd, width, height, format, modifier, fb);
> + igt_assert(fb->gem_handle > 0);
> +
> + addfb_init(fb, f);
> +}
> +
> static bool is_ccs_cc_modifier(uint64_t modifier)
> {
> return modifier == I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS_CC;
> @@ -226,14 +237,96 @@ static void fill_fb_random(int drm_fd, igt_fb_t *fb)
> munmap(map, fb->size);
> }
>
> -static int get_ccs_plane_index(uint32_t format)
> +static void test_bad_ccs_plane(data_t *data, int width, int height, int ccs_plane,
> + enum test_fb_flags fb_flags)
> {
> - int index = 1;
> + struct igt_fb fb = {};
> + struct drm_mode_fb_cmd2 f = {};
> + uint32_t bad_ccs_bo = 0;
> + int ret;
>
> - if (igt_format_is_yuv_semiplanar(format))
> - return 2;
> + igt_assert(fb_flags & FB_COMPRESSED);
> + create_fb_prepare_add(data->drm_fd, width, height,
> + data->format, data->ccs_modifier,
> + &fb, &f);
>
> - return index;
> + /*
> + * The stride of CCS planes on GEN12+ is fixed, so we can check for
> + * an incorrect stride with the same delta as on earlier platforms.
> + */
> + if (fb_flags & FB_MISALIGN_AUX_STRIDE) {
> + igt_skip_on_f(width <= 1024,
> + "FB already has the smallest possible stride\n");
> + f.pitches[ccs_plane] -= 64;
> + }
> +
> + if (fb_flags & FB_SMALL_AUX_STRIDE) {
> + igt_skip_on_f(width <= 1024,
> + "FB already has the smallest possible stride\n");
> + f.pitches[ccs_plane] = ALIGN(f.pitches[ccs_plane] / 2, 128);
> + }
> +
> + if (fb_flags & FB_ZERO_AUX_STRIDE)
> + f.pitches[ccs_plane] = 0;
> +
> + /* Put the CCS buffer on a different BO. */
> + if (data->flags & TEST_BAD_CCS_HANDLE) {
> + bad_ccs_bo = gem_create(data->drm_fd, fb.size);
> + f.handles[ccs_plane] = bad_ccs_bo;
> + }
> +
> + if (data->flags & TEST_NO_AUX_BUFFER) {
> + f.handles[ccs_plane] = 0;
> + f.modifier[ccs_plane] = 0;
> + f.pitches[ccs_plane] = 0;
> + f.offsets[ccs_plane] = 0;
> + }
> +
> + ret = drmIoctl(data->drm_fd, DRM_IOCTL_MODE_ADDFB2, &f);
> + igt_assert_eq(ret, -1);
> + igt_assert_eq(errno, EINVAL);
> +
> + if (bad_ccs_bo)
> + gem_close(data->drm_fd, bad_ccs_bo);
> +
> + gem_close(data->drm_fd, fb.gem_handle);
> +}
> +
> +static void test_bad_ccs_plane_params(data_t *data, int width, int height,
> + enum test_fb_flags fb_flags)
> +{
> + for (int ccs_plane = 1;
> + ccs_plane <= (igt_format_is_yuv_semiplanar(data->format) ? 2 : 1);
> + ccs_plane++)
> + test_bad_ccs_plane(data, width, height, ccs_plane, fb_flags);
> +}
> +
> +static void test_bad_pixel_format(data_t *data, int width, int height,
> + enum test_fb_flags fb_flags)
> +{
> + struct igt_fb fb = {};
> + struct drm_mode_fb_cmd2 f = {};
> + int ret;
> +
> + igt_assert(fb_flags & FB_COMPRESSED);
> + create_fb_prepare_add(data->drm_fd, width, height,
> + DRM_FORMAT_RGB565, data->ccs_modifier,
> + &fb, &f);
> +
> + ret = drmIoctl(data->drm_fd, DRM_IOCTL_MODE_ADDFB2, &f);
> + igt_assert_eq(ret, -1);
> + igt_assert_eq(errno, EINVAL);
> +
> + gem_close(data->drm_fd, fb.gem_handle);
> +}
> +
> +static void test_bad_fb_params(data_t *data, int width, int height, enum test_fb_flags fb_flags)
> +{
> + if (data->flags & TEST_BAD_PIXEL_FORMAT)
> + test_bad_pixel_format(data, width, height, fb_flags);
> +
> + if (data->flags & TEST_BAD_CCS_PLANE)
> + test_bad_ccs_plane_params(data, width, height, fb_flags);
> }
>
> static void fast_clear_fb(int drm_fd, struct igt_fb *fb, const float *cc_color)
> @@ -259,16 +352,15 @@ static void generate_fb(data_t *data, struct igt_fb *fb,
> enum test_fb_flags fb_flags)
> {
> struct drm_mode_fb_cmd2 f = {0};
> - uint32_t format;
> uint64_t modifier;
> cairo_t *cr;
> - int index;
> int ret;
> const float cc_color[4] = {colors[!!data->plane].r,
> colors[!!data->plane].g,
> colors[!!data->plane].b,
> 1.0};
>
> +
> /* Use either compressed or Y-tiled to test. However, given the lack of
> * available bandwidth, we use linear for the primary plane when
> * testing sprites, since we cannot fit two CCS planes into the
> @@ -281,54 +373,14 @@ static void generate_fb(data_t *data, struct igt_fb *fb,
> else
> modifier = 0;
>
> - if (data->flags & TEST_BAD_PIXEL_FORMAT)
> - format = DRM_FORMAT_RGB565;
> - else
> - format = data->format;
> -
> - index = get_ccs_plane_index(format);
> -
> - igt_create_bo_for_fb(data->drm_fd, width, height, format, modifier, fb);
> - igt_assert(fb->gem_handle > 0);
> -
> - addfb_init(fb, &f);
> -
> - /*
> - * The stride of CCS planes on GEN12+ is fixed, so we can check for
> - * an incorrect stride with the same delta as on earlier platforms.
> - */
> - if (fb_flags & FB_COMPRESSED) {
> - if (fb_flags & FB_MISALIGN_AUX_STRIDE) {
> - igt_skip_on_f(width <= 1024,
> - "FB already has the smallest possible stride\n");
> - f.pitches[index] -= 64;
> - }
> -
> - if (fb_flags & FB_SMALL_AUX_STRIDE) {
> - igt_skip_on_f(width <= 1024,
> - "FB already has the smallest possible stride\n");
> - f.pitches[index] = ALIGN(f.pitches[index]/2, 128);
> - }
> -
> - if (fb_flags & FB_ZERO_AUX_STRIDE)
> - f.pitches[index] = 0;
> -
> - /* Put the CCS buffer on a different BO. */
> - if (data->flags & TEST_BAD_CCS_HANDLE)
> - f.handles[index] = gem_create(data->drm_fd, fb->size);
> -
> - if (data->flags & TEST_NO_AUX_BUFFER) {
> - f.handles[index] = 0;
> - f.modifier[index] = 0;
> - f.pitches[index] = 0;
> - f.offsets[index] = 0;
> - }
> - }
> + create_fb_prepare_add(data->drm_fd, width, height,
> + data->format, modifier,
> + fb, &f);
>
> if (data->flags & TEST_RANDOM) {
> srand(data->seed);
> fill_fb_random(data->drm_fd, fb);
> - } else if (!(data->flags & TEST_BAD_PIXEL_FORMAT)) {
> + } else {
> bool do_fast_clear = is_ccs_cc_modifier(data->ccs_modifier);
> bool do_solid_fill = do_fast_clear || data->plane;
> int c = !!data->plane;
> @@ -348,16 +400,7 @@ static void generate_fb(data_t *data, struct igt_fb *fb,
> }
>
> ret = drmIoctl(data->drm_fd, DRM_IOCTL_MODE_ADDFB2, &f);
> - if (data->flags & TEST_FAIL_ON_ADDFB2) {
> - igt_assert_eq(ret, -1);
> - igt_assert_eq(errno, EINVAL);
> -
> - if (f.handles[index])
> - gem_close(data->drm_fd, f.handles[index]);
> -
> - return;
> - } else
> - igt_assert_eq(ret, 0);
> + igt_assert_eq(ret, 0);
>
> if (check_ccs_planes)
> check_all_ccs_planes(data->drm_fd, fb, cc_color, !(data->flags & TEST_RANDOM));
> @@ -423,6 +466,11 @@ static bool try_config(data_t *data, enum test_fb_flags fb_flags,
>
> fb_width = min(MAX_SPRITE_PLANE_WIDTH, fb_width);
>
> + if (data->flags & TEST_FAIL_ON_ADDFB2) {
> + test_bad_fb_params(data, fb_width, drm_mode->vdisplay, fb_flags);
> + return true;
> + }
> +
> if (data->plane && fb_flags & FB_COMPRESSED) {
> if (!igt_plane_has_format_mod(data->plane, data->format,
> data->ccs_modifier))
> @@ -435,9 +483,6 @@ static bool try_config(data_t *data, enum test_fb_flags fb_flags,
> generate_fb(data, &fb, fb_width, drm_mode->vdisplay, fb_flags);
> }
>
> - if (data->flags & TEST_FAIL_ON_ADDFB2)
> - goto out_free_fbs;
> -
> igt_plane_set_position(primary, 0, 0);
> igt_plane_set_size(primary, drm_mode->hdisplay, drm_mode->vdisplay);
> igt_plane_set_fb(primary, &fb);
> @@ -475,7 +520,6 @@ static bool try_config(data_t *data, enum test_fb_flags fb_flags,
> igt_plane_set_rotation(primary, IGT_ROTATION_0);
> igt_display_commit2(display, commit);
>
> -out_free_fbs:
> if (fb_sprite.fb_id)
> igt_remove_fb(data->drm_fd, &fb_sprite);
> if (fb.fb_id)
>
More information about the igt-dev
mailing list