[Mesa-dev] [PATCH v1] loader/dri3: wait for fences if back-buffer available

Michel Dänzer michel at daenzer.net
Mon Oct 1 14:24:05 UTC 2018


On 2018-10-01 12:37 p.m., Sergii Romantsov wrote:
> Kabylake doesn't have such issue, but also it doesn't have
> a front buffers in that case.
> Coffelake can be fixed if to wait for fences if it has back-buffer.
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=108097
> Fixes: aefac10fecc9 (loader/dri3: Only wait for back buffer fences in dri3_get_buffer)
> CC: Michel Dänzer <michel.daenzer at amd.com>
> Signed-off-by: Sergii Romantsov <sergii.romantsov at globallogic.com>
> ---
>  src/loader/loader_dri3_helper.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c
> index 258678a..e9f59a2 100644
> --- a/src/loader/loader_dri3_helper.c
> +++ b/src/loader/loader_dri3_helper.c
> @@ -1819,7 +1819,7 @@ dri3_get_buffer(__DRIdrawable *driDrawable,
>        draw->buffers[buf_id] = buffer;
>     }
>  
> -   if (buffer_type == loader_dri3_buffer_back)
> +   if (buffer_type == loader_dri3_buffer_back || draw->have_back)
>        dri3_fence_await(draw->conn, draw, buffer);
>  
>     /*
> 

Thanks for the patch, but unfortunately, this re-introduces
https://bugs.freedesktop.org/106404 .  Also, conceptually it's not clear
why the presence of a back buffer would affect waiting for the fake
front buffer's fence.


Unfortunately, I'm unable to reproduce the problem with radeonsi. Does
the patch below help by any chance?


diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c
index f641a34e6d1..1981b5f0515 100644
--- a/src/loader/loader_dri3_helper.c
+++ b/src/loader/loader_dri3_helper.c
@@ -1736,6 +1736,7 @@ dri3_get_buffer(__DRIdrawable *driDrawable,
                 struct loader_dri3_drawable *draw)
 {
    struct loader_dri3_buffer *buffer;
+   bool fence_await = buffer_type == loader_dri3_buffer_back;
    int buf_id;

    if (buffer_type == loader_dri3_buffer_back) {
@@ -1791,6 +1792,7 @@ dri3_get_buffer(__DRIdrawable *driDrawable,
                            0, 0, 0, 0,
                            draw->width, draw->height);
             dri3_fence_trigger(draw->conn, new_buffer);
+            fence_await = true;
          }
          dri3_free_render_buffer(draw, buffer);
       } else if (buffer_type == loader_dri3_buffer_front) {
@@ -1812,13 +1814,14 @@ dri3_get_buffer(__DRIdrawable *driDrawable,
                                           new_buffer->linear_buffer,
                                           0, 0, draw->width, draw->height,
                                           0, 0, 0);
-         }
+         } else
+            fence_await = true;
       }
       buffer = new_buffer;
       draw->buffers[buf_id] = buffer;
    }

-   if (buffer_type == loader_dri3_buffer_back)
+   if (fence_await)
       dri3_fence_await(draw->conn, draw, buffer);

    /*


-- 
Earthling Michel Dänzer               |               http://www.amd.com
Libre software enthusiast             |             Mesa and X developer


More information about the mesa-dev mailing list