diff mbox

[v2] tests/gem_exec_params: add test for exec_fence params

Message ID 1486167010-15187-1-git-send-email-daniele.ceraolospurio@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Daniele Ceraolo Spurio Feb. 4, 2017, 12:10 a.m. UTC
Added a subtest for invalid FENCE_IN usage, updated invalid-flag subtest
and made the rsvd2 test skip when exec fences are available.

v2: add a test that tries to use the device fd as fence (Chris)

Cc: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
---
 lib/ioctl_wrappers.c    | 29 +++++++++++++++++++++++++++++
 lib/ioctl_wrappers.h    |  1 +
 tests/gem_exec_fence.c  | 14 --------------
 tests/gem_exec_params.c | 33 ++++++++++++++++++++++++++++++---
 4 files changed, 60 insertions(+), 17 deletions(-)
diff mbox

Patch

diff --git a/lib/ioctl_wrappers.c b/lib/ioctl_wrappers.c
index ccc5ccf..cd0c24b 100644
--- a/lib/ioctl_wrappers.c
+++ b/lib/ioctl_wrappers.c
@@ -1433,6 +1433,35 @@  bool gem_has_softpin(int fd)
 	return has_softpin;
 }
 
+#define LOCAL_PARAM_HAS_EXEC_FENCE 44
+/**
+ * gem_has_exec_fence:
+ * @fd: open i915 drm file descriptor
+ *
+ * Feature test macro to query whether in/out fence support in execbuffer is
+ * available.
+ *
+ * Returns: Whether fence support is available
+ */
+bool gem_has_exec_fence(int fd)
+{
+	static int has_exec_fence = -1;
+
+	if (has_exec_fence < 0) {
+		struct drm_i915_getparam gp;
+
+		memset(&gp, 0, sizeof(gp));
+		gp.param = LOCAL_PARAM_HAS_EXEC_FENCE;
+		gp.value = &has_exec_fence;
+
+		has_exec_fence = 0;
+		ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp, sizeof(gp));
+		errno = 0;
+	}
+
+	return has_exec_fence;
+}
+
 /**
  * gem_require_caching:
  * @fd: open i915 drm file descriptor
diff --git a/lib/ioctl_wrappers.h b/lib/ioctl_wrappers.h
index 5f3bbd1..64628df 100644
--- a/lib/ioctl_wrappers.h
+++ b/lib/ioctl_wrappers.h
@@ -164,6 +164,7 @@  uint64_t gem_aperture_size(int fd);
 uint64_t gem_global_aperture_size(int fd);
 uint64_t gem_mappable_aperture_size(void);
 bool gem_has_softpin(int fd);
+bool gem_has_exec_fence(int fd);
 
 /* check functions which auto-skip tests by calling igt_skip() */
 void gem_require_caching(int fd);
diff --git a/tests/gem_exec_fence.c b/tests/gem_exec_fence.c
index 3df436a..ddc5e7f 100644
--- a/tests/gem_exec_fence.c
+++ b/tests/gem_exec_fence.c
@@ -309,20 +309,6 @@  static void test_fence_flip(int i915)
 	igt_skip_on_f(1, "no fence-in for atomic flips\n");
 }
 
-static bool gem_has_exec_fence(int fd)
-{
-	struct drm_i915_getparam gp;
-	int val = -1;
-
-	memset(&gp, 0, sizeof(gp));
-	gp.param = LOCAL_PARAM_HAS_EXEC_FENCE;
-	gp.value = &val;
-
-	ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp);
-
-	return val > 0;
-}
-
 igt_main
 {
 	const struct intel_execution_engine *e;
diff --git a/tests/gem_exec_params.c b/tests/gem_exec_params.c
index f9a2054..8a6cb45 100644
--- a/tests/gem_exec_params.c
+++ b/tests/gem_exec_params.c
@@ -45,6 +45,8 @@ 
 #define LOCAL_I915_EXEC_BSD_RING1 (1<<13)
 #define LOCAL_I915_EXEC_BSD_RING2 (2<<13)
 #define LOCAL_I915_EXEC_RESOURCE_STREAMER (1<<15)
+#define LOCAL_I915_EXEC_FENCE_IN (1 << 16)
+#define LOCAL_I915_EXEC_FENCE_OUT (1 << 17)
 
 static bool has_ring(int fd, unsigned ring_exec_flags)
 {
@@ -239,13 +241,15 @@  igt_main
 				    &execbuf) == 0);
 	}
 
-	/* HANDLE_LUT and NO_RELOC are already exercised by gem_exec_lut_handle */
+	/* HANDLE_LUT and NO_RELOC are already exercised by gem_exec_lut_handle,
+	 * EXEC_FENCE_IN and EXEC_FENCE_OUT correct usage is tested by
+	 * gem_exec_fence, invalid usage of EXEC_FENCE_IN is tested below. */
 
 	igt_subtest("invalid-flag") {
 		/* NOTE: This test intentionally exercise the next available
 		 * flag. Don't "fix" this testcase without adding the required
 		 * tests for the new flag first. */
-		execbuf.flags = I915_EXEC_RENDER | (LOCAL_I915_EXEC_RESOURCE_STREAMER << 1);
+		execbuf.flags = I915_EXEC_RENDER | (LOCAL_I915_EXEC_FENCE_OUT << 1);
 		RUN_FAIL(EINVAL);
 	}
 
@@ -283,6 +287,30 @@  igt_main
 		RUN_FAIL(EINVAL);
 	}
 
+	igt_subtest("invalid-fence-in") {
+		igt_require(gem_has_exec_fence(fd));
+		execbuf.flags = LOCAL_I915_EXEC_FENCE_IN;
+		execbuf.rsvd2 = -1;
+		RUN_FAIL(EINVAL);
+		execbuf.rsvd2 = 0;
+	}
+
+	igt_subtest("invalid-fence-in2") {
+		igt_require(gem_has_exec_fence(fd));
+		execbuf.flags = LOCAL_I915_EXEC_FENCE_IN;
+		execbuf.rsvd2 = fd;
+		RUN_FAIL(EINVAL);
+		execbuf.rsvd2 = 0;
+	}
+
+	igt_subtest("rsvd2-dirt") {
+		igt_require(!gem_has_exec_fence(fd));
+		execbuf.flags = 0;
+		execbuf.rsvd2 = 1;
+		RUN_FAIL(EINVAL);
+		execbuf.rsvd2 = 0;
+	}
+
 #define DIRT(name) \
 	igt_subtest(#name "-dirt") { \
 		execbuf.flags = 0; \
@@ -291,7 +319,6 @@  igt_main
 		execbuf.name = 0; \
 	}
 
-	DIRT(rsvd2);
 	DIRT(cliprects_ptr);
 	DIRT(DR1);
 	DIRT(DR4);