[Intel-gfx] [PATCH 18/38] drm/i915: Extend CONTEXT_CREATE to set parameters upon construction
Chris Wilson
chris at chris-wilson.co.uk
Fri Mar 1 19:10:46 UTC 2019
Quoting Tvrtko Ursulin (2019-03-01 16:36:45)
>
> On 01/03/2019 14:03, Chris Wilson wrote:
> > It can be useful to have a single ioctl to create a context with all
> > the initial parameters instead of a series of create + setparam + setparam
> > ioctls. This extension to create context allows any of the parameters
> > to be passed in as a linked list to be applied to the newly constructed
> > context.
> >
> > v2: Make a local copy of user setparam (Tvrtko)
> > v3: Use flags to detect availability of extension interface
>
> Looks good to me.
>
> Why have you changed to use flags and not just check the extension field
> being non-null?
Hmm. I was thinking about how new userspace would use it on an old kernel.
As the extension is in a new bit of the extension struct that won't be
passed to the old ioctl, and so it would create a context and not report
any error despite not processing the extensions (userspace would be none
the wiser that the context was invalid). So a simple answer was to use
the flags field to indicate that we want the extension processed; the
old kernel would reject the ioctl due to pad!=0, a new kernel will be
happy. New userspace on old kernel can then fallback gracefully.
+uint32_t
+brw_clone_hw_context(struct brw_bufmgr *bufmgr, uint32_t ctx_id)
+{
+ struct drm_i915_gem_context_create_ext_clone ext_clone = {
+ .base = { I915_CONTEXT_CREATE_EXT_CLONE },
+ .clone = ctx_id,
+ .flags = ~I915_CONTEXT_CLONE_UNKNOWN,
+ };
+ struct drm_i915_gem_context_create_ext arg = {
+ .flags = I915_CONTEXT_CREATE_USE_EXTENSIONS,
+ .extensions = (uintptr_t)&ext_clone
+ };
+ if (drmIoctl(bufmgr->fd, DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, &arg) == 0)
+ return arg.ctx_id;
+
+ return __brw_clone_hw_context(bufmgr, ctx_id);
+}
-Chris
More information about the Intel-gfx
mailing list