summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>2018-10-29 13:32:57 +0100
committerMaarten Lankhorst <maarten.lankhorst@linux.intel.com>2018-11-06 10:57:11 +0100
commit431f0cfa1475dcaa475d6c30610317b3467bd4e4 (patch)
treec82d3a7fd430e9db3167a2770fa036c57f36e0ef /tests
parent8b842bb7061ccd13be2f04ccd4b3728c63911aff (diff)
tests/kms_atomic_transition: Do not timeout when number of sprites is huge, v5.
We mostly care about the plane type, because sometimes the driver may do silly things when only a cursor is enabled for example, so we reduce the number of tests. This puts an upper bound on the number of plane combinations being tested, which is nice for gen11. Changes since v1: - Make 2 groups for overlay planes, and randomly put planes in either group. Changes since v2: - Include igt_rand.h to compiler error. Changes since v3: - Fix logical error resulting in crash. Changes since v4: - Fix logical error harder. Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> #v3
Diffstat (limited to 'tests')
-rw-r--r--tests/kms_atomic_transition.c44
1 files changed, 37 insertions, 7 deletions
diff --git a/tests/kms_atomic_transition.c b/tests/kms_atomic_transition.c
index 12bafe87e..ec5d25dec 100644
--- a/tests/kms_atomic_transition.c
+++ b/tests/kms_atomic_transition.c
@@ -22,6 +22,7 @@
*/
#include "igt.h"
+#include "igt_rand.h"
#include "drmtest.h"
#include "sw_sync.h"
#include <errno.h>
@@ -41,7 +42,7 @@
struct plane_parms {
struct igt_fb *fb;
- uint32_t width, height;
+ uint32_t width, height, mask;
};
/* globals for fence support */
@@ -131,7 +132,7 @@ wm_setup_plane(igt_display_t *display, enum pipe pipe,
for_each_plane_on_pipe(display, pipe, plane) {
int i = plane->index;
- if (!((1 << plane->index) & mask)) {
+ if (!mask || !(parms[i].mask & mask)) {
if (plane->values[IGT_PLANE_FB_ID])
igt_plane_set_fb(plane, NULL);
continue;
@@ -192,13 +193,16 @@ static void setup_parms(igt_display_t *display, enum pipe pipe,
struct igt_fb *primary_fb,
struct igt_fb *argb_fb,
struct igt_fb *sprite_fb,
- struct plane_parms *parms)
+ struct plane_parms *parms,
+ unsigned *iter_max)
{
uint64_t cursor_width, cursor_height;
unsigned sprite_width, sprite_height, prev_w, prev_h;
bool max_sprite_width, max_sprite_height, alpha = true;
uint32_t n_planes = display->pipes[pipe].n_planes;
+ uint32_t n_overlays = 0, overlays[n_planes];
igt_plane_t *plane;
+ uint32_t iter_mask = 3;
do_or_die(drmGetCap(display->drm_fd, DRM_CAP_CURSOR_WIDTH, &cursor_width));
if (cursor_width >= mode->hdisplay)
@@ -215,12 +219,37 @@ static void setup_parms(igt_display_t *display, enum pipe pipe,
parms[i].fb = primary_fb;
parms[i].width = mode->hdisplay;
parms[i].height = mode->vdisplay;
+ parms[i].mask = 1 << 0;
} else if (plane->type == DRM_PLANE_TYPE_CURSOR) {
parms[i].fb = argb_fb;
parms[i].width = cursor_width;
parms[i].height = cursor_height;
- } else
+ parms[i].mask = 1 << 1;
+ } else {
parms[i].fb = sprite_fb;
+ parms[i].mask = 1 << 2;
+
+ iter_mask |= 1 << 2;
+
+ overlays[n_overlays++] = i;
+ }
+ }
+
+ if (n_overlays >= 2) {
+ uint32_t i;
+
+ /*
+ * Create 2 groups for overlays, make sure 1 plane is put
+ * in each then spread the rest out.
+ */
+ iter_mask |= 1 << 3;
+ parms[overlays[n_overlays - 1]].mask = 1 << 3;
+
+ for (i = 1; i < n_overlays - 1; i++) {
+ int val = hars_petruska_f54_1_random_unsafe_max(2);
+
+ parms[overlays[i]].mask = 1 << (2 + val);
+ }
}
igt_create_fb(display->drm_fd, cursor_width, cursor_height,
@@ -229,7 +258,8 @@ static void setup_parms(igt_display_t *display, enum pipe pipe,
igt_create_fb(display->drm_fd, cursor_width, cursor_height,
DRM_FORMAT_ARGB8888, LOCAL_DRM_FORMAT_MOD_NONE, sprite_fb);
- if (n_planes < 3)
+ *iter_max = iter_mask + 1;
+ if (!n_overlays)
return;
/*
@@ -390,7 +420,7 @@ run_transition_test(igt_display_t *display, enum pipe pipe, igt_output_t *output
drmModeModeInfo *mode, override_mode;
igt_plane_t *plane;
igt_pipe_t *pipe_obj = &display->pipes[pipe];
- uint32_t iter_max = 1 << pipe_obj->n_planes, i;
+ uint32_t iter_max, i;
struct plane_parms parms[pipe_obj->n_planes];
unsigned flags = 0;
int ret;
@@ -428,7 +458,7 @@ run_transition_test(igt_display_t *display, enum pipe pipe, igt_output_t *output
igt_display_commit2(display, COMMIT_ATOMIC);
- setup_parms(display, pipe, mode, &fb, &argb_fb, &sprite_fb, parms);
+ setup_parms(display, pipe, mode, &fb, &argb_fb, &sprite_fb, parms, &iter_max);
/*
* In some configurations the tests may not run to completion with all