From 4d60b13dee6b7445a81a2cedaaf5945992dabbd8 Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Fri, 5 Sep 2025 16:50:24 -0400 Subject: [PATCH] tu: Lower ViewIndex to 0 when multiview is disabled This is an optimization, but it also seems to be required because the HW sometimes fails to set ViewIndex to 0. This fixes flakes with dEQP-VK.renderpass2.fragment_density_map.*multiviewport where the VS for the main renderpass is reused for the copy renderpass afterwards and it copies ViewIndex to ViewportIndex expecting it to be 0 since multiview is disabled for the copy renderpass. Closes: #13534 Cc: mesa-stable Part-of: (cherry picked from commit 7527ad001aabb4f2983f6fd8b7f3591e3c191633) --- .pick_status.json | 2 +- src/freedreno/ci/freedreno-a618-flakes.txt | 1 - src/freedreno/ci/freedreno-a660-flakes.txt | 15 ------------- src/freedreno/ci/freedreno-a750-flakes.txt | 19 +--------------- src/freedreno/vulkan/tu_shader.cc | 26 ++++++++++++++++++++++ 5 files changed, 28 insertions(+), 35 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 078827d0f07..50a990f56e3 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -8284,7 +8284,7 @@ "description": "tu: Lower ViewIndex to 0 when multiview is disabled", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/freedreno/ci/freedreno-a618-flakes.txt b/src/freedreno/ci/freedreno-a618-flakes.txt index 695fb10bf05..24395ffc9a1 100644 --- a/src/freedreno/ci/freedreno-a618-flakes.txt +++ b/src/freedreno/ci/freedreno-a618-flakes.txt @@ -274,7 +274,6 @@ dEQP-VK.tessellation.invariance.* # Updated by ci-collate spec@arb_gpu_shader_fp64@execution@arb_gpu_shader_fp64-wrong-type-setter spec@ext_external_objects@vk-image-display-overwrite -bypass-dEQP-VK.renderpass2.fragment_density_map.2_views.render.non_divisible_density_size.2_samples.static_subsampled_2_2_multiviewport # SKQP test which seems to flake out SRGBReadWritePixels diff --git a/src/freedreno/ci/freedreno-a660-flakes.txt b/src/freedreno/ci/freedreno-a660-flakes.txt index f5627ba1c0a..ed04dea114b 100644 --- a/src/freedreno/ci/freedreno-a660-flakes.txt +++ b/src/freedreno/ci/freedreno-a660-flakes.txt @@ -2,9 +2,6 @@ KHR-GL46.buffer_storage.map_persistent_dispatch KHR-GL46.buffer_storage.map_persistent_flush KHR-GL46.shader_subroutine.control_flow_and_returned_subroutine_values_used_as_subroutine_input -# Updated by ci-collate, found in this job run: https://gitlab.freedesktop.org/mesa/mesa/-/jobs/56164989 -bypass-dEQP-VK.renderpass2.fragment_density_map.2_views.render.non_divisible_density_size.2_samples.static_subsampled_2_1_multiviewport - # a618 and a660 seem to have some general instability in tesselation and GS. # Some tess tests also use the GS (tesselation.invariance), but others # don't (spirv_assembly). They don't appear to be correlated to any GPU @@ -57,8 +54,6 @@ dEQP-VK.subgroups.clustered.compute.subgroupclusteredmax_i64vec3 dEQP-VK.subgroups.clustered.graphics.subgroupclusteredmul_u64vec4 # Updated by ci-collate -bypass-dEQP-VK.renderpass2.fragment_density_map.2_views.render.non_divisible_density_size.2_samples.static_subsampled_2_2_multiviewport -dEQP-VK.renderpass2.fragment_density_map.2_views.render.divisible_density_size.2_samples.static_subsampled_1_2_multiviewport dEQP-VK.reconvergence.workgroup_uniform_control_flow_ballot.compute.nesting4.7.38 dEQP-VK.query_pool.statistics_query.host_query_reset.geometry_shader_primitives.secondary.64bits_cmdcopyquerypoolresults_triangle_list_clear_depth @@ -68,19 +63,9 @@ dEQP-GLES31.functional.image_load_store.3d.load_store.rgba8_snorm_single_layer # glcts update KHR-GL46.texture_view.view_classes -# Appeared after decreasing the fraction -dEQP-VK.renderpass2.fragment_density_map.2_views.render.non_divisible_density_size.2_samples.static_subsampled_1_2_multiviewport -dEQP-VK.renderpass2.fragment_density_map.2_views.render.divisible_density_size.2_samples.static_subsampled_2_1_multiviewport -dEQP-VK.renderpass2.fragment_density_map.2_views.render.divisible_density_size.2_samples.static_subsampled_2_2_multiviewport -bypass-dEQP-VK.renderpass2.fragment_density_map.2_views.render.divisible_density_size.2_samples.static_subsampled_2_2_multiviewportg -gmem-dEQP-VK.renderpass2.fragment_density_map.2_views.render.divisible_density_size.2_samples.static_subsampled_2_2_multiviewport -gmem-dEQP-VK.renderpass2.fragment_density_map.2_views.render.non_divisible_density_size.2_samples.static_subsampled_2_1_multiviewport - # Random flakes, unkown when they started appearing dEQP-VK.subgroups.shuffle.graphics.subgroupshufflexor_int64_t_constant dEQP-VK.subgroups.shuffle.framebuffer.subgroupshuffle_bool_tess_control -bypass-dEQP-VK.renderpass2.fragment_density_map.2_views.render.divisible_density_size.2_samples.static_subsampled_1_2_multiviewport -bypass-dEQP-VK.renderpass2.fragment_density_map.2_views.render.divisible_density_size.2_samples.static_subsampled_2_1_multiviewport # New flake with GL CTS 4.6.6.0 KHR-GL46.gpu_shader_fp64.builtin.smoothstep_dvec4 diff --git a/src/freedreno/ci/freedreno-a750-flakes.txt b/src/freedreno/ci/freedreno-a750-flakes.txt index 061a5fba1da..60236d19ec1 100644 --- a/src/freedreno/ci/freedreno-a750-flakes.txt +++ b/src/freedreno/ci/freedreno-a750-flakes.txt @@ -199,14 +199,7 @@ dEQP-VK.query_pool.occlusion_query.get_results_size_32_stride_12_with_availabili dEQP-VK.query_pool.statistics_query.fragment_shader_invocations.primary.64bits_dstoffset_cmdcopyquerypoolresults_triangle_fan_clear_depth dEQP-VK.renderpass.suballocation.multisample_resolve.layers_6.r16_sfloat.samples_4_resolve_level_2 -dEQP-VK.renderpass2.fragment_density_map.2_views.render.divisible_density_size.2_samples.static_subsampled_1_1_multiviewport -dEQP-VK.renderpass2.fragment_density_map.2_views.render.divisible_density_size.2_samples.static_subsampled_1_2_multiviewport -dEQP-VK.renderpass2.fragment_density_map.2_views.render.divisible_density_size.2_samples.static_subsampled_2_1_multiviewport -dEQP-VK.renderpass2.fragment_density_map.2_views.render.divisible_density_size.2_samples.static_subsampled_2_2_multiviewport -dEQP-VK.renderpass2.fragment_density_map.2_views.render.non_divisible_density_size.2_samples.static_subsampled_1_1_multiviewport -dEQP-VK.renderpass2.fragment_density_map.2_views.render.non_divisible_density_size.2_samples.static_subsampled_1_2_multiviewport -dEQP-VK.renderpass2.fragment_density_map.2_views.render.non_divisible_density_size.2_samples.static_subsampled_2_1_multiviewport -dEQP-VK.renderpass2.fragment_density_map.2_views.render.non_divisible_density_size.2_samples.static_subsampled_2_2_multiviewport + dEQP-VK.renderpass2.suballocation.multisample_resolve.layers_6.r8g8b8a8_snorm.samples_4_resolve_level_2 dEQP-VK.renderpass2.suballocation.multisample_resolve.r32g32b32a32_sfloat.max_attachments_8_samples_4 @@ -279,16 +272,6 @@ dEQP-VK.ubo.2_level_array.scalar.column_major_mat3.fragment dEQP-VK.ubo.3_level_array.std430.mat4x2.both_comp_access -dynamic-dEQP-VK.renderpass2.fragment_density_map.2_views.render.divisible_density_size.2_samples.static_subsampled_1_1_multiviewport -dynamic-dEQP-VK.renderpass2.fragment_density_map.2_views.render.divisible_density_size.2_samples.static_subsampled_1_2_multiviewport -dynamic-dEQP-VK.renderpass2.fragment_density_map.2_views.render.divisible_density_size.2_samples.static_subsampled_2_1_multiviewport -dynamic-dEQP-VK.renderpass2.fragment_density_map.2_views.render.divisible_density_size.2_samples.static_subsampled_2_2_multiviewport -dynamic-dEQP-VK.renderpass2.fragment_density_map.2_views.render.non_divisible_density_size.2_samples.static_subsampled_1_1_multiviewport -dynamic-dEQP-VK.renderpass2.fragment_density_map.2_views.render.non_divisible_density_size.2_samples.static_subsampled_1_2_multiviewport -dynamic-dEQP-VK.renderpass2.fragment_density_map.2_views.render.non_divisible_density_size.2_samples.static_subsampled_2_1_multiviewport -dynamic-dEQP-VK.renderpass2.fragment_density_map.2_views.render.non_divisible_density_size.2_samples.static_subsampled_2_2_multiviewport - - gmem-dEQP-VK.api.image_clearing.dedicated_allocation.clear_color_image.2d.linear.remaining_array_layers.r16g16_unorm_33x128 gmem-dEQP-VK.binding_model.descriptor_buffer.embedded_imm_samplers.graphics_geom_buffers1_samplers4 diff --git a/src/freedreno/vulkan/tu_shader.cc b/src/freedreno/vulkan/tu_shader.cc index be4f9383e81..24935e6aafe 100644 --- a/src/freedreno/vulkan/tu_shader.cc +++ b/src/freedreno/vulkan/tu_shader.cc @@ -1217,6 +1217,29 @@ tu_nir_lower_layered_fdm(nir_shader *shader, nir_metadata_control_flow, &state); } +static bool +lower_view_to_zero_filter(const nir_instr *instr, const void *cb) +{ + return instr->type == nir_instr_type_intrinsic; +} + +static nir_def * +lower_view_to_zero(nir_builder *b, nir_instr *instr, void *cb) +{ + nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr); + if (intrin->intrinsic != nir_intrinsic_load_view_index) + return NULL; + + return nir_imm_int(b, 0); +} + +static bool +tu_nir_lower_view_to_zero(nir_shader *shader) +{ + return nir_shader_lower_instructions(shader, lower_view_to_zero_filter, + lower_view_to_zero, NULL); +} + static void shared_type_info(const struct glsl_type *type, unsigned *size, unsigned *align) { @@ -2696,6 +2719,9 @@ tu_shader_create(struct tu_device *dev, tu_nir_lower_multiview(nir, key->multiview_mask, dev); } + if (!key->multiview_mask) + tu_nir_lower_view_to_zero(nir); + if (nir->info.stage == MESA_SHADER_FRAGMENT && key->force_sample_interp) { nir_foreach_shader_in_variable(var, nir) { if (!var->data.centroid)