From 0cd9f0c3d36066c5188aade37f728067b863990b Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Fri, 9 Jun 2023 01:05:34 +0300 Subject: [PATCH] intel/fs: fix bindless/shared surface mistake Signed-off-by: Lionel Landwerlin Fixes: 068bf1378d ("intel/fs: enable SSBO accesses through the bindless heap") Tested-by: Karol Herbst Reviewed-by: Kenneth Graunke Part-of: --- src/intel/compiler/brw_fs.h | 3 ++- src/intel/compiler/brw_fs_nir.cpp | 11 +++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/intel/compiler/brw_fs.h b/src/intel/compiler/brw_fs.h index a37452308e5..1ef41b4a09a 100644 --- a/src/intel/compiler/brw_fs.h +++ b/src/intel/compiler/brw_fs.h @@ -373,7 +373,8 @@ public: nir_intrinsic_instr *instr); void nir_emit_surface_atomic(const brw::fs_builder &bld, nir_intrinsic_instr *instr, - fs_reg surface); + fs_reg surface, + bool bindless_surface); void nir_emit_global_atomic(const brw::fs_builder &bld, nir_intrinsic_instr *instr); void nir_emit_texture(const brw::fs_builder &bld, diff --git a/src/intel/compiler/brw_fs_nir.cpp b/src/intel/compiler/brw_fs_nir.cpp index 3d4053d0d9a..12590a04d1f 100644 --- a/src/intel/compiler/brw_fs_nir.cpp +++ b/src/intel/compiler/brw_fs_nir.cpp @@ -3730,7 +3730,8 @@ fs_visitor::nir_emit_cs_intrinsic(const fs_builder &bld, case nir_intrinsic_shared_atomic: case nir_intrinsic_shared_atomic_swap: - nir_emit_surface_atomic(bld, instr, brw_imm_ud(GFX7_BTI_SLM)); + nir_emit_surface_atomic(bld, instr, brw_imm_ud(GFX7_BTI_SLM), + false /* bindless */); break; case nir_intrinsic_load_shared: { @@ -5230,7 +5231,8 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr case nir_intrinsic_ssbo_atomic: case nir_intrinsic_ssbo_atomic_swap: nir_emit_surface_atomic(bld, instr, - get_nir_buffer_intrinsic_index(bld, instr)); + get_nir_buffer_intrinsic_index(bld, instr), + get_nir_src_bindless(instr->src[0])); break; case nir_intrinsic_get_ssbo_size: { @@ -6146,7 +6148,8 @@ expand_to_32bit(const fs_builder &bld, const fs_reg &src) void fs_visitor::nir_emit_surface_atomic(const fs_builder &bld, nir_intrinsic_instr *instr, - fs_reg surface) + fs_reg surface, + bool bindless) { enum lsc_opcode op = lsc_aop_for_nir_intrinsic(instr); int num_data = lsc_op_num_data_values(op); @@ -6168,7 +6171,7 @@ fs_visitor::nir_emit_surface_atomic(const fs_builder &bld, fs_reg dest = get_nir_dest(instr->dest); fs_reg srcs[SURFACE_LOGICAL_NUM_SRCS]; - srcs[get_nir_src_bindless(instr->src[0]) ? + srcs[bindless ? SURFACE_LOGICAL_SRC_SURFACE_HANDLE : SURFACE_LOGICAL_SRC_SURFACE] = surface; srcs[SURFACE_LOGICAL_SRC_IMM_DIMS] = brw_imm_ud(1);