On 4 June 2012 14:43, Ben Widawsky <span dir="ltr">&lt;<a href="mailto:ben@bwidawsk.net" target="_blank">ben@bwidawsk.net</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Based off of a patch from Ken Graunke. I just modified it for a more<br>
modern mesa (also don&#39;t allow contexts on blit ring).<br>
<br>
Signed-off-by: Ben Widawsky &lt;<a href="mailto:ben@bwidawsk.net">ben@bwidawsk.net</a>&gt;<br>
---<br>
 src/mesa/drivers/dri/i965/brw_context.c        |    1 +<br>
 src/mesa/drivers/dri/i965/brw_vtbl.c           |    5 ++++-<br>
 src/mesa/drivers/dri/intel/intel_batchbuffer.c |    9 +++++++--<br>
 src/mesa/drivers/dri/intel/intel_context.c     |    2 ++<br>
 src/mesa/drivers/dri/intel/intel_context.h     |    2 +-<br>
 5 files changed, 15 insertions(+), 4 deletions(-)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c<br>
index f7073cd..d4159c7 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_context.c<br>
+++ b/src/mesa/drivers/dri/i965/brw_context.c<br>
@@ -298,6 +298,7 @@ brwCreateContext(int api,<br>
<br>
    brw-&gt;prim_restart.in_progress = false;<br>
    brw-&gt;prim_restart.enable_cut_index = false;<br>
+   intel-&gt;hw_ctx = drm_intel_gem_context_create(intel-&gt;bufmgr);<br>
<br>
    brw_init_state( brw );<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/brw_vtbl.c b/src/mesa/drivers/dri/i965/brw_vtbl.c<br>
index 5699749..d9fd2cb 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_vtbl.c<br>
+++ b/src/mesa/drivers/dri/i965/brw_vtbl.c<br>
@@ -170,7 +170,10 @@ static void brw_new_batch( struct intel_context *intel )<br>
     * This is probably not as severe as on 915, since almost all of our state<br>
     * is just in referenced buffers.<br>
     */<br>
-   brw-&gt;state.dirty.brw |= BRW_NEW_CONTEXT | BRW_NEW_BATCH;<br>
+   if (intel-&gt;hw_ctx == NULL)<br>
+      brw-&gt;state.dirty.brw |= BRW_NEW_CONTEXT;<br>
+<br>
+   brw-&gt;state.dirty.brw |= BRW_NEW_BATCH;<br></blockquote><div><br>The comment above this change (&quot;Mark all context state as needing to be re-emitted.&quot;) is no longer accurate.  Perhaps change it to something like this?<br>
<br>&quot;If the kernel supports hardware contexts, then most hardware state is preserved between batches; we only need to re-emit state that is required to be in every batch.  Otherwise we need to re-emit all the state that would otherwise be stored in the context (which for all intents and purposes means everything).&quot;<br>
<br>Also, I think it would be ok to delete the comment &quot;This is probably not as severe as on 915 ... referenced buffers&quot;--that comment is mostly just a rationalization for not having implemented hardware context support earlier, and not a very convincing one at that :)<br>
 </div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
    /* Assume that the last command before the start of our batch was a<br>
     * primitive, for safety.<br>
diff --git a/src/mesa/drivers/dri/intel/intel_batchbuffer.c b/src/mesa/drivers/dri/intel/intel_batchbuffer.c<br>
index 76a69f7..7ba141d 100644<br>
--- a/src/mesa/drivers/dri/intel/intel_batchbuffer.c<br>
+++ b/src/mesa/drivers/dri/intel/intel_batchbuffer.c<br>
@@ -188,8 +188,13 @@ do_flush_locked(struct intel_context *intel)<br>
       if (ret == 0) {<br>
          if (unlikely(INTEL_DEBUG &amp; DEBUG_AUB) &amp;&amp; intel-&gt;vtbl.annotate_aub)<br>
             intel-&gt;vtbl.annotate_aub(intel);<br>
-        ret = drm_intel_bo_mrb_exec(batch-&gt;bo, 4*batch-&gt;used, NULL, 0, 0,<br>
-                                    flags);<br>
+        if (intel-&gt;hw_ctx == NULL || batch-&gt;is_blit) {<br>
+           ret = drm_intel_bo_mrb_exec(batch-&gt;bo, 4*batch-&gt;used, NULL, 0, 0,<br>
+                                       flags);<br>
+        } else {<br>
+           ret = drm_intel_gem_bo_context_exec(batch-&gt;bo, intel-&gt;hw_ctx,<br>
+                                           4 * batch-&gt;used, flags);<br>
+        }<br>
       }<br>
    }<br>
<br>
diff --git a/src/mesa/drivers/dri/intel/intel_context.c b/src/mesa/drivers/dri/intel/intel_context.c<br>
index 9deb4ca..46c2492 100644<br>
--- a/src/mesa/drivers/dri/intel/intel_context.c<br>
+++ b/src/mesa/drivers/dri/intel/intel_context.c<br>
@@ -593,6 +593,8 @@ intelInitContext(struct intel_context *intel,<br>
    if (intelScreen-&gt;bufmgr == NULL)<br>
       return false;<br>
<br>
+   intel-&gt;hw_ctx = NULL;<br>
+<br>
    /* Can&#39;t rely on invalidate events, fall back to glViewport hack */<br>
    if (!driContextPriv-&gt;driScreenPriv-&gt;dri2.useInvalidate) {<br>
       intel-&gt;saved_viewport = functions-&gt;Viewport;<br>
diff --git a/src/mesa/drivers/dri/intel/intel_context.h b/src/mesa/drivers/dri/intel/intel_context.h<br>
index cc3ee0d..c026fea 100644<br>
--- a/src/mesa/drivers/dri/intel/intel_context.h<br>
+++ b/src/mesa/drivers/dri/intel/intel_context.h<br>
@@ -226,7 +226,7 @@ struct intel_context<br>
    int urb_size;<br>
<br>
    struct intel_batchbuffer batch;<br>
-<br>
+   drm_intel_context *hw_ctx;<br>
    drm_intel_bo *first_post_swapbuffers_batch;<br>
    bool need_throttle;<br>
    bool no_batch_wrap;<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.7.10.2<br>
<br>
_______________________________________________<br>
Intel-gfx mailing list<br>
<a href="mailto:Intel-gfx@lists.freedesktop.org">Intel-gfx@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/intel-gfx" target="_blank">http://lists.freedesktop.org/mailman/listinfo/intel-gfx</a><br>
</font></span></blockquote></div><br>I&#39;m kind of surprised to see a call to drm_intel_gem_context_create(), but no call anywhere to a clean-up function that destroys the context.  Was that an oversight, or is there a reason why it&#39;s unnecessary?  If it&#39;s the latter, a comment in brw_destroy_context() would be helpful.<br>