panvk: Wire up VK_EXT_conservative_rasterization on v11+
Some checks are pending
macOS-CI / macOS-CI (dri) (push) Waiting to run
macOS-CI / macOS-CI (xlib) (push) Waiting to run

Mali >= v11 has a Conservative Rast Mode field in DCD Flags 0 with
values Disabled and Over Estimate. Wire it to vk_runtime's
rasterization state and expose the extension on PAN_ARCH >= 11, with
caps restricted to overestimate only — HW has no underestimate value
and no overestimation-size granularity.

On v11-v13, degenerate triangles produce a wrong fragment w when
overestimate is enabled, so cull_zero_area is forced on alongside
the mode bit and degenerateTrianglesRasterized is reported as false.

Signed-off-by: Christian Gmeiner <cgmeiner@igalia.com>
Reviewed-by: Lars-Ivar Hesselberg Simonsen <lars-ivar.simonsen@arm.com>
Acked-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41189>
This commit is contained in:
Christian Gmeiner 2026-04-24 11:01:04 +02:00
parent df3de4acbb
commit 7d59c62fde
4 changed files with 26 additions and 1 deletions

View file

@ -611,7 +611,7 @@ Khronos extensions that are not part of any Vulkan version:
VK_EXT_calibrated_timestamps DONE (anv, hasvk, hk, kk, nvk, panvk/v10+, lvp, radv, vn, tu/a750+)
VK_EXT_color_write_enable DONE (anv, hasvk, hk, lvp, nvk, panvk, pvr, radv, tu, v3dv, vn)
VK_EXT_conditional_rendering DONE (anv, hasvk, lvp, nvk, panvk/v10+, radv, tu, vn)
VK_EXT_conservative_rasterization DONE (anv, nvk, radv, vn, tu/a7xx+)
VK_EXT_conservative_rasterization DONE (anv, nvk, panvk/v11+, radv, vn, tu/a7xx+)
VK_EXT_custom_border_color DONE (anv, hasvk, hk, lvp, nvk, panvk, pvr, radv, tu, v3dv, vn)
VK_EXT_custom_resolve DONE (radv, tu)
VK_EXT_debug_marker DONE (radv)

View file

@ -5,3 +5,4 @@ VK_KHR_shader_constant_data on RADV
VK_EXT_dynamic_rendering_unused_attachments on panvk
protectedMemory support on RADV/GFX10+ and VEGA10
VK_KHR_performance_query on RADV/GFX11
VK_EXT_conservative_rasterization on panvk

View file

@ -1879,6 +1879,9 @@ prepare_dcd(struct panvk_cmd_buffer *cmdbuf,
dyn_gfx_state_dirty(cmdbuf, RS_CULL_MODE) ||
dyn_gfx_state_dirty(cmdbuf, RS_LINE_MODE) ||
dyn_gfx_state_dirty(cmdbuf, RS_FRONT_FACE) ||
#if PAN_ARCH >= 11
dyn_gfx_state_dirty(cmdbuf, RS_CONSERVATIVE_MODE) ||
#endif
dyn_gfx_state_dirty(cmdbuf, MS_RASTERIZATION_SAMPLES) ||
dyn_gfx_state_dirty(cmdbuf, MS_SAMPLE_MASK) ||
dyn_gfx_state_dirty(cmdbuf, MS_ALPHA_TO_COVERAGE_ENABLE) ||
@ -2009,6 +2012,15 @@ prepare_dcd(struct panvk_cmd_buffer *cmdbuf,
cfg.multisample_enable = msaa;
cfg.occlusion_query = cmdbuf->state.gfx.occlusion_query.mode;
cfg.alpha_to_coverage = alpha_to_coverage;
#if PAN_ARCH >= 11
cfg.conservative_rast_mode =
rs->conservative_mode == VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT
? MALI_CONSERVATIVE_RAST_MODE_OVER_ESTIMATE
: MALI_CONSERVATIVE_RAST_MODE_DISABLED;
#if PAN_ARCH < 14
cfg.cull_zero_area = true;
#endif
#endif
}
cs_update_vt_ctx(b)

View file

@ -139,6 +139,7 @@ panvk_per_arch(get_physical_device_extensions)(
device->kmod.dev->props.gpu_can_query_timestamp,
.EXT_conditional_rendering = PAN_ARCH >= 10,
.EXT_color_write_enable = true,
.EXT_conservative_rasterization = PAN_ARCH >= 11,
.EXT_custom_border_color = true,
.EXT_depth_bias_control = true,
.EXT_depth_clamp_control = true,
@ -1153,6 +1154,17 @@ panvk_per_arch(get_physical_device_properties)(
.image2DViewOf3DSparse = false,
.defaultVertexAttributeValue = VK_DEFAULT_VERTEX_ATTRIBUTE_VALUE_ZERO_ZERO_ZERO_ZERO_KHR,
/* VK_EXT_conservative_rasterization */
.primitiveOverestimationSize = 1.0f / 512.0f,
.maxExtraPrimitiveOverestimationSize = 0.0f,
.extraPrimitiveOverestimationSizeGranularity = 0.0f,
.primitiveUnderestimation = false,
.conservativePointAndLineRasterization = false,
.degenerateTrianglesRasterized = PAN_ARCH >= 14,
.degenerateLinesRasterized = false,
.fullyCoveredFragmentShaderInputVariable = false,
.conservativeRasterizationPostDepthCoverage = false,
/* VK_EXT_custom_border_color */
.maxCustomBorderColorSamplers = 32768,