[igt-dev] [PATCH i-g-t] tests/kms_plane: Reduce pixel format test execution time
Ville Syrjala
ville.syrjala at linux.intel.com
Mon Oct 21 17:50:01 UTC 2019
From: Ville Syrjälä <ville.syrjala at linux.intel.com>
By default reduce the set of colors we test by half, and
only test all the YCbCr range/encoding combinations for
linear buffers. This should hopefully still provide decent
coverage with a big reduction in execution time.
The previous more extensive coverage is now hidden behind
the --extended command line argument.
On KBL:
time kms_plane --r pixel-format-pipe-A-planes
- real 1m7,995s
+ real 0m22,943s
Further ideas for more reduction:
- Don't test on all planes (eg. on icl+ we could test on one hdr
plane, one sdr uv plane, and one sdr y plane)
- Don't test absolutely every pixel format + modifier combination
- Pipeline even deeper to make each color checked take only a single
frame (currently I think it should be taking two frames per color)
Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
---
tests/kms_plane.c | 79 ++++++++++++++++++++++++++++++++++++++---------
1 file changed, 65 insertions(+), 14 deletions(-)
diff --git a/tests/kms_plane.c b/tests/kms_plane.c
index 5f1a73f88dff..86a3a6296d26 100644
--- a/tests/kms_plane.c
+++ b/tests/kms_plane.c
@@ -48,7 +48,10 @@ typedef struct {
int drm_fd;
igt_display_t display;
igt_pipe_crc_t *pipe_crc;
+ const color_t *colors;
+ int num_colors;
uint32_t crop;
+ bool extended;
} data_t;
static color_t red = { 1.0f, 0.0f, 0.0f };
@@ -362,7 +365,7 @@ test_plane_panning(data_t *data, enum pipe pipe, unsigned int flags)
test_fini(data);
}
-static const color_t colors[] = {
+static const color_t colors_extended[] = {
{ 1.0f, 0.0f, 0.0f, },
{ 0.0f, 1.0f, 0.0f, },
{ 0.0f, 0.0f, 1.0f, },
@@ -373,6 +376,13 @@ static const color_t colors[] = {
{ 1.0f, 1.0f, 0.0f, },
};
+static const color_t colors_reduced[] = {
+ { 1.0f, 0.0f, 0.0f, },
+ { 1.0f, 1.0f, 1.0f, },
+ { 0.0f, 0.0f, 0.0f, },
+ { 0.0f, 1.0f, 1.0f, },
+};
+
static void set_legacy_lut(data_t *data, enum pipe pipe,
uint16_t mask)
{
@@ -436,9 +446,8 @@ static void test_format_plane_color(data_t *data, enum pipe pipe,
int width, int height,
enum igt_color_encoding color_encoding,
enum igt_color_range color_range,
- int color, igt_crc_t *crc, struct igt_fb *fb)
+ const color_t *c, igt_crc_t *crc, struct igt_fb *fb)
{
- const color_t *c = &colors[color];
struct igt_fb old_fb = *fb;
cairo_t *cr;
@@ -522,21 +531,22 @@ static bool test_format_plane_colors(data_t *data, enum pipe pipe,
int width, int height,
enum igt_color_encoding encoding,
enum igt_color_range range,
- igt_crc_t ref_crc[ARRAY_SIZE(colors)],
+ igt_crc_t ref_crc[],
struct igt_fb *fb)
{
int crc_mismatch_count = 0;
unsigned int crc_mismatch_mask = 0;
bool result = true;
- for (int i = 0; i < ARRAY_SIZE(colors); i++) {
+ for (int i = 0; i < data->num_colors; i++) {
+ const color_t *c = &data->colors[i];
igt_crc_t crc;
test_format_plane_color(data, pipe, plane,
format, modifier,
width, height,
encoding, range,
- i, &crc, fb);
+ c, &crc, fb);
if (!igt_check_crc_equal(&crc, &ref_crc[i])) {
crc_mismatch_count++;
@@ -548,7 +558,7 @@ static bool test_format_plane_colors(data_t *data, enum pipe pipe,
if (crc_mismatch_count)
igt_warn("CRC mismatches with format " IGT_FORMAT_FMT " on %s.%u with %d/%d solid colors tested (0x%X)\n",
IGT_FORMAT_ARGS(format), kmstest_pipe_name(pipe),
- plane->index, crc_mismatch_count, (int)ARRAY_SIZE(colors), crc_mismatch_mask);
+ plane->index, crc_mismatch_count, data->num_colors, crc_mismatch_mask);
return result;
}
@@ -557,7 +567,7 @@ static bool test_format_plane_rgb(data_t *data, enum pipe pipe,
igt_plane_t *plane,
uint32_t format, uint64_t modifier,
int width, int height,
- igt_crc_t ref_crc[ARRAY_SIZE(colors)],
+ igt_crc_t ref_crc[],
struct igt_fb *fb)
{
igt_info("Testing format " IGT_FORMAT_FMT " / modifier 0x%" PRIx64 " on %s.%u\n",
@@ -576,7 +586,7 @@ static bool test_format_plane_yuv(data_t *data, enum pipe pipe,
igt_plane_t *plane,
uint32_t format, uint64_t modifier,
int width, int height,
- igt_crc_t ref_crc[ARRAY_SIZE(colors)],
+ igt_crc_t ref_crc[],
struct igt_fb *fb)
{
bool result = true;
@@ -608,7 +618,18 @@ static bool test_format_plane_yuv(data_t *data, enum pipe pipe,
format, modifier,
width, height,
e, r, ref_crc, fb);
+
+ /*
+ * Only test all combinations for linear or
+ * if the user asked for extended tests.
+ */
+ if (result && !data->extended &&
+ modifier != DRM_FORMAT_MOD_LINEAR)
+ break;
}
+ if (result && !data->extended &&
+ modifier != DRM_FORMAT_MOD_LINEAR)
+ break;
}
return result;
@@ -622,7 +643,7 @@ static bool test_format_plane(data_t *data, enum pipe pipe,
uint32_t format, ref_format;
uint64_t modifier, ref_modifier;
uint64_t width, height;
- igt_crc_t ref_crc[ARRAY_SIZE(colors)];
+ igt_crc_t ref_crc[ARRAY_SIZE(colors_extended)];
bool result = true;
/*
@@ -679,13 +700,15 @@ static bool test_format_plane(data_t *data, enum pipe pipe,
igt_remove_fb(data->drm_fd, &test_fb);
}
- for (int i = 0; i < ARRAY_SIZE(colors); i++) {
+ for (int i = 0; i < data->num_colors; i++) {
+ const color_t *c = &data->colors[i];
+
test_format_plane_color(data, pipe, plane,
format, modifier,
width, height,
IGT_COLOR_YCBCR_BT709,
IGT_COLOR_YCBCR_LIMITED_RANGE,
- i, &ref_crc[i], &fb);
+ c, &ref_crc[i], &fb);
}
/*
@@ -693,7 +716,7 @@ static bool test_format_plane(data_t *data, enum pipe pipe,
* at least avoids claiming success when everything is just
* black all the time (eg. if the plane is never even on).
*/
- igt_require(num_unique_crcs(ref_crc, ARRAY_SIZE(colors)) > 1);
+ igt_require(num_unique_crcs(ref_crc, data->num_colors) > 1);
for (int i = 0; i < plane->format_mod_count; i++) {
format = plane->formats[i];
@@ -744,6 +767,14 @@ test_pixel_formats(data_t *data, enum pipe pipe)
igt_output_t *output;
igt_plane_t *plane;
+ if (data->extended) {
+ data->colors = colors_extended;
+ data->num_colors = ARRAY_SIZE(colors_extended);
+ } else {
+ data->colors = colors_reduced;
+ data->num_colors = ARRAY_SIZE(colors_reduced);
+ }
+
output = igt_get_single_output_for_pipe(&data->display, pipe);
igt_require(output);
@@ -824,10 +855,30 @@ run_tests_for_pipe_plane(data_t *data, enum pipe pipe)
TEST_SUSPEND_RESUME);
}
+static int opt_handler(int opt, int opt_index, void *_data)
+{
+ data_t *data = _data;
+
+ switch (opt) {
+ case 'e':
+ data->extended = true;
+ break;
+ }
+
+ return IGT_OPT_HANDLER_SUCCESS;
+}
+
+static const struct option long_opts[] = {
+ { .name = "extended", .has_arg = false, .val = 'e', },
+ {}
+};
+
+static const char help_str[] =
+ " --extended\t\tRun the extended tests\n";
static data_t data;
-igt_main
+igt_main_args("", long_opts, help_str, opt_handler, &data)
{
enum pipe pipe;
--
2.21.0
More information about the igt-dev
mailing list