radv: implement VK_EXT_depth_clip_control

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15192>
This commit is contained in:
Samuel Pitoiset 2022-02-28 11:42:51 +01:00 committed by Marge Bot
parent 37939e9c54
commit 43e83949dc
3 changed files with 31 additions and 3 deletions

View File

@ -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);

View File

@ -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 =

View File

@ -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;