<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, Dec 15, 2017 at 5:42 AM, Chris Wilson <span dir="ltr"><<a href="mailto:chris@chris-wilson.co.uk" target="_blank">chris@chris-wilson.co.uk</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Every client (everyone instance that opens /dev/dri/card0 or the render<br>
nodes), receives a unique per-process GTT (where supported by the<br>
hardware, unfortunately that means only Broadwell and later). Every<br>
context created by each client, in turns receives its own unique ppGTT.<br>
This is overkill in terms of allocations and tracking, both in the<br>
kernel and in the hardware, as we could be sharing the per-client GTT<br>
amongst all of its contexts. The downside is that context segregation is<br>
reduced, a stray write from one context may affect another, and so we<br>
must honour any client requests that require robust segregation (e.g.<br>
ARB_robustness).<br>
<br>
Signed-off-by: Chris Wilson <<a href="mailto:chris@chris-wilson.co.uk">chris@chris-wilson.co.uk</a>><br>
---<br>
 src/mesa/drivers/dri/i965/brw_<wbr>bufmgr.c  | 23 +++++++++++++++++------<br>
 src/mesa/drivers/dri/i965/brw_<wbr>bufmgr.h  |  2 +-<br>
 src/mesa/drivers/dri/i965/brw_<wbr>context.c |  2 +-<br>
 3 files changed, 19 insertions(+), 8 deletions(-)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/<wbr>brw_bufmgr.c b/src/mesa/drivers/dri/i965/<wbr>brw_bufmgr.c<br>
index 52b5bf97a1..d8a9635f5d 100644<br>
--- a/src/mesa/drivers/dri/i965/<wbr>brw_bufmgr.c<br>
+++ b/src/mesa/drivers/dri/i965/<wbr>brw_bufmgr.c<br>
@@ -1297,13 +1297,24 @@ init_cache_buckets(struct brw_bufmgr *bufmgr)<br>
 }<br>
<br>
 uint32_t<br>
-brw_create_hw_context(struct brw_bufmgr *bufmgr)<br>
+brw_create_hw_context(struct brw_bufmgr *bufmgr, unsigned int flags)<br>
 {<br>
-   struct drm_i915_gem_context_create create = { };<br>
-   int ret = drmIoctl(bufmgr->fd, DRM_IOCTL_I915_GEM_CONTEXT_<wbr>CREATE, &create);<br>
-   if (ret != 0) {<br>
-      DBG("DRM_IOCTL_I915_GEM_<wbr>CONTEXT_CREATE failed: %s\n", strerror(errno));<br>
-      return 0;<br>
+   struct local_i915_gem_context_create_<wbr>v2 {<br>
+      uint32_t ctx_id; /* out */<br>
+      uint32_t flags;<br>
+#define I915_GEM_CONTEXT_SHARE_GTT 0x1<br>
+      uint32_t share_ctx;<br></blockquote><div><br></div><div>So, we've left share_ctx as 0.  What does that mean?  Does that mean that we share with some context that was implicitly created by opening /dev/dri/card0?  Does it mean we share with the default context and therefore other processes?  If some other component (say, vaapi) opens /dev/dri/card0 but from the same process, are we now sharing with it?</div><div><br></div><div>I mean, as far as the kernel UABI bits go, it seems perfectly reasonable.  There are just a lot of crazy implications here and I'd like to understand the subtle details better.<br></div><div><br></div><div>--Jason<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+      uint32_t pad;<br>
+   } create =  { };<br>
+#define LOCAL_IOCTL_I915_GEM_CONTEXT_<wbr>CREATE      DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_CONTEXT_CREATE, struct local_i915_gem_context_create_<wbr>v2)<br>
+<br>
+   if (!(flags & __DRI_CTX_FLAG_ROBUST_BUFFER_<wbr>ACCESS))<br>
+      create.flags |= I915_GEM_CONTEXT_SHARE_GTT;<br>
+<br>
+   if (drmIoctl(bufmgr->fd, LOCAL_IOCTL_I915_GEM_CONTEXT_<wbr>CREATE, &create)) {<br>
+      create.flags = 0;<br>
+      if (drmIoctl(bufmgr->fd, LOCAL_IOCTL_I915_GEM_CONTEXT_<wbr>CREATE, &create))<br>
+         return 0;<br>
    }<br>
<br>
    return create.ctx_id;<br>
diff --git a/src/mesa/drivers/dri/i965/<wbr>brw_bufmgr.h b/src/mesa/drivers/dri/i965/<wbr>brw_bufmgr.h<br>
index 0ae541cda0..f5191aff76 100644<br>
--- a/src/mesa/drivers/dri/i965/<wbr>brw_bufmgr.h<br>
+++ b/src/mesa/drivers/dri/i965/<wbr>brw_bufmgr.h<br>
@@ -321,7 +321,7 @@ void brw_bufmgr_enable_reuse(struct brw_bufmgr *bufmgr);<br>
<br>
 int brw_bo_wait(struct brw_bo *bo, int64_t timeout_ns);<br>
<br>
-uint32_t brw_create_hw_context(struct brw_bufmgr *bufmgr);<br>
+uint32_t brw_create_hw_context(struct brw_bufmgr *bufmgr, unsigned int flags);<br>
<br>
 #define BRW_CONTEXT_LOW_PRIORITY ((I915_CONTEXT_MIN_USER_<wbr>PRIORITY-1)/2)<br>
 #define BRW_CONTEXT_MEDIUM_PRIORITY (I915_CONTEXT_DEFAULT_<wbr>PRIORITY)<br>
diff --git a/src/mesa/drivers/dri/i965/<wbr>brw_context.c b/src/mesa/drivers/dri/i965/<wbr>brw_context.c<br>
index 9e0f875b27..e374236b6b 100644<br>
--- a/src/mesa/drivers/dri/i965/<wbr>brw_context.c<br>
+++ b/src/mesa/drivers/dri/i965/<wbr>brw_context.c<br>
@@ -986,7 +986,7 @@ brwCreateContext(gl_api api,<br>
     * This is required for transform feedback buffer offsets, query objects,<br>
     * and also allows us to reduce how much state we have to emit.<br>
     */<br>
-   brw->hw_ctx = brw_create_hw_context(brw-><wbr>bufmgr);<br>
+   brw->hw_ctx = brw_create_hw_context(brw-><wbr>bufmgr, ctx_config->flags);<br>
    if (!brw->hw_ctx && devinfo->gen >= 6) {<br>
       fprintf(stderr, "Failed to create hardware context.\n");<br>
       intelDestroyContext(<wbr>driContextPriv);<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.15.1<br>
<br>
______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div></div>