From 43e83949dc6964d2870c52c8dc8112a94124e72e Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Mon, 28 Feb 2022 11:42:51 +0100 Subject: [PATCH] radv: implement VK_EXT_depth_clip_control Signed-off-by: Samuel Pitoiset Reviewed-By: Mike Blumenkrantz Part-of: --- src/amd/vulkan/radv_cmd_buffer.c | 15 +++++++++++++-- src/amd/vulkan/radv_pipeline.c | 18 +++++++++++++++++- src/amd/vulkan/radv_private.h | 1 + 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 3b288cef323..13fe0acd929 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -1422,6 +1422,7 @@ radv_emit_graphics_pipeline(struct radv_cmd_buffer *cmd_buffer) static void radv_emit_viewport(struct radv_cmd_buffer *cmd_buffer) { + bool negative_one_to_one = cmd_buffer->state.pipeline->graphics.negative_one_to_one; const struct radv_viewport_state *viewport = &cmd_buffer->state.dynamic.viewport; int i; const unsigned count = viewport->count; @@ -1434,8 +1435,18 @@ radv_emit_viewport(struct radv_cmd_buffer *cmd_buffer) radeon_emit(cmd_buffer->cs, fui(viewport->xform[i].translate[0])); radeon_emit(cmd_buffer->cs, fui(viewport->xform[i].scale[1])); radeon_emit(cmd_buffer->cs, fui(viewport->xform[i].translate[1])); - radeon_emit(cmd_buffer->cs, fui(viewport->xform[i].scale[2])); - radeon_emit(cmd_buffer->cs, fui(viewport->xform[i].translate[2])); + + double scale_z, translate_z; + if (negative_one_to_one) { + scale_z = viewport->xform[i].scale[2] * 0.5f; + translate_z = (viewport->xform[i].translate[2] + viewport->viewports[i].maxDepth) * 0.5f; + } else { + scale_z = viewport->xform[i].scale[2]; + translate_z = viewport->xform[i].translate[2]; + + } + radeon_emit(cmd_buffer->cs, fui(scale_z)); + radeon_emit(cmd_buffer->cs, fui(translate_z)); } radeon_set_context_reg_seq(cmd_buffer->cs, R_0282D0_PA_SC_VPORT_ZMIN_0, count * 2); diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index 59da66fc3be..6193323f128 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -1859,7 +1859,7 @@ radv_pipeline_init_raster_state(struct radv_pipeline *pipeline, } pipeline->graphics.pa_cl_clip_cntl = - S_028810_DX_CLIP_SPACE_DEF(1) | // vulkan uses DX conventions. + S_028810_DX_CLIP_SPACE_DEF(!pipeline->graphics.negative_one_to_one) | S_028810_ZCLIP_NEAR_DISABLE(depth_clip_disable ? 1 : 0) | S_028810_ZCLIP_FAR_DISABLE(depth_clip_disable ? 1 : 0) | S_028810_DX_RASTERIZATION_KILL(raster_info->rasterizerDiscardEnable ? 1 : 0) | @@ -1870,6 +1870,21 @@ radv_pipeline_init_raster_state(struct radv_pipeline *pipeline, VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT; } +static void +radv_pipeline_init_viewport_state(struct radv_pipeline *pipeline, + const VkGraphicsPipelineCreateInfo *pCreateInfo) +{ + if (pCreateInfo->pRasterizationState->rasterizerDiscardEnable) + return; + + const VkPipelineViewportDepthClipControlCreateInfoEXT *depth_clip_control = + vk_find_struct_const(pCreateInfo->pViewportState->pNext, + PIPELINE_VIEWPORT_DEPTH_CLIP_CONTROL_CREATE_INFO_EXT); + if (depth_clip_control) { + pipeline->graphics.negative_one_to_one = !!depth_clip_control->negativeOneToOne; + } +} + static struct radv_depth_stencil_state radv_pipeline_init_depth_stencil_state(struct radv_pipeline *pipeline, const VkGraphicsPipelineCreateInfo *pCreateInfo) @@ -6397,6 +6412,7 @@ radv_pipeline_init(struct radv_pipeline *pipeline, struct radv_device *device, if (!radv_pipeline_has_mesh(pipeline)) radv_pipeline_init_input_assembly_state(pipeline, pCreateInfo); radv_pipeline_init_dynamic_state(pipeline, pCreateInfo); + radv_pipeline_init_viewport_state(pipeline, pCreateInfo); radv_pipeline_init_raster_state(pipeline, pCreateInfo); struct radv_depth_stencil_state ds_state = diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index d19de03589c..d4a4275628a 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -1893,6 +1893,7 @@ struct radv_pipeline { unsigned cb_color_control; bool uses_dynamic_stride; bool uses_conservative_overestimate; + bool negative_one_to_one; /* Used for rbplus */ uint32_t col_format;