From cf46397aecb1b020f1fd73a32bc7f748d9fa0c00 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 7 Jul 2022 12:55:05 +0200 Subject: [PATCH] aco: fix load_barycentric_at_sample without MSAA It's legal to use this instruction in a fragment shader, even if the graphics pipeline doesn't use MSAA. Fixes dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_sample.non_multisample_buffer.sample_n_*. Cc: mesa-stable Signed-off-by: Samuel Pitoiset Reviewed-by: Rhys Perry Part-of: --- .../compiler/aco_instruction_selection.cpp | 22 +++++++++++++------ .../drivers/zink/ci/zink-radv-fails.txt | 3 --- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index 442b187fc8f..790ea9aed1f 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -8120,13 +8120,22 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr) break; } case nir_intrinsic_load_barycentric_at_sample: { + Temp bary = get_interp_param(ctx, instr->intrinsic, (glsl_interp_mode)nir_intrinsic_interp_mode(instr)); + Temp dst = get_ssa_temp(ctx, &instr->dest.ssa); uint32_t sample_pos_offset = RING_PS_SAMPLE_POSITIONS * 16; - switch (ctx->options->key.ps.num_samples) { - case 2: sample_pos_offset += 1 << 3; break; - case 4: sample_pos_offset += 3 << 3; break; - case 8: sample_pos_offset += 7 << 3; break; - default: break; + if (ctx->options->key.ps.num_samples == 2) { + sample_pos_offset += 1 << 3; + } else if (ctx->options->key.ps.num_samples == 4) { + sample_pos_offset += 3 << 3; + } else if (ctx->options->key.ps.num_samples == 8) { + sample_pos_offset += 7 << 3; + } else { + assert(ctx->options->key.ps.num_samples == 0); + bld.copy(Definition(dst), bary); + emit_split_vector(ctx, dst, 2); + break; } + Temp sample_pos; Temp addr = get_ssa_temp(ctx, instr->src[0].ssa); nir_const_value* const_addr = nir_src_as_const_value(instr->src[0]); @@ -8211,8 +8220,7 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr) pos1 = bld.vop2_e64(aco_opcode::v_sub_f32, bld.def(v1), pos1, Operand::c32(0x3f000000u)); pos2 = bld.vop2_e64(aco_opcode::v_sub_f32, bld.def(v1), pos2, Operand::c32(0x3f000000u)); - Temp bary = get_interp_param(ctx, instr->intrinsic, (glsl_interp_mode)nir_intrinsic_interp_mode(instr)); - emit_interp_center(ctx, get_ssa_temp(ctx, &instr->dest.ssa), bary, pos1, pos2); + emit_interp_center(ctx, dst, bary, pos1, pos2); break; } case nir_intrinsic_load_barycentric_at_offset: { diff --git a/src/gallium/drivers/zink/ci/zink-radv-fails.txt b/src/gallium/drivers/zink/ci/zink-radv-fails.txt index 3b3b2e4fd4c..10f7d1b3962 100644 --- a/src/gallium/drivers/zink/ci/zink-radv-fails.txt +++ b/src/gallium/drivers/zink/ci/zink-radv-fails.txt @@ -26,9 +26,6 @@ dEQP-GLES31.functional.primitive_bounding_box.wide_points.tessellation_set_per_d dEQP-GLES31.functional.primitive_bounding_box.wide_points.tessellation_set_per_draw.vertex_tessellation_fragment.fbo_bbox_larger,Fail dEQP-GLES31.functional.primitive_bounding_box.wide_points.tessellation_set_per_primitive.vertex_tessellation_fragment.default_framebuffer,Fail dEQP-GLES31.functional.primitive_bounding_box.wide_points.tessellation_set_per_primitive.vertex_tessellation_fragment.fbo,Fail -dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_sample.non_multisample_buffer.sample_n_default_framebuffer,Fail -dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_sample.non_multisample_buffer.sample_n_singlesample_rbo,Fail -dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_sample.non_multisample_buffer.sample_n_singlesample_texture,Fail dEQP-GLES3.functional.clipping.line.wide_line_clip_viewport_center,Fail dEQP-GLES3.functional.clipping.line.wide_line_clip_viewport_corner,Fail dEQP-GLES3.functional.clipping.point.wide_point_clip,Fail