<div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Tue, 24 Apr 2018 at 09:17 Mario Kleiner <<a href="mailto:mario.kleiner.de@gmail.com">mario.kleiner.de@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Both xf86-video-intel and xf86-video-nouveau cause OpenGL<br>
clients to fail when used with DRI3 on server 1.20 with Mesa 18.1.<br>
<br>
Reason is that the servers DRI3 version is now unconditionally<br>
reported as DRI3 1.2 to 1.2 capable clients. This causes clients<br>
using Mesa 18.1 to use the new DRI 3.2 requests DRI3GetSupportedModifiers,<br>
DRI3PixmapFromBuffers, etc. Drivers other than modesetting-ddx<br>
do not support the needed hooks like info->pixmap_from_fds or<br>
info->get_formats, info->get_modifiers. Unfortunately we can't<br>
simply report the servers DRI3 version as 1.0 in this case, as<br>
the reported version can not be specific to a X-Screen, and<br>
different screens may have drivers with different capabilities.<br>
<br>
Luckily the server has fallbacks to ->pixmap_from_fd, ->fd_from_pixmap,<br>
and simply reporting an empty set of supported modifiers for the<br>
DRI3GetSupportedModifiers request if the ddx doesn't support<br>
DRI 3.2.<br>
<br>
Clients like Mesa 18.1's dri3 loader respond to the empty set<br>
of reported modifiers by falling back to a dri driver selected<br>
buffer format (image->createImageWithModifiers responds to a<br>
NULL modifier_list by acting like ->createImage()). This works,<br>
but Mesa 18.1 will still try to use the DRI3PixmapFromBuffers<br>
request to create the corresponding pixmap, just passing in<br>
a modifier that corresponds to whatever tiling the dri driver<br>
selected by default. To prevent this request - and thereby<br>
the client - from failing with a BadImplementation error,<br>
remove the check for modifier == DRM_MOD_FORMAT_INVALID in<br>
the pixmap_from_fd fallback path of dri3_pixmap_from_fds()<br>
and trust that if we hit the fallback path then the client<br>
will have passed a buffer with some driver specific default<br>
tiling that can be handled by pixmap_from_fd.<br>
<br>
Another approach would be for Mesa's dri3 loader to keep<br>
track how a buffer was created (with explicit modifiers or<br>
not), and then call DRI3PixmapFromBuffers or DRI3PixmapFromBuffer,<br>
but then any future DRI3 client implementation would need to be<br>
fixed, so the server side is probably the better place for this.<br>
<br>
Tested on Intel Ivybridge and NVidia Pascal.<br>
<br>
Fixes: 6e7c40f62db6 ("dri3: Add multi-planar/modifier buffer requests")<br>
Signed-off-by: Mario Kleiner <<a href="mailto:mario.kleiner.de@gmail.com" target="_blank">mario.kleiner.de@gmail.com</a>><br>
Cc: Daniel Stone <<a href="mailto:daniels@collabora.com" target="_blank">daniels@collabora.com</a>><br>
Cc: Louis-Francis Ratté-Boulianne <<a href="mailto:lfrb@collabora.com" target="_blank">lfrb@collabora.com</a>><br>
---<br>
 dri3/dri3_screen.c | 3 +--<br>
 1 file changed, 1 insertion(+), 2 deletions(-)<br>
<br>
diff --git a/dri3/dri3_screen.c b/dri3/dri3_screen.c<br>
index 23e33f4..243dab7 100644<br>
--- a/dri3/dri3_screen.c<br>
+++ b/dri3/dri3_screen.c<br>
@@ -66,8 +66,7 @@ dri3_pixmap_from_fds(PixmapPtr *ppixmap, ScreenPtr screen,<br>
     if (info->version >= 2 && info->pixmap_from_fds != NULL) {<br>
         pixmap = (*info->pixmap_from_fds) (screen, num_fds, fds, width, height,<br>
                                            strides, offsets, depth, bpp, modifier);<br>
-    } else if (info->pixmap_from_fd != NULL && num_fds == 1 &&<br>
-               modifier == DRM_FORMAT_MOD_INVALID) {<br>
+    } else if (info->pixmap_from_fd != NULL && num_fds == 1) {<br>
         pixmap = (*info->pixmap_from_fd) (screen, fds[0], width, height,<br>
                                           strides[0], depth, bpp);<br>
     } else {<br>
-- <br>
2.7.4<br>
<br>
_______________________________________________<br>
<a href="mailto:xorg-devel@lists.x.org" target="_blank">xorg-devel@lists.x.org</a>: X.Org development<br>
Archives: <a href="http://lists.x.org/archives/xorg-devel" rel="noreferrer" target="_blank">http://lists.x.org/archives/xorg-devel</a><br>
Info: <a href="https://lists.x.org/mailman/listinfo/xorg-devel" rel="noreferrer" target="_blank">https://lists.x.org/mailman/listinfo/xorg-devel</a></blockquote><div><br></div><div>Hi Mario</div><div><br></div><div>Thanks for fixing this, that's xserver 1.20 working with the Intel and AMDGPU DDXs on my laptop with Kwin</div><div><br></div><div>The plasmashell & steam freezes aren't present with the Intel or AMDGPU DDXs, only modesetting</div><div><br></div><div>I'm quite happy to mark <a href="https://bugs.freedesktop.org/show_bug.cgi?id=105851">https://bugs.freedesktop.org/show_bug.cgi?id=105851</a> as resolved and look into the modesetting freezes seperately</div><div><br></div><div>Feel free to add my:</div><div><br></div><div>Tested-by: Mike Lothian <<a href="mailto:mike@fireburn.co.uk">mike@fireburn.co.uk</a>></div><div><br></div><div>Cheers again</div><div><br></div><div>Mike </div></div></div>