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;
