<div dir="ltr">Hi,<br><br>I'm sending the v2 re-spin of patch as per i965, rechecked twice line-by-line with Tomasz's one.<div><br>Building ok, marshmallow-x86 booting ok and here are the results of Android CTS egl and gles2 x86 target tests<br><br>Android CTS 6.0_r7 build:2906653<br>07-16 00:52:42 I/DeviceManager: Detected new device <a href="http://192.168.1.7:5555">192.168.1.7:5555</a><br>cts-tf > list r<br>Session     Pass       Fail     Not Executed  Start time           Plan name  Device serial(s)  <br>0(EGL)      1410       24       0             2016.07.16_00.21.30  NA         unknown           <br>1(GLES2)  13832     82       0             2016.07.16_00.24.23  NA         unknown           <br>cts-tf > <br><br>I get the same results as per i965GM<br><br>Mauro<br><div><br></div><div><br></div><div><div>From d35c093d48facae4ad0d7119a8b6fdc898a6a1e8 Mon Sep 17 00:00:00 2001</div><div>From: Mauro Rossi <<a href="mailto:issor.oruam@gmail.com">issor.oruam@gmail.com</a>></div><div>Date: Fri, 15 Jul 2016 21:46:09 +0200</div><div>Subject: [PATCH] i915: store reference to the context within struct</div><div> intel_fence (v2)</div><div><br></div><div>Porting of the corresponding patch for i965.</div><div><br></div><div>Here follows the original commit message by Tomasz Figa:</div><div><br></div><div>"As the spec allows for {server,client}_wait_sync to be called without</div><div>currently bound context, while our implementation requires context</div><div>pointer.</div><div><br></div><div>v2: Add a mutex and acquire it for the duration of</div><div>    brw_fence_client_wait() and brw_fence_is_completed() as suggested</div><div>    by Chad."</div><div><br></div><div>NOTE: in i915 all references to 'brw' are replaced by 'intel'</div><div>---</div><div> src/mesa/drivers/dri/i915/intel_syncobj.c | 55 ++++++++++++++++++++++++-------</div><div> 1 file changed, 44 insertions(+), 11 deletions(-)</div><div><br></div><div>diff --git a/src/mesa/drivers/dri/i915/intel_syncobj.c b/src/mesa/drivers/dri/i915/intel_syncobj.c</div><div>index 18d1546..5d37204a 100644</div><div>--- a/src/mesa/drivers/dri/i915/intel_syncobj.c</div><div>+++ b/src/mesa/drivers/dri/i915/intel_syncobj.c</div><div>@@ -46,9 +46,11 @@</div><div> #include "intel_reg.h"</div><div> </div><div> struct intel_fence {</div><div>+   struct intel_context *intel;</div><div>    /** The fence waits for completion of this batch. */</div><div>    drm_intel_bo *batch_bo;</div><div> </div><div>+   mtx_t mutex;</div><div>    bool signalled;</div><div> };</div><div> </div><div>@@ -77,7 +79,7 @@ intel_fence_insert(struct intel_context *intel, struct intel_fence *fence)</div><div> }</div><div> </div><div> static bool</div><div>-intel_fence_has_completed(struct intel_fence *fence)</div><div>+intel_fence_has_completed_locked(struct intel_fence *fence)</div><div> {</div><div>    if (fence->signalled)</div><div>       return true;</div><div>@@ -92,13 +94,21 @@ intel_fence_has_completed(struct intel_fence *fence)</div><div>    return false;</div><div> }</div><div> </div><div>-/**</div><div>- * Return true if the function successfully signals or has already signalled.</div><div>- * (This matches the behavior expected from __DRI2fence::client_wait_sync).</div><div>- */</div><div> static bool</div><div>-intel_fence_client_wait(struct intel_context *intel, struct intel_fence *fence,</div><div>-                      uint64_t timeout)</div><div>+intel_fence_has_completed(struct intel_fence *fence)</div><div>+{</div><div>+   bool ret;</div><div>+</div><div>+   mtx_lock(&fence->mutex);</div><div>+   ret = intel_fence_has_completed_locked(fence);</div><div>+   mtx_unlock(&fence->mutex);</div><div>+</div><div>+   return ret;</div><div>+}</div><div>+</div><div>+static bool</div><div>+intel_fence_client_wait_locked(struct intel_context *intel, struct intel_fence *fence,</div><div>+                             uint64_t timeout)</div><div> {</div><div>    if (fence->signalled)</div><div>       return true;</div><div>@@ -123,6 +133,23 @@ intel_fence_client_wait(struct intel_context *intel, struct intel_fence *fence,</div><div>    return true;</div><div> }</div><div> </div><div>+/**</div><div>+ * Return true if the function successfully signals or has already signalled.</div><div>+ * (This matches the behavior expected from __DRI2fence::client_wait_sync).</div><div>+ */</div><div>+static bool</div><div>+intel_fence_client_wait(struct intel_context *intel, struct intel_fence *fence,</div><div>+                      uint64_t timeout)</div><div>+{</div><div>+   bool ret;</div><div>+</div><div>+   mtx_lock(&fence->mutex);</div><div>+   ret = intel_fence_client_wait_locked(intel, fence, timeout);</div><div>+   mtx_unlock(&fence->mutex);</div><div>+</div><div>+   return ret;</div><div>+}</div><div>+</div><div> static void</div><div> intel_fence_server_wait(struct intel_context *intel, struct intel_fence *fence)</div><div> {</div><div>@@ -215,6 +242,8 @@ intel_dri_create_fence(__DRIcontext *ctx)</div><div>    if (!fence)</div><div>       return NULL;</div><div> </div><div>+   mtx_init(&fence->mutex, mtx_plain);</div><div>+   fence->intel = intel;</div><div>    intel_fence_insert(intel, fence);</div><div> </div><div>    return fence;</div><div>@@ -233,19 +262,23 @@ static GLboolean</div><div> intel_dri_client_wait_sync(__DRIcontext *ctx, void *driver_fence, unsigned flags,</div><div>                            uint64_t timeout)</div><div> {</div><div>-   struct intel_context *intel = ctx->driverPrivate;</div><div>    struct intel_fence *fence = driver_fence;</div><div> </div><div>-   return intel_fence_client_wait(intel, fence, timeout);</div><div>+   return intel_fence_client_wait(fence->intel, fence, timeout);</div><div> }</div><div> </div><div> static void</div><div> intel_dri_server_wait_sync(__DRIcontext *ctx, void *driver_fence, unsigned flags)</div><div> {</div><div>-   struct intel_context *intel = ctx->driverPrivate;</div><div>    struct intel_fence *fence = driver_fence;</div><div> </div><div>-   intel_fence_server_wait(intel, fence);</div><div>+   /* We might be called here with a NULL fence as a result of WaitSyncKHR</div><div>+    * on a EGL_KHR_reusable_sync fence. Nothing to do here in such case.</div><div>+    */</div><div>+   if (!fence)</div><div>+      return;</div><div>+</div><div>+   intel_fence_server_wait(fence->intel, fence);</div><div> }</div><div> </div><div> const __DRI2fenceExtension intelFenceExtension = {</div><div>-- </div><div>2.7.4</div></div><div><br></div><div><br></div><div><br></div></div></div>