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:
parent
37939e9c54
commit
43e83949dc
|
@ -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);
|
||||
|
|
|
@ -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 =
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue