summaryrefslogtreecommitdiff
path: root/tests/kms_frontbuffer_tracking.c
diff options
context:
space:
mode:
authorPaulo Zanoni <paulo.r.zanoni@intel.com>2015-10-20 16:16:04 -0200
committerPaulo Zanoni <paulo.r.zanoni@intel.com>2015-10-23 15:00:45 -0200
commitefc2e39a458317d02e9f72b9eb277347c858ca59 (patch)
treee1af2b9264bcd9e03665eed7f0863fff1230e7a5 /tests/kms_frontbuffer_tracking.c
parent196179a2bcab12da8b35d730d8fb0e8cf2c10a87 (diff)
kms_frontbuffer_tracking: add stridechange subtest
This is a corner case not exercised by the other subtests. The test is expected to pass both with the current Kernel tree and with the patches that are on the mailing list. The patches currently on the mailing list change how the CFB is allocated, and this subtest is designed to make sure everything still works as expected. Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
Diffstat (limited to 'tests/kms_frontbuffer_tracking.c')
-rw-r--r--tests/kms_frontbuffer_tracking.c47
1 files changed, 46 insertions, 1 deletions
diff --git a/tests/kms_frontbuffer_tracking.c b/tests/kms_frontbuffer_tracking.c
index 2c0295cc..e183a06e 100644
--- a/tests/kms_frontbuffer_tracking.c
+++ b/tests/kms_frontbuffer_tracking.c
@@ -2876,6 +2876,47 @@ static void badstride_subtest(const struct test_mode *t)
igt_remove_fb(drm.fd, &wide_fb);
}
+/**
+ * stridechange - change the frontbuffer stride by doing a modeset
+ *
+ * METHOD
+ * This test sets a mode on a CRTC, then creates a buffer with a different
+ * stride - still compatible with FBC -, and sets the mode on it. The Kernel
+ * currently shortcuts the modeset path for this case, so it won't trigger
+ * calls to xx_crtc_enable or xx_crtc_disable, and that could lead to
+ * problems, so test the case.
+ *
+ * EXPECTED RESULTS
+ * With the current Kernel, FBC may or may not remain enabled on this case,
+ * but we can still check the CRC values.
+ *
+ * FAILURES
+ * A bad Kernel may just not resize the CFB while keeping FBC enabled, and
+ * this can lead to underruns or stolen memory corruption. Underruns usually
+ * lead to CRC check errors, and stolen memory corruption can't be easily
+ * checked currently. A bad Kernel may also just throw some WARNs on dmesg.
+ */
+static void stridechange_subtest(const struct test_mode *t)
+{
+ struct igt_fb new_fb;
+ struct modeset_params *params = pick_params(t);
+
+ prepare_subtest(t, NULL);
+
+ create_fb(t->format, params->fb.fb->width + 512, params->fb.fb->height,
+ LOCAL_I915_FORMAT_MOD_X_TILED, t->plane, &new_fb);
+ fill_fb(&new_fb, COLOR_PRIM_BG);
+
+ params->fb.fb = &new_fb;
+ set_mode_for_params(params);
+
+ /* We can't assert that FBC will be enabled since there may not be
+ * enough space for the CFB, but we can check the CRC. */
+ do_assertions(DONT_ASSERT_FEATURE_STATUS);
+
+ igt_remove_fb(drm.fd, &new_fb);
+}
+
static int opt_handler(int option, int option_index, void *data)
{
switch (option) {
@@ -3276,10 +3317,14 @@ int main(int argc, char *argv[])
igt_subtest_f("%s-modesetfrombusy", feature_str(t.feature))
modesetfrombusy_subtest(&t);
- if (t.feature & FEATURE_FBC)
+ if (t.feature & FEATURE_FBC) {
igt_subtest_f("%s-badstride", feature_str(t.feature))
badstride_subtest(&t);
+ igt_subtest_f("%s-stridechange", feature_str(t.feature))
+ stridechange_subtest(&t);
+ }
+
if (t.feature & FEATURE_PSR)
igt_subtest_f("%s-slowdraw", feature_str(t.feature))
slow_draw_subtest(&t);