From 7d59c62fded7638dbe8b7e0737a8ba491bf6438c Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Fri, 24 Apr 2026 11:01:04 +0200 Subject: [PATCH] panvk: Wire up VK_EXT_conservative_rasterization on v11+ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Lars-Ivar Hesselberg Simonsen Acked-by: Erik Faye-Lund Part-of: --- docs/features.txt | 2 +- docs/relnotes/new_features.txt | 1 + src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c | 12 ++++++++++++ src/panfrost/vulkan/panvk_vX_physical_device.c | 12 ++++++++++++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/docs/features.txt b/docs/features.txt index c9e5ac9aa94..ec9e39b98aa 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -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) diff --git a/docs/relnotes/new_features.txt b/docs/relnotes/new_features.txt index 256f518068d..e4fe5700bed 100644 --- a/docs/relnotes/new_features.txt +++ b/docs/relnotes/new_features.txt @@ -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 diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index bc86b2a1648..87e7b647df7 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -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) diff --git a/src/panfrost/vulkan/panvk_vX_physical_device.c b/src/panfrost/vulkan/panvk_vX_physical_device.c index 0be3c654f95..a0845b6987e 100644 --- a/src/panfrost/vulkan/panvk_vX_physical_device.c +++ b/src/panfrost/vulkan/panvk_vX_physical_device.c @@ -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,