Module: Mesa
Branch: main
Commit: 1c3db3e39a7c14a863358f476069849523cc6fe5
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=1c3db3e39a7c14a863358f476069849523cc6fe5

Author: Mike Blumenkrantz <[email protected]>
Date:   Tue Sep 19 13:00:03 2023 -0400

zink: blow up broken xservers more reliably

only certain drivers can successfully run an xserver with implicit modifier
handling, and the rest will have broken rendering

until such time that a vk extension emerges to handle this more widely,
break this interop for drivers where it's already broken

fixes #9819

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25299>

---

 src/gallium/drivers/zink/zink_resource.c | 7 ++++++-
 src/gallium/drivers/zink/zink_screen.c   | 9 +++++++++
 src/gallium/drivers/zink/zink_types.h    | 1 +
 3 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/zink/zink_resource.c 
b/src/gallium/drivers/zink/zink_resource.c
index c7f33c8b172..fd1ed0ced79 100644
--- a/src/gallium/drivers/zink/zink_resource.c
+++ b/src/gallium/drivers/zink/zink_resource.c
@@ -1851,8 +1851,13 @@ zink_resource_from_handle(struct pipe_screen *pscreen,
    int modifier_count = 1;
    if (whandle->modifier != DRM_FORMAT_MOD_INVALID)
       modifier = whandle->modifier;
-   else
+   else {
+      if 
(!zink_screen(pscreen)->driver_workarounds.can_do_invalid_linear_modifier) {
+         mesa_loge("zink: display server doesn't support DRI3 modifiers and 
driver can't handle INVALID<->LINEAR!");
+         return NULL;
+      }
       whandle->modifier = modifier;
+   }
    templ2.bind |= ZINK_BIND_DMABUF;
    struct pipe_resource *pres = resource_create(pscreen, &templ2, whandle, 
usage, &modifier, modifier_count, NULL, NULL);
    if (pres) {
diff --git a/src/gallium/drivers/zink/zink_screen.c 
b/src/gallium/drivers/zink/zink_screen.c
index 26397fce4a4..74b575ed658 100644
--- a/src/gallium/drivers/zink/zink_screen.c
+++ b/src/gallium/drivers/zink/zink_screen.c
@@ -2872,6 +2872,15 @@ init_driver_workarounds(struct zink_screen *screen)
       break;
    }
 
+   /* these drivers can successfully do INVALID <-> LINEAR dri3 modifier swap 
*/
+   switch (screen->info.driver_props.driverID) {
+   case VK_DRIVER_ID_MESA_TURNIP:
+      screen->driver_workarounds.can_do_invalid_linear_modifier = true;
+      break;
+   default:
+      break;
+   }
+
    /* these drivers have no difference between unoptimized and optimized 
shader compilation */
    switch (screen->info.driver_props.driverID) {
    case VK_DRIVER_ID_MESA_LLVMPIPE:
diff --git a/src/gallium/drivers/zink/zink_types.h 
b/src/gallium/drivers/zink/zink_types.h
index 455be335c1c..05d3633869e 100644
--- a/src/gallium/drivers/zink/zink_types.h
+++ b/src/gallium/drivers/zink/zink_types.h
@@ -1537,6 +1537,7 @@ struct zink_screen {
       bool no_hw_gl_point;
       bool lower_robustImageAccess2;
       bool needs_zs_shader_swizzle;
+      bool can_do_invalid_linear_modifier;
       unsigned z16_unscaled_bias;
       unsigned z24_unscaled_bias;
    } driver_workarounds;

Reply via email to