diff --git a/.pick_status.json b/.pick_status.json index c52560576cf..173ac7b864a 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -454,7 +454,7 @@ "description": "radv: fix dynamic depth clamp enable support", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "e48c0fbd8f70df5f74bdbe594f807d09fc3a4424" }, diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 66f24db6eae..49f904c5cb6 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -1954,10 +1954,21 @@ radv_emit_graphics_pipeline(struct radv_cmd_buffer *cmd_buffer) cmd_buffer->state.dirty &= ~RADV_CMD_DIRTY_PIPELINE; } +static bool +radv_get_depth_clip_enable(struct radv_cmd_buffer *cmd_buffer) +{ + const struct radv_dynamic_state *d = &cmd_buffer->state.dynamic; + + return d->vk.rs.depth_clip_enable == VK_MESA_DEPTH_CLIP_ENABLE_TRUE || + (d->vk.rs.depth_clip_enable == VK_MESA_DEPTH_CLIP_ENABLE_NOT_CLAMP && + !d->vk.rs.depth_clamp_enable); +} + static enum radv_depth_clamp_mode radv_get_depth_clamp_mode(struct radv_cmd_buffer *cmd_buffer) { const struct radv_dynamic_state *d = &cmd_buffer->state.dynamic; + bool depth_clip_enable = radv_get_depth_clip_enable(cmd_buffer); const struct radv_device *device = cmd_buffer->device; enum radv_depth_clamp_mode mode; @@ -1966,7 +1977,7 @@ radv_get_depth_clamp_mode(struct radv_cmd_buffer *cmd_buffer) /* For optimal performance, depth clamping should always be enabled except if the application * disables clamping explicitly or uses depth values outside of the [0.0, 1.0] range. */ - if (!d->vk.rs.depth_clip_enable || + if (!depth_clip_enable || device->vk.enabled_extensions.EXT_depth_range_unrestricted) { mode = RADV_DEPTH_CLAMP_MODE_DISABLED; } else { @@ -2363,11 +2374,12 @@ static void radv_emit_clipping(struct radv_cmd_buffer *cmd_buffer) { const struct radv_dynamic_state *d = &cmd_buffer->state.dynamic; + bool depth_clip_enable = radv_get_depth_clip_enable(cmd_buffer); radeon_set_context_reg(cmd_buffer->cs, R_028810_PA_CL_CLIP_CNTL, S_028810_DX_RASTERIZATION_KILL(d->vk.rs.rasterizer_discard_enable) | - S_028810_ZCLIP_NEAR_DISABLE(!d->vk.rs.depth_clip_enable) | - S_028810_ZCLIP_FAR_DISABLE(!d->vk.rs.depth_clip_enable) | + S_028810_ZCLIP_NEAR_DISABLE(!depth_clip_enable) | + S_028810_ZCLIP_FAR_DISABLE(!depth_clip_enable) | S_028810_DX_CLIP_SPACE_DEF(!d->vk.vp.depth_clip_negative_one_to_one) | S_028810_DX_LINEAR_ATTR_CLIP_ENA(1)); } @@ -4510,7 +4522,8 @@ radv_cmd_buffer_flush_dynamic_state(struct radv_cmd_buffer *cmd_buffer, bool pip if (states & (RADV_CMD_DIRTY_DYNAMIC_RASTERIZER_DISCARD_ENABLE | RADV_CMD_DIRTY_DYNAMIC_DEPTH_CLIP_ENABLE | - RADV_CMD_DIRTY_DYNAMIC_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE)) + RADV_CMD_DIRTY_DYNAMIC_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE | + RADV_CMD_DIRTY_DYNAMIC_DEPTH_CLAMP_ENABLE)) radv_emit_clipping(cmd_buffer); if (states & (RADV_CMD_DIRTY_DYNAMIC_LOGIC_OP | RADV_CMD_DIRTY_DYNAMIC_LOGIC_OP_ENABLE | diff --git a/src/amd/vulkan/radv_pipeline_graphics.c b/src/amd/vulkan/radv_pipeline_graphics.c index 36027d0368c..3571dd6e953 100644 --- a/src/amd/vulkan/radv_pipeline_graphics.c +++ b/src/amd/vulkan/radv_pipeline_graphics.c @@ -1006,8 +1006,7 @@ radv_pipeline_init_dynamic_state(struct radv_graphics_pipeline *pipeline, } if (states & RADV_DYNAMIC_DEPTH_CLIP_ENABLE) { - dynamic->vk.rs.depth_clip_enable = - state->rs->depth_clip_enable == VK_MESA_DEPTH_CLIP_ENABLE_TRUE; + dynamic->vk.rs.depth_clip_enable = state->rs->depth_clip_enable; } if (states & RADV_DYNAMIC_CONSERVATIVE_RAST_MODE) {