From 206d2f31274cf2749870f4942e81d4e31c51089b Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 22 Mar 2022 18:05:35 -0400 Subject: [PATCH] zink: add driver workaround for broken EXT_depth_clip_control for #6186 Reviewed-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/zink_compiler.c | 2 +- src/gallium/drivers/zink/zink_pipeline.c | 2 +- src/gallium/drivers/zink/zink_screen.c | 5 +++++ src/gallium/drivers/zink/zink_screen.h | 1 + src/gallium/drivers/zink/zink_state.c | 2 +- 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 50d23cd98ac..4de3d4881e4 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -1269,7 +1269,7 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, nir_shad if (zs->sinfo.have_xfb) sinfo->last_vertex = true; - if (!zink_vs_key_base(key)->clip_halfz && !screen->info.have_EXT_depth_clip_control) { + if (!zink_vs_key_base(key)->clip_halfz && screen->driver_workarounds.depth_clip_control_missing) { NIR_PASS_V(nir, nir_lower_clip_halfz); } if (zink_vs_key_base(key)->push_drawid) { diff --git a/src/gallium/drivers/zink/zink_pipeline.c b/src/gallium/drivers/zink/zink_pipeline.c index b36aa00a24f..a4797159025 100644 --- a/src/gallium/drivers/zink/zink_pipeline.c +++ b/src/gallium/drivers/zink/zink_pipeline.c @@ -155,7 +155,7 @@ zink_create_gfx_pipeline(struct zink_screen *screen, viewport_state.pViewports = NULL; viewport_state.scissorCount = screen->info.have_EXT_extended_dynamic_state ? 0 : state->dyn_state1.num_viewports; viewport_state.pScissors = NULL; - if (screen->info.have_EXT_depth_clip_control && !hw_rast_state->clip_halfz) + if (!screen->driver_workarounds.depth_clip_control_missing && !hw_rast_state->clip_halfz) viewport_state.pNext = &clip; VkPipelineRasterizationStateCreateInfo rast_state = {0}; diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index ed540cb926f..765a14b86ea 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -2084,6 +2084,11 @@ static void init_driver_workarounds(struct zink_screen *screen) { screen->driver_workarounds.color_write_missing = !screen->info.have_EXT_color_write_enable; + screen->driver_workarounds.depth_clip_control_missing = !screen->info.have_EXT_depth_clip_control; + if (screen->info.driver_props.driverID == VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA) { + /* #6186 */ + screen->driver_workarounds.depth_clip_control_missing = true; + } /* #6185 */ if (screen->info.driver_props.driverID == VK_DRIVER_ID_MESA_RADV) screen->driver_workarounds.color_write_missing = true; diff --git a/src/gallium/drivers/zink/zink_screen.h b/src/gallium/drivers/zink/zink_screen.h index 585ec729a6b..2a96b01cf0b 100644 --- a/src/gallium/drivers/zink/zink_screen.h +++ b/src/gallium/drivers/zink/zink_screen.h @@ -180,6 +180,7 @@ struct zink_screen { struct { bool color_write_missing; + bool depth_clip_control_missing; } driver_workarounds; }; diff --git a/src/gallium/drivers/zink/zink_state.c b/src/gallium/drivers/zink/zink_state.c index 9af4d2c8297..0012a293356 100644 --- a/src/gallium/drivers/zink/zink_state.c +++ b/src/gallium/drivers/zink/zink_state.c @@ -698,7 +698,7 @@ zink_bind_rasterizer_state(struct pipe_context *pctx, void *cso) ctx->rast_state_changed = true; if (clip_halfz != ctx->rast_state->base.clip_halfz) { - if (screen->info.have_EXT_depth_clip_control) + if (!screen->driver_workarounds.depth_clip_control_missing) ctx->gfx_pipeline_state.dirty = true; else zink_set_last_vertex_key(ctx)->clip_halfz = ctx->rast_state->base.clip_halfz;