aboutsummaryrefslogtreecommitdiffstats
path: root/tests/kms_big_fb.c
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2019-05-22 18:11:53 +0300
committerVille Syrjälä <ville.syrjala@linux.intel.com>2019-05-28 22:39:12 +0300
commitb7e700567803237e2f3d7a8753fd4775f712d353 (patch)
tree3fd0e86f1ba536c4b98d1225b11fc8eb0893e8cd /tests/kms_big_fb.c
parent57b28c863f210b0d18769d561a5e1537b2a43b11 (diff)
downloadplatform_external_igt-gpu-tools-b7e700567803237e2f3d7a8753fd4775f712d353.tar.gz
platform_external_igt-gpu-tools-b7e700567803237e2f3d7a8753fd4775f712d353.tar.bz2
platform_external_igt-gpu-tools-b7e700567803237e2f3d7a8753fd4775f712d353.zip
tests/kms_big_fb: Delay the expensive big fb creation until the last moment
We already perform the format+mod+rotation test using the small fb, so we don't actually need to create the big fb until that test has been performed. We do need to calculate the big fb dimensions though so that we can calculate the coordinates we're going to use in the test. $ time kms_big_fb - real 0m52.902s + real 0m52.616s so not so great. But if I run each subtest separately it starts to add up: $ for i in `kms_big_fb --l` ; do kms_big_fb --r $i ; done - real 5m32.898s + real 4m32.164s The big difference between those two ways of running the test is at least partially due to the test reusing big fb between the different rotation subtests for each format+mod combo. Running each subtest individually can't get that benefit so avoiding needless big fb creation starts to make a difference. Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Diffstat (limited to 'tests/kms_big_fb.c')
-rw-r--r--tests/kms_big_fb.c77
1 files changed, 41 insertions, 36 deletions
diff --git a/tests/kms_big_fb.c b/tests/kms_big_fb.c
index c3520e22..b8813a33 100644
--- a/tests/kms_big_fb.c
+++ b/tests/kms_big_fb.c
@@ -43,6 +43,7 @@ typedef struct {
int width, height;
igt_rotation_t rotation;
int max_fb_width, max_fb_height;
+ int big_fb_width, big_fb_height;
uint64_t ram_size, aper_size, mappable_size;
igt_render_copyfunc_t render_copy;
drm_intel_bufmgr *bufmgr;
@@ -186,13 +187,32 @@ static void max_fb_size(data_t *data, int *width, int *height,
*width, *height);
}
+static void prep_fb(data_t *data)
+{
+ if (data->big_fb.fb_id)
+ return;
+
+ igt_create_fb(data->drm_fd,
+ data->big_fb_width, data->big_fb_height,
+ data->format, data->modifier,
+ &data->big_fb);
+
+ generate_pattern(data, &data->big_fb, 640, 480);
+}
+
+static void cleanup_fb(data_t *data)
+{
+ igt_remove_fb(data->drm_fd, &data->big_fb);
+ data->big_fb.fb_id = 0;
+}
+
static bool test_plane(data_t *data)
{
igt_plane_t *plane = data->plane;
struct igt_fb *small_fb = &data->small_fb;
struct igt_fb *big_fb = &data->big_fb;
- int w = big_fb->width - small_fb->width;
- int h = big_fb->height - small_fb->height;
+ int w = data->big_fb_width - small_fb->width;
+ int h = data->big_fb_height - small_fb->height;
struct {
int x, y;
} coords[] = {
@@ -235,16 +255,6 @@ static bool test_plane(data_t *data)
y &= ~1;
}
- /*
- * Make a 1:1 copy of the desired part of the big fb
- * rather than try to render the same pattern (translated
- * accordinly) again via cairo. Something in cairo's
- * rendering pipeline introduces slight differences into
- * the result if we try that, and so the crc will not match.
- */
- copy_pattern(data, small_fb, 0, 0, big_fb, x, y,
- small_fb->width, small_fb->height);
-
igt_plane_set_fb(plane, small_fb);
igt_plane_set_size(plane, data->width, data->height);
@@ -262,6 +272,22 @@ static bool test_plane(data_t *data)
return false;
}
+ /*
+ * To speed up skips we delay the big fb creation until
+ * the above rotation related check has been performed.
+ */
+ prep_fb(data);
+
+ /*
+ * Make a 1:1 copy of the desired part of the big fb
+ * rather than try to render the same pattern (translated
+ * accordinly) again via cairo. Something in cairo's
+ * rendering pipeline introduces slight differences into
+ * the result if we try that, and so the crc will not match.
+ */
+ copy_pattern(data, small_fb, 0, 0, big_fb, x, y,
+ small_fb->width, small_fb->height);
+
igt_display_commit2(&data->display, data->display.is_atomic ?
COMMIT_ATOMIC : COMMIT_UNIVERSAL);
@@ -352,6 +378,9 @@ static bool test_pipe(data_t *data)
static void test_scanout(data_t *data)
{
+ max_fb_size(data, &data->big_fb_width, &data->big_fb_height,
+ data->format, data->modifier);
+
for_each_pipe_with_valid_output(&data->display, data->pipe, data->output) {
if (test_pipe(data))
return;
@@ -361,29 +390,6 @@ static void test_scanout(data_t *data)
igt_skip("unsupported configuration\n");
}
-static void prep_fb(data_t *data)
-{
- int width, height;
-
- if (data->big_fb.fb_id)
- return;
-
- max_fb_size(data, &width, &height,
- data->format, data->modifier);
-
- igt_create_fb(data->drm_fd, width, height,
- data->format, data->modifier,
- &data->big_fb);
-
- generate_pattern(data, &data->big_fb, 640, 480);
-}
-
-static void cleanup_fb(data_t *data)
-{
- igt_remove_fb(data->drm_fd, &data->big_fb);
- data->big_fb.fb_id = 0;
-}
-
static void
test_size_overflow(data_t *data)
{
@@ -650,7 +656,6 @@ igt_main
formats[j].bpp, rotations[k].angle) {
igt_require(igt_fb_supported_format(data.format));
igt_require(igt_display_has_format_mod(&data.display, data.format, data.modifier));
- prep_fb(&data);
test_scanout(&data);
}
}