From c743c3dd1aea9f4a44272ea612384609a1053281 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Mon, 26 May 2025 06:30:29 -0400 Subject: [PATCH] radeonsi: support 8 non-ClipVertex clip planes instead of 6 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If there are more than 6 planes without gl_ClipVertex and gl_ClipDistance, add "gl_ClipVertex = gl_Position;" to support up to 8 planes. Acked-by: Pierre-Eric Pelloux-Prayer Acked-by: Timur Kristóf Part-of: --- src/amd/ci/radeonsi-mendocino-fails.txt | 1 - src/amd/ci/radeonsi-raven-fails.txt | 2 -- src/amd/ci/radeonsi-stoney-fails.txt | 1 - src/amd/ci/radeonsi-vangogh-fails.txt | 1 - src/gallium/drivers/radeonsi/ci/gfx10-navi10-fail.csv | 1 - .../drivers/radeonsi/ci/gfx10_3-navi21-fail.csv | 1 - src/gallium/drivers/radeonsi/ci/gfx11-navi31-fail.csv | 1 - .../drivers/radeonsi/ci/gfx12-gfx1200-fail.csv | 1 - src/gallium/drivers/radeonsi/ci/gfx6-tahiti-fail.csv | 1 - src/gallium/drivers/radeonsi/ci/gfx7-hawaii-fail.csv | 1 - .../drivers/radeonsi/ci/gfx8-polaris11-fail.csv | 1 - src/gallium/drivers/radeonsi/ci/gfx9-raven-fail.csv | 1 - src/gallium/drivers/radeonsi/ci/gfx9-vega20-fail.csv | 1 - src/gallium/drivers/radeonsi/si_shader.c | 5 ++++- src/gallium/drivers/radeonsi/si_shader.h | 5 +++++ src/gallium/drivers/radeonsi/si_shader_variant_info.c | 6 ++++-- src/gallium/drivers/radeonsi/si_state_shaders.cpp | 11 +++++++++++ 17 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/amd/ci/radeonsi-mendocino-fails.txt b/src/amd/ci/radeonsi-mendocino-fails.txt index 1713a26fbe9..bdbdc108526 100644 --- a/src/amd/ci/radeonsi-mendocino-fails.txt +++ b/src/amd/ci/radeonsi-mendocino-fails.txt @@ -411,7 +411,6 @@ spec@khr_texture_compression_astc@miptree-gles srgb-fp,Fail spec@khr_texture_compression_astc@miptree-gles srgb-fp@sRGB decode full precision,Fail spec@khr_texture_compression_astc@sliced-3d-miptree-gles srgb-fp,Fail spec@khr_texture_compression_astc@sliced-3d-miptree-gles srgb-fp@sRGB decode full precision,Fail -spec@!opengl 1.0@gl-1.0-user-clip-all-planes,Fail spec@!opengl 1.0@rasterpos,Fail spec@!opengl 1.0@rasterpos@glsl_vs_gs_linked,Fail spec@!opengl 1.0@rasterpos@glsl_vs_tes_linked,Fail diff --git a/src/amd/ci/radeonsi-raven-fails.txt b/src/amd/ci/radeonsi-raven-fails.txt index 5b0fed533ff..6700e938ef9 100644 --- a/src/amd/ci/radeonsi-raven-fails.txt +++ b/src/amd/ci/radeonsi-raven-fails.txt @@ -30,8 +30,6 @@ spec@khr_texture_compression_astc@miptree-gles srgb-fp@sRGB decode full precisio spec@khr_texture_compression_astc@sliced-3d-miptree-gles srgb-fp,Fail spec@khr_texture_compression_astc@sliced-3d-miptree-gles srgb-fp@sRGB decode full precision,Fail -spec@!opengl 1.0@gl-1.0-user-clip-all-planes,Fail - spec@!opengl 1.1@line-smooth-stipple,Fail # since Debian 12 (bookworm) uprev diff --git a/src/amd/ci/radeonsi-stoney-fails.txt b/src/amd/ci/radeonsi-stoney-fails.txt index a17d5448053..64b02fd0137 100644 --- a/src/amd/ci/radeonsi-stoney-fails.txt +++ b/src/amd/ci/radeonsi-stoney-fails.txt @@ -1,6 +1,5 @@ glx@glx-multi-window-single-context,Fail glx@glx-swap-pixmap-bad,Fail -spec@!opengl 1.0@gl-1.0-user-clip-all-planes,Fail spec@!opengl 1.0@rasterpos,Fail spec@!opengl 1.0@rasterpos@glsl_vs_gs_linked,Fail spec@!opengl 1.0@rasterpos@glsl_vs_tes_linked,Fail diff --git a/src/amd/ci/radeonsi-vangogh-fails.txt b/src/amd/ci/radeonsi-vangogh-fails.txt index ca2864a9601..7c7e5da7377 100644 --- a/src/amd/ci/radeonsi-vangogh-fails.txt +++ b/src/amd/ci/radeonsi-vangogh-fails.txt @@ -1,4 +1,3 @@ -spec@!opengl 1.0@gl-1.0-user-clip-all-planes,Fail spec@!opengl 1.0@rasterpos,Fail spec@!opengl 1.0@rasterpos@glsl_vs_gs_linked,Fail spec@!opengl 1.0@rasterpos@glsl_vs_tes_linked,Fail diff --git a/src/gallium/drivers/radeonsi/ci/gfx10-navi10-fail.csv b/src/gallium/drivers/radeonsi/ci/gfx10-navi10-fail.csv index 10639fd775c..5226a44d232 100644 --- a/src/gallium/drivers/radeonsi/ci/gfx10-navi10-fail.csv +++ b/src/gallium/drivers/radeonsi/ci/gfx10-navi10-fail.csv @@ -7,7 +7,6 @@ glx@glx-visuals-depth -pixmap,Fail glx@glx-visuals-stencil -pixmap,Fail glx@glx_arb_create_context_no_error@no error,Fail glx@glx_ext_no_config_context@no fbconfig,Fail -spec@!opengl 1.0@gl-1.0-user-clip-all-planes,Fail spec@!opengl 1.1@line-smooth-stipple,Fail spec@arb_bindless_texture@compiler@samplers@arith-bound-sampler-texture2d.frag,Crash spec@arb_program_interface_query@arb_program_interface_query-getprogramresourceindex,Fail diff --git a/src/gallium/drivers/radeonsi/ci/gfx10_3-navi21-fail.csv b/src/gallium/drivers/radeonsi/ci/gfx10_3-navi21-fail.csv index 581a6339cdc..48501b84c59 100644 --- a/src/gallium/drivers/radeonsi/ci/gfx10_3-navi21-fail.csv +++ b/src/gallium/drivers/radeonsi/ci/gfx10_3-navi21-fail.csv @@ -7,7 +7,6 @@ glx@glx-multi-window-single-context,Fail glx@glx-swap-event_interval,Fail glx@glx_arb_create_context_no_error@no error,Fail glx@glx_ext_no_config_context@no fbconfig,Fail -spec@!opengl 1.0@gl-1.0-user-clip-all-planes,Fail spec@!opengl 1.1@line-smooth-stipple,Fail spec@arb_pipeline_statistics_query@arb_pipeline_statistics_query-frag,Fail spec@arb_program_interface_query@arb_program_interface_query-getprogramresourceindex,Fail diff --git a/src/gallium/drivers/radeonsi/ci/gfx11-navi31-fail.csv b/src/gallium/drivers/radeonsi/ci/gfx11-navi31-fail.csv index f62ba728dbe..495932eaf21 100644 --- a/src/gallium/drivers/radeonsi/ci/gfx11-navi31-fail.csv +++ b/src/gallium/drivers/radeonsi/ci/gfx11-navi31-fail.csv @@ -9,7 +9,6 @@ glx@glx-swap-event_interval,Fail glx@glx_ext_no_config_context@no fbconfig,Fail glx@glx-visuals-depth -pixmap,Warn glx@glx-visuals-stencil -pixmap,Fail -spec@!opengl 1.0@gl-1.0-user-clip-all-planes,Fail spec@!opengl 1.1@line-smooth-stipple,Fail spec@arb_pipeline_statistics_query@arb_pipeline_statistics_query-frag,Fail spec@arb_shader_texture_lod@execution@arb_shader_texture_lod-texgradcube,Fail diff --git a/src/gallium/drivers/radeonsi/ci/gfx12-gfx1200-fail.csv b/src/gallium/drivers/radeonsi/ci/gfx12-gfx1200-fail.csv index ce75d837322..2a30f2acc81 100644 --- a/src/gallium/drivers/radeonsi/ci/gfx12-gfx1200-fail.csv +++ b/src/gallium/drivers/radeonsi/ci/gfx12-gfx1200-fail.csv @@ -5,7 +5,6 @@ glx@glx-swap-event_interval,Fail glx@glx_ext_no_config_context@no fbconfig,Fail glx@glx-visuals-depth -pixmap,Fail glx@glx-visuals-stencil -pixmap,Fail -spec@!opengl 1.0@gl-1.0-user-clip-all-planes,Fail spec@!opengl 1.1@line-smooth-stipple,Fail spec@arb_pipeline_statistics_query@arb_pipeline_statistics_query-clip,Fail spec@arb_pipeline_statistics_query@arb_pipeline_statistics_query-frag,Fail diff --git a/src/gallium/drivers/radeonsi/ci/gfx6-tahiti-fail.csv b/src/gallium/drivers/radeonsi/ci/gfx6-tahiti-fail.csv index a5bb1d57416..ac55463d988 100644 --- a/src/gallium/drivers/radeonsi/ci/gfx6-tahiti-fail.csv +++ b/src/gallium/drivers/radeonsi/ci/gfx6-tahiti-fail.csv @@ -28,7 +28,6 @@ spec@khr_texture_compression_astc@sliced-3d-miptree-gles srgb-fp@sRGB decode ful spec@khr_texture_compression_astc@sliced-3d-miptree-gl srgb-fp,Fail spec@khr_texture_compression_astc@sliced-3d-miptree-gl srgb-fp@sRGB decode full precision,Fail spec@oes_shader_io_blocks@compiler@layout-location-aliasing.vert,Fail -spec@!opengl 1.0@gl-1.0-user-clip-all-planes,Fail spec@!opengl 1.1@line-smooth-stipple,Fail # These are hw bugs related to GS and primitive restart diff --git a/src/gallium/drivers/radeonsi/ci/gfx7-hawaii-fail.csv b/src/gallium/drivers/radeonsi/ci/gfx7-hawaii-fail.csv index 7746b0000e1..ca1bd5fd793 100644 --- a/src/gallium/drivers/radeonsi/ci/gfx7-hawaii-fail.csv +++ b/src/gallium/drivers/radeonsi/ci/gfx7-hawaii-fail.csv @@ -15,7 +15,6 @@ glx@glx_ext_import_context@make current- multi process,Fail glx@glx_ext_import_context@make current- single process,Fail glx@glx_ext_import_context@query context info,Fail glx@glx_ext_no_config_context@no fbconfig,Fail -spec@!opengl 1.0@gl-1.0-user-clip-all-planes,Fail spec@!opengl 1.1@line-smooth-stipple,Fail spec@!opengl 1.1@texwrap formats bordercolor-swizzled,Fail spec@!opengl 1.1@texwrap formats bordercolor-swizzled@GL_R3_G3_B2- swizzled- border color only,Fail diff --git a/src/gallium/drivers/radeonsi/ci/gfx8-polaris11-fail.csv b/src/gallium/drivers/radeonsi/ci/gfx8-polaris11-fail.csv index b45ce5d4fc5..1b1e21c2133 100644 --- a/src/gallium/drivers/radeonsi/ci/gfx8-polaris11-fail.csv +++ b/src/gallium/drivers/radeonsi/ci/gfx8-polaris11-fail.csv @@ -5,7 +5,6 @@ glx@glx-multi-window-single-context,Fail glx@glx-swap-event_interval,Fail glx@glx-visuals-depth -pixmap,Fail glx@glx_ext_no_config_context@no fbconfig,Fail -spec@!opengl 1.0@gl-1.0-user-clip-all-planes,Fail spec@!opengl 1.1@line-smooth-stipple,Fail spec@!opengl 1.1@texwrap formats bordercolor-swizzled,Fail spec@!opengl 1.1@texwrap formats bordercolor-swizzled@GL_R3_G3_B2- swizzled- border color only,Fail diff --git a/src/gallium/drivers/radeonsi/ci/gfx9-raven-fail.csv b/src/gallium/drivers/radeonsi/ci/gfx9-raven-fail.csv index 22e3fbc54f1..e5a1e0e23b7 100644 --- a/src/gallium/drivers/radeonsi/ci/gfx9-raven-fail.csv +++ b/src/gallium/drivers/radeonsi/ci/gfx9-raven-fail.csv @@ -19,7 +19,6 @@ spec@arb_texture_query_lod@compiler@built-in-functions@texturequerylod-samplercu spec@arb_texture_query_lod@compiler@built-in-functions@texturequerylod-samplercubeshadow.frag,Crash spec@arb_uniform_buffer_object@referenced-by-shader,Fail glx@glx_ext_no_config_context@no fbconfig,Fail -spec@!opengl 1.0@gl-1.0-user-clip-all-planes,Fail spec@arb_bindless_texture@compiler@samplers@arith-bound-sampler-texture2d.frag,Crash spec@arb_program_interface_query@arb_program_interface_query-getprogramresourceindex,Fail spec@arb_program_interface_query@arb_program_interface_query-getprogramresourceindex@'vs_input2[1][0]' on GL_PROGRAM_INPUT,Fail diff --git a/src/gallium/drivers/radeonsi/ci/gfx9-vega20-fail.csv b/src/gallium/drivers/radeonsi/ci/gfx9-vega20-fail.csv index 71d9fe4cc50..132c89e1fc6 100644 --- a/src/gallium/drivers/radeonsi/ci/gfx9-vega20-fail.csv +++ b/src/gallium/drivers/radeonsi/ci/gfx9-vega20-fail.csv @@ -18,7 +18,6 @@ glx@glx_ext_import_context@make current- multi process,Fail glx@glx_ext_import_context@make current- single process,Fail glx@glx_ext_import_context@query context info,Fail glx@glx_ext_no_config_context@no fbconfig,Fail -spec@!opengl 1.0@gl-1.0-user-clip-all-planes,Fail spec@!opengl 1.1@line-smooth-stipple,Fail spec@!opengl 3.2@gl-3.2-adj-prims cull-back pv-last,Fail spec@!opengl 3.2@gl-3.2-adj-prims cull-front pv-last,Fail diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 3459269223b..165322276ea 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -994,6 +994,7 @@ static void si_dump_shader_key(const struct si_shader *shader, FILE *f) stage == MESA_SHADER_VERTEX) && !key->ge.as_es && !key->ge.as_ls) { fprintf(f, " mono.remove_streamout = 0x%x\n", key->ge.mono.remove_streamout); + fprintf(f, " mono.write_pos_to_clipvertex = %u\n", key->ge.mono.write_pos_to_clipvertex); fprintf(f, " opt.kill_outputs = 0x%" PRIx64 "\n", key->ge.opt.kill_outputs); fprintf(f, " opt.kill_clip_distances = 0x%x\n", key->ge.opt.kill_clip_distances); fprintf(f, " opt.kill_pointsize = %u\n", key->ge.opt.kill_pointsize); @@ -1121,6 +1122,7 @@ static void si_lower_ngg(struct si_shader *shader, nir_shader *nir, .vs_output_param_offset = temp_info->vs_output_param_offset, .has_param_exports = shader->info.nr_param_exports, .export_clipdist_mask = shader->info.clipdist_mask | shader->info.culldist_mask, + .write_pos_to_clipvertex = shader->key.ge.mono.write_pos_to_clipvertex, .force_vrs = sel->screen->options.vrs2x2, .use_gfx12_xfb_intrinsic = !nir->info.use_aco_amd, .skip_viewport_state_culling = sel->info.writes_viewport_index, @@ -1534,7 +1536,7 @@ static void run_late_optimization_and_lowering_passes(struct si_nir_shader_ctx * NIR_PASS_V(nir, ac_nir_lower_legacy_vs, sel->screen->info.gfx_level, shader->info.clipdist_mask | shader->info.culldist_mask, - false, false, + shader->key.ge.mono.write_pos_to_clipvertex, false, ctx->temp_info.vs_output_param_offset, shader->info.nr_param_exports, shader->key.ge.mono.u.vs_export_prim_id, @@ -1566,6 +1568,7 @@ static void run_late_optimization_and_lowering_passes(struct si_nir_shader_ctx * .has_pipeline_stats_query = sel->screen->use_ngg, .gfx_level = sel->screen->info.gfx_level, .export_clipdist_mask = shader->info.clipdist_mask | shader->info.culldist_mask, + .write_pos_to_clipvertex = shader->key.ge.mono.write_pos_to_clipvertex, .param_offsets = ctx->temp_info.vs_output_param_offset, .has_param_exports = shader->info.nr_param_exports, .disable_streamout = !shader->info.num_streamout_vec4s, diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h index efec3f6261b..d4481bd75a2 100644 --- a/src/gallium/drivers/radeonsi/si_shader.h +++ b/src/gallium/drivers/radeonsi/si_shader.h @@ -635,6 +635,11 @@ struct si_shader_key_ge { /* Gfx12: When no streamout buffers are bound, streamout must be disabled. */ unsigned remove_streamout : 1; + + /* Emulate 8 clip planes using the CLIP_VERTEX output. Only 6 clip planes are supported + * without this. + */ + unsigned write_pos_to_clipvertex : 1; } mono; /* Optimization flags for asynchronous compilation only. */ diff --git a/src/gallium/drivers/radeonsi/si_shader_variant_info.c b/src/gallium/drivers/radeonsi/si_shader_variant_info.c index 8ff58e69173..e1229ad8447 100644 --- a/src/gallium/drivers/radeonsi/si_shader_variant_info.c +++ b/src/gallium/drivers/radeonsi/si_shader_variant_info.c @@ -259,8 +259,10 @@ void si_get_shader_variant_info(struct si_shader *shader, shader->info.num_streamout_vec4s = DIV_ROUND_UP(num_streamout_dwords, 4); } - shader->info.clipdist_mask = shader->selector->info.clipdist_mask & - ~shader->key.ge.opt.kill_clip_distances; + shader->info.clipdist_mask = + (shader->key.ge.mono.write_pos_to_clipvertex ? + SI_USER_CLIP_PLANE_MASK : shader->selector->info.clipdist_mask) & + ~shader->key.ge.opt.kill_clip_distances; shader->info.culldist_mask = BITFIELD_RANGE(nir->info.clip_distance_array_size, nir->info.cull_distance_array_size); } diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.cpp b/src/gallium/drivers/radeonsi/si_state_shaders.cpp index 12d34bb516c..e5ccbbba493 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.cpp +++ b/src/gallium/drivers/radeonsi/si_state_shaders.cpp @@ -2474,6 +2474,16 @@ static void si_get_vs_key_outputs(struct si_context *sctx, struct si_shader_sele if (sctx->gfx_level >= GFX12) key->ge.mono.remove_streamout = key->ge.opt.remove_streamout; + + /* The fixed-func hw only supports 6 clip planes, while gl_ClipVertex supports 8. */ + if (!vs->info.clipdist_mask && + sctx->queued.named.rasterizer->clip_plane_enable & BITFIELD_RANGE(6, 2)) { + key->ge.mono.write_pos_to_clipvertex = 1; + key->ge.opt.kill_clip_distances = SI_USER_CLIP_PLANE_MASK & + ~sctx->queued.named.rasterizer->clip_plane_enable; + } else { + key->ge.mono.write_pos_to_clipvertex = 0; + } } static void si_clear_vs_key_outputs(struct si_context *sctx, struct si_shader_selector *vs, @@ -2486,6 +2496,7 @@ static void si_clear_vs_key_outputs(struct si_context *sctx, struct si_shader_se key->ge.opt.ngg_vs_streamout_num_verts_per_prim = 0; key->ge.mono.u.vs_export_prim_id = 0; key->ge.mono.remove_streamout = 0; + key->ge.mono.write_pos_to_clipvertex = 0; } void si_ps_key_update_framebuffer(struct si_context *sctx)