mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 11:10:10 +01:00
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
3 changed files with 31 additions and 3 deletions
|
|
@ -1422,6 +1422,7 @@ radv_emit_graphics_pipeline(struct radv_cmd_buffer *cmd_buffer)
|
||||||
static void
|
static void
|
||||||
radv_emit_viewport(struct radv_cmd_buffer *cmd_buffer)
|
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;
|
const struct radv_viewport_state *viewport = &cmd_buffer->state.dynamic.viewport;
|
||||||
int i;
|
int i;
|
||||||
const unsigned count = viewport->count;
|
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].translate[0]));
|
||||||
radeon_emit(cmd_buffer->cs, fui(viewport->xform[i].scale[1]));
|
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].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);
|
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 =
|
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_NEAR_DISABLE(depth_clip_disable ? 1 : 0) |
|
||||||
S_028810_ZCLIP_FAR_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) |
|
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;
|
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
|
static struct radv_depth_stencil_state
|
||||||
radv_pipeline_init_depth_stencil_state(struct radv_pipeline *pipeline,
|
radv_pipeline_init_depth_stencil_state(struct radv_pipeline *pipeline,
|
||||||
const VkGraphicsPipelineCreateInfo *pCreateInfo)
|
const VkGraphicsPipelineCreateInfo *pCreateInfo)
|
||||||
|
|
@ -6397,6 +6412,7 @@ radv_pipeline_init(struct radv_pipeline *pipeline, struct radv_device *device,
|
||||||
if (!radv_pipeline_has_mesh(pipeline))
|
if (!radv_pipeline_has_mesh(pipeline))
|
||||||
radv_pipeline_init_input_assembly_state(pipeline, pCreateInfo);
|
radv_pipeline_init_input_assembly_state(pipeline, pCreateInfo);
|
||||||
radv_pipeline_init_dynamic_state(pipeline, pCreateInfo);
|
radv_pipeline_init_dynamic_state(pipeline, pCreateInfo);
|
||||||
|
radv_pipeline_init_viewport_state(pipeline, pCreateInfo);
|
||||||
radv_pipeline_init_raster_state(pipeline, pCreateInfo);
|
radv_pipeline_init_raster_state(pipeline, pCreateInfo);
|
||||||
|
|
||||||
struct radv_depth_stencil_state ds_state =
|
struct radv_depth_stencil_state ds_state =
|
||||||
|
|
|
||||||
|
|
@ -1893,6 +1893,7 @@ struct radv_pipeline {
|
||||||
unsigned cb_color_control;
|
unsigned cb_color_control;
|
||||||
bool uses_dynamic_stride;
|
bool uses_dynamic_stride;
|
||||||
bool uses_conservative_overestimate;
|
bool uses_conservative_overestimate;
|
||||||
|
bool negative_one_to_one;
|
||||||
|
|
||||||
/* Used for rbplus */
|
/* Used for rbplus */
|
||||||
uint32_t col_format;
|
uint32_t col_format;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue