Re: [igt-dev] [PATCH i-g-t] tests/kms_available_modes_crc limit tested fb formats

Dhinakaran Pandiyan
2019-02-21T00:02:14Z

On Mon, 2019-02-18 at 16:22 +0200, Juha-Pekka Heikkila wrote:
> This test is causing too much useless noise. Limit tested
> fb formats to DRM_FORMAT_C8 and DRM_FORMAT_XBGR2101010 for now.
> These two formats are currently not tested otherwise thus
> they're left here for now. DRM_FORMAT_XBGR2101010 need to be
> included into IGT supported formats and DRM_FORMAT_C8 test need
> to be moved elsewhere, maybe into kms_plane.

Thanks for doing this.

>
> Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com>
> ---
> tests/kms_available_modes_crc.c | 217 +++++++++++++++---------------
> ----------
> 1 file changed, 83 insertions(+), 134 deletions(-)
>
> diff --git a/tests/kms_available_modes_crc.c
> b/tests/kms_available_modes_crc.c
> index 7ff385f..a51006b 100644
> --- a/tests/kms_available_modes_crc.c
> +++ b/tests/kms_available_modes_crc.c
> @@ -101,17 +101,17 @@ static void generate_comparison_crc_list(data_t
> *data, igt_output_t *output)
> igt_plane_set_fb(primary, &data->primary_fb);
> igt_display_commit2(&data->display, data->commit);
>
> + igt_pipe_crc_drain(data->pipe_crc);
> igt_pipe_crc_get_current(data->gfx_fd, data->pipe_crc, &data-
> >cursor_crc);
> igt_plane_set_fb(primary, NULL);
> igt_display_commit2(&data->display, data->commit);
>
> - intel_gen(intel_get_drm_devid(data->gfx_fd)) < 9 ?
> - igt_paint_color(cr, 0, 0, mode->hdisplay, mode-
> >vdisplay, 1.0, 1.0, 1.0) :
> - igt_paint_color_alpha(cr, 0, 0, mode->hdisplay, mode-
> >vdisplay, 1.0, 1.0, 1.0, 1.0);
> + igt_paint_color(cr, 0, 0, mode->hdisplay, mode->vdisplay, 1.0,
> 1.0, 1.0);
>
> igt_plane_set_fb(primary, &data->primary_fb);
> igt_display_commit2(&data->display, data->commit);
>
> + igt_pipe_crc_drain(data->pipe_crc);
> igt_pipe_crc_get_current(data->gfx_fd, data->pipe_crc, &data-
> >fullscreen_crc);
>
> cairo_destroy(cr);
> @@ -122,48 +122,11 @@ static const struct {
> uint32_t fourcc;
> char zeropadding;
> enum { BYTES_PP_1=1,
> - BYTES_PP_2=2,
> - BYTES_PP_4=4,
> - NV12,
> - P010,
> - SKIP4 } bpp;
> + BYTES_PP_4=4} bpp;
> uint32_t value;
> } fillers[] = {
> { DRM_FORMAT_C8, 0, BYTES_PP_1, 0xff},
> - { DRM_FORMAT_RGB565, 0, BYTES_PP_2, 0xffff},
> - { DRM_FORMAT_XRGB8888, 0, BYTES_PP_4, 0xffffffff},
> - { DRM_FORMAT_XBGR8888, 0, BYTES_PP_4, 0xffffffff},
> -
> - /*
> - * following two are skipped because blending seems to work
> - * incorrectly with exception of AR24 on cursor plane.
> - * Test still creates the planes, just filling plane
> - * and getting crc is skipped.
> - */
> - { DRM_FORMAT_ARGB8888, 0, SKIP4, 0xffffffff},
> - { DRM_FORMAT_ABGR8888, 0, SKIP4, 0x00ffffff},
> -
> - { DRM_FORMAT_XRGB2101010, 0, BYTES_PP_4, 0xffffffff},
> { DRM_FORMAT_XBGR2101010, 0, BYTES_PP_4, 0xffffffff},
> -
> - { DRM_FORMAT_YUYV, 0, BYTES_PP_4, 0x80eb80eb},
> - { DRM_FORMAT_YVYU, 0, BYTES_PP_4, 0x80eb80eb},
> - { DRM_FORMAT_VYUY, 0, BYTES_PP_4, 0xeb80eb80},
> - { DRM_FORMAT_UYVY, 0, BYTES_PP_4, 0xeb80eb80},
> -
> - /*
> - * (semi-)planar formats
> - */
> - { DRM_FORMAT_NV12, 0, NV12, 0x80eb},
> -#ifdef DRM_FORMAT_P010
> - { DRM_FORMAT_P010, 0, P010, 0x8000eb00},
> -#endif
> -#ifdef DRM_FORMAT_P012
> - { DRM_FORMAT_P012, 0, P010, 0x8000eb00},
> -#endif
> -#ifdef DRM_FORMAT_P016
> - { DRM_FORMAT_P016, 0, P010, 0x8000eb00},
> -#endif
> { 0, 0, 0, 0 }
> };
>
> @@ -175,10 +138,9 @@ static bool fill_in_fb(data_t *data,
> igt_output_t *output, igt_plane_t *plane,
> uint32_t format)
> {
> signed i, c, writesize;
> - unsigned short* ptemp_16_buf;
> unsigned int* ptemp_32_buf;
>
> - for( i = 0; fillers[i].fourcc != 0; i++ ) {
> + for( i = 0; i < ARRAY_SIZE(fillers)-1; i++ ) {
> if( fillers[i].fourcc == format )
> break;
> }
> @@ -190,53 +152,10 @@ static bool fill_in_fb(data_t *data,
> igt_output_t *output, igt_plane_t *plane,
> ptemp_32_buf[c] = fillers[i].value;
> writesize = data->size;
> break;
> - case BYTES_PP_2:
> - ptemp_16_buf = (unsigned short*)data->buf;
> - for (c = 0; c < data->size/2; c++)
> - ptemp_16_buf[c] = (unsigned
> short)fillers[i].value;
> - writesize = data->size;
> - break;
> case BYTES_PP_1:
> memset((void *)data->buf, fillers[i].value, data-
> >size);
> writesize = data->size;
> break;
> - case NV12:
> - memset((void *)data->buf, fillers[i].value&0xff,
> - data->fb.offsets[1]);
> -
> - memset((void *)(data->buf+data->fb.offsets[1]),
> - (fillers[i].value>>8)&0xff,
> - data->size - data->fb.offsets[1]);
> -
> - writesize = data->size;
> - break;
> - case P010:
> - ptemp_16_buf = (unsigned short*)data->buf;
> - for (c = 0; c < data->size/2; c++)
> - ptemp_16_buf[c] = (unsigned
> short)fillers[i].value&0xffff;
> -
> - ptemp_16_buf = (unsigned short*)(data->buf+data->size);
> - for (c = 0; c < data->size/2; c++)
> - ptemp_16_buf[c] = (unsigned
> short)(fillers[i].value>>16)&0xffff;
> -
> - writesize = data->size+data->size/2;
> - break;
> - case SKIP4:
> - if (fillers[i].fourcc == DRM_FORMAT_ARGB8888 &&
> - plane->type == DRM_PLANE_TYPE_CURSOR) {
> - /*
> - * special for cursor plane where blending works
> correctly.
> - */
> - ptemp_32_buf = (unsigned int*)data->buf;
> - for (c = 0; c < data->size/4; c++)
> - ptemp_32_buf[c] = fillers[i].value;
> - writesize = data->size;
> - break;
> - }
> - igt_info("Format %s CRC comparison skipped by
> design.\n",
> - (char*)&fillers[i].fourcc);
> -
> - return false;
> default:
> igt_info("Unsupported mode for test %s\n",
> (char*)&fillers[i].fourcc);
> @@ -271,26 +190,20 @@ static bool setup_fb(data_t *data, igt_output_t
> *output, igt_plane_t *plane,
> tiling = LOCAL_DRM_FORMAT_MOD_NONE;
> }
>
> - for (i = 0; fillers[i].fourcc != 0; i++) {
> - if (fillers[i].fourcc == format)
> + for( i = 0; i < ARRAY_SIZE(fillers)-1; i++ ) {
> + if( fillers[i].fourcc == format )
> break;
> }
>
> switch (fillers[i].bpp) {
> - case NV12:
> case BYTES_PP_1:
> bpp = 8;
> break;
> -
> - case P010:
> - case BYTES_PP_2:
> - bpp = 16;
> - break;
> -
> - case SKIP4:
> case BYTES_PP_4:
> bpp = 32;
> break;
> + default:
> + return false;

Hmm, we should never hit this condition. Mark this as a failure so that
the test gets fixed?

> }
>
> igt_get_fb_tile_size(data->gfx_fd, tiling, bpp,
> @@ -299,17 +212,6 @@ static bool setup_fb(data_t *data, igt_output_t
> *output, igt_plane_t *plane,
> data->fb.strides[0] = ALIGN(w * bpp / 8, tile_width);
> gemsize = data->size = data->fb.strides[0] * ALIGN(h,
> tile_height);
>
> - if (fillers[i].bpp == P010 || fillers[i].bpp == NV12) {
> - data->fb.offsets[1] = data->size;
> - data->fb.strides[1] = data->fb.strides[0];
> - gemsize = data->size * 2;
> -
> - if (fillers[i].bpp == NV12)
> - data->size += data->fb.strides[1] * ALIGN(h/2,
> tile_height);
> -
> - num_planes = 2;
> - }
> -
> data->gem_handle = gem_create(data->gfx_fd, gemsize);
> ret = __gem_set_tiling(data->gfx_fd, data->gem_handle,
> igt_fb_mod_to_tiling(tiling),
> @@ -386,12 +288,23 @@ static bool prepare_crtc(data_t *data,
> igt_output_t *output,
>
> static int
> test_one_mode(data_t* data, igt_output_t *output, igt_plane_t*
> plane,
> - int mode)
> + int mode, enum pipe pipe)
s/mode/format
Comment applies to other places too.

> {
> igt_crc_t current_crc;
> signed rVal = 0;
> bool do_crc;
> - char* crccompare[2];
> + int i;
> +
> + /*
> + * Limit tests only to those fb formats listed in fillers table
> + */
> + for( i = 0; i < ARRAY_SIZE(fillers)-1; i++ ) {
> + if( fillers[i].fourcc == mode )
> + break;
> + }
> +
> + if(fillers[i].bpp == 0)
> + return false;
.bpp is always valid for the two formats that are tested, isn't it? In
that case .bpp == 0 is a test failure.

>
> if (prepare_crtc(data, output, plane, mode)){
> /*
> @@ -412,29 +325,30 @@ test_one_mode(data_t* data, igt_output_t
> *output, igt_plane_t* plane,
> if (plane->type != DRM_PLANE_TYPE_CURSOR) {
> if (!igt_check_crc_equal(&current_crc,
> &data->fullscreen_crc)) {
> - crccompare[0] =
> igt_crc_to_string(&current_crc);
> - crccompare[1] =
> igt_crc_to_string(&data->fullscreen_crc);
> - igt_warn("crc mismatch. target
> %.8s, result %.8s.\n", crccompare[0], crccompare[1]);
> - free(crccompare[0]);
> - free(crccompare[1]);
> + igt_warn("crc mismatch.
> connector %s using pipe %s" \
> + " plane index %d mode
> %.4s\n",
> + igt_output_name(output)
> ,
> + kmstest_pipe_name(pipe)
> ,
> + plane->index,
> + (char*)&mode);
> rVal++;
> }
> } else {
> if (!igt_check_crc_equal(&current_crc,
> &data->cursor_crc)) {
> - crccompare[0] =
> igt_crc_to_string(&current_crc);
> - crccompare[1] =
> igt_crc_to_string(&data->cursor_crc);
> - igt_warn("crc mismatch. target
> %.8s, result %.8s.\n", crccompare[0], crccompare[1]);
> - free(crccompare[0]);
> - free(crccompare[1]);
> + igt_warn("crc mismatch.
> connector %s using pipe %s" \
> + " plane index %d mode
> %.4s\n",
> + igt_output_name(output)
> ,
> + kmstest_pipe_name(pipe)
> ,
> + plane->index,
> + (char*)&mode);
> rVal++;
> }
> }
> }
> - remove_fb(data, output, plane);
> - return rVal;
> }
> - return 1;
> + remove_fb(data, output, plane);
> + return rVal;
> }
>
>
> @@ -445,14 +359,44 @@ test_available_modes(data_t* data)
> igt_plane_t *plane;
> int modeindex;
> enum pipe pipe;
> - int invalids = 0;
> + int invalids = 0, i, lut_size;
> drmModePlane *modePlane;
> - char planetype[3][8] = {"OVERLAY\0", "PRIMARY\0", "CURSOR\0" };
> +
> + struct {
> + uint16_t red;
> + uint16_t green;
> + uint16_t blue;
> + uint16_t reserved;
> + } *lut = NULL;
>
> for_each_pipe_with_valid_output(&data->display, pipe, output) {
> igt_output_set_pipe(output, pipe);
> igt_display_commit2(&data->display, data->commit);
>
> + if (igt_pipe_obj_has_prop(&data->display.pipes[pipe],
> IGT_CRTC_GAMMA_LUT_SIZE)) {
> + lut_size = igt_pipe_get_prop(&data->display,
> pipe,
> + IGT_CRTC_GAMMA_LUT
> _SIZE);
> +
> + lut = calloc(sizeof(*lut), lut_size);
> +
> + for (i = 0; i < lut_size; i++) {
> + lut[i].red = (i * 0xffff / (lut_size -
> 1)) & 0x8000;
> + lut[i].green = (i * 0xffff / (lut_size
> - 1)) & 0x8000;
> + lut[i].blue = (i * 0xffff / (lut_size -
> 1)) & 0x8000;
> + }
> +
> + igt_pipe_replace_prop_blob(&data->display,
> pipe,
> + IGT_CRTC_GAMMA_LUT,
> + lut, sizeof(*lut) *
> lut_size);
> + igt_display_commit2(&data->display, data-
> >commit);
> +
> + for (i = 0; i < lut_size; i++) {
> + lut[i].red = i * 0xffff / (lut_size -
> 1);
> + lut[i].green = i * 0xffff / (lut_size -
> 1);
> + lut[i].blue = i * 0xffff / (lut_size -
> 1);
> + }
> + }
> +
> data->pipe_crc = igt_pipe_crc_new(data->gfx_fd, pipe,
> INTEL_PIPE_CRC_SOURCE
> _AUTO);
>
> @@ -467,29 +411,34 @@ test_available_modes(data_t* data)
> modePlane = drmModeGetPlane(data->gfx_fd,
> plane->drm_plane-
> >plane_id);
>
> + if (plane->type == DRM_PLANE_TYPE_CURSOR)
> + continue;
> +
> for (modeindex = 0;
> modeindex < modePlane->count_formats;
> modeindex++) {
> data->format.dword = modePlane-
> >formats[modeindex];
>
> - igt_info("Testing connector %s using
> pipe %s" \
> - " plane index %d type %s mode
> %s\n",
> - igt_output_name(output),
> - kmstest_pipe_name(pipe),
> - plane->index,
> - planetype[plane->type],
> - (char*)&data->format.name);

Not sure why this was removed, perhaps convert it to igt_debug()? It's
hard to tell what is being tested now even with the --debug option.

If you want to address the comments in a separate patch, feel free to
add
Reviewed-by: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>

> -
> invalids += test_one_mode(data, output,
> plane,
> - modePlane-
> >formats[modeindex]);
> + modePlane-
> >formats[modeindex],
> + pipe);
> }
> drmModeFreePlane(modePlane);
> }
> igt_pipe_crc_stop(data->pipe_crc);
> igt_pipe_crc_free(data->pipe_crc);
> - igt_display_commit2(&data->display, data->commit);
> +
> + if (lut != NULL) {
> + igt_pipe_replace_prop_blob(&data->display,
> pipe,
> + IGT_CRTC_GAMMA_LUT,
> + lut, sizeof(*lut) *
> lut_size);
> + free(lut);
> + lut = NULL;
> + }
> +
> igt_output_set_pipe(output, PIPE_NONE);
> + igt_display_commit2(&data->display, data->commit);
> }
> igt_assert(invalids == 0);
> }