From b7b494299d556de5ac01db28769d881e927cf0b9 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 23 Feb 2022 10:59:12 -0500 Subject: [PATCH] zink: use VK_EXT_depth_clip_control when available this saves a few ALUs in vertex stages Reviewed-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/zink_compiler.c | 2 +- src/gallium/drivers/zink/zink_device_info.py | 1 + src/gallium/drivers/zink/zink_pipeline.c | 7 +++++++ src/gallium/drivers/zink/zink_state.c | 8 ++++++-- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index e122398982d..f6df42a059b 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -1121,7 +1121,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) { + if (!zink_vs_key_base(key)->clip_halfz && !screen->info.have_EXT_depth_clip_control) { NIR_PASS_V(nir, nir_lower_clip_halfz); } if (zink_vs_key_base(key)->push_drawid) { diff --git a/src/gallium/drivers/zink/zink_device_info.py b/src/gallium/drivers/zink/zink_device_info.py index 05997213e01..4903e3bca66 100644 --- a/src/gallium/drivers/zink/zink_device_info.py +++ b/src/gallium/drivers/zink/zink_device_info.py @@ -76,6 +76,7 @@ EXTENSIONS = [ Extension("VK_EXT_shader_viewport_index_layer"), Extension("VK_KHR_get_memory_requirements2"), Extension("VK_EXT_post_depth_coverage"), + Extension("VK_EXT_depth_clip_control", alias="clip_control", features=True), Extension("VK_EXT_shader_subgroup_ballot"), Extension("VK_EXT_shader_atomic_float", alias="atomic_float", features=True), Extension("VK_KHR_8bit_storage", diff --git a/src/gallium/drivers/zink/zink_pipeline.c b/src/gallium/drivers/zink/zink_pipeline.c index 0fceb9ebaaa..6a6e153b1cf 100644 --- a/src/gallium/drivers/zink/zink_pipeline.c +++ b/src/gallium/drivers/zink/zink_pipeline.c @@ -145,11 +145,18 @@ zink_create_gfx_pipeline(struct zink_screen *screen, } VkPipelineViewportStateCreateInfo viewport_state = {0}; + VkPipelineViewportDepthClipControlCreateInfoEXT clip = { + VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_DEPTH_CLIP_CONTROL_CREATE_INFO_EXT, + NULL, + VK_TRUE + }; viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; viewport_state.viewportCount = screen->info.have_EXT_extended_dynamic_state ? 0 : state->dyn_state1.num_viewports; 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) + viewport_state.pNext = &clip; VkPipelineRasterizationStateCreateInfo rast_state = {0}; rast_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; diff --git a/src/gallium/drivers/zink/zink_state.c b/src/gallium/drivers/zink/zink_state.c index 611c83ed6aa..3991eba0f7f 100644 --- a/src/gallium/drivers/zink/zink_state.c +++ b/src/gallium/drivers/zink/zink_state.c @@ -681,6 +681,7 @@ zink_bind_rasterizer_state(struct pipe_context *pctx, void *cso) bool scissor = ctx->rast_state ? ctx->rast_state->base.scissor : false; bool pv_last = ctx->rast_state ? ctx->rast_state->hw_state.pv_last : false; bool force_persample_interp = ctx->rast_state ? ctx->rast_state->hw_state.force_persample_interp : false; + bool clip_halfz = ctx->rast_state ? ctx->rast_state->hw_state.clip_halfz : false; ctx->rast_state = cso; if (ctx->rast_state) { @@ -696,8 +697,11 @@ zink_bind_rasterizer_state(struct pipe_context *pctx, void *cso) ctx->gfx_pipeline_state.dirty = true; ctx->rast_state_changed = true; - if (zink_get_last_vertex_key(ctx)->clip_halfz != ctx->rast_state->base.clip_halfz) { - zink_set_last_vertex_key(ctx)->clip_halfz = ctx->rast_state->base.clip_halfz; + if (clip_halfz != ctx->rast_state->base.clip_halfz) { + if (screen->info.have_EXT_depth_clip_control) + ctx->gfx_pipeline_state.dirty = true; + else + zink_set_last_vertex_key(ctx)->clip_halfz = ctx->rast_state->base.clip_halfz; ctx->vp_state_changed = true; }