summaryrefslogtreecommitdiff
path: root/lib/i915/gem_context.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/i915/gem_context.c')
-rw-r--r--lib/i915/gem_context.c60
1 files changed, 50 insertions, 10 deletions
diff --git a/lib/i915/gem_context.c b/lib/i915/gem_context.c
index 8f383a97..669bd318 100644
--- a/lib/i915/gem_context.c
+++ b/lib/i915/gem_context.c
@@ -44,6 +44,52 @@
*/
/**
+ * gem_has_contexts:
+ * @fd: open i915 drm file descriptor
+ *
+ * Queries whether context creation is supported or not.
+ *
+ * Returns: Context creation availability.
+ */
+bool gem_has_contexts(int fd)
+{
+ uint32_t ctx_id = 0;
+
+ __gem_context_create(fd, &ctx_id);
+ if (ctx_id)
+ gem_context_destroy(fd, ctx_id);
+
+ return ctx_id;
+}
+
+/**
+ * gem_require_contexts:
+ * @fd: open i915 drm file descriptor
+ *
+ * This helper will automatically skip the test on platforms where context
+ * support is not available.
+ */
+void gem_require_contexts(int fd)
+{
+ igt_require(gem_has_contexts(fd));
+}
+
+int __gem_context_create(int fd, uint32_t *ctx_id)
+{
+ struct drm_i915_gem_context_create create;
+ int err = 0;
+
+ memset(&create, 0, sizeof(create));
+ if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_CONTEXT_CREATE, &create) == 0)
+ *ctx_id = create.ctx_id;
+ else
+ err = -errno;
+
+ errno = 0;
+ return err;
+}
+
+/**
* gem_context_create:
* @fd: open i915 drm file descriptor
*
@@ -55,18 +101,12 @@
*/
uint32_t gem_context_create(int fd)
{
- struct drm_i915_gem_context_create create;
+ uint32_t ctx_id;
- memset(&create, 0, sizeof(create));
- if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_CONTEXT_CREATE, &create)) {
- int err = -errno;
- igt_skip_on(err == -ENODEV || errno == -EINVAL);
- igt_assert_eq(err, 0);
- }
- igt_assert(create.ctx_id != 0);
- errno = 0;
+ igt_assert_eq(__gem_context_create(fd, &ctx_id), 0);
+ igt_assert(ctx_id != 0);
- return create.ctx_id;
+ return ctx_id;
}
int __gem_context_destroy(int fd, uint32_t ctx_id)