diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c index b419f0e2c13..e1f4d29e9c1 100644 --- a/src/gallium/drivers/r600/r600_shader.c +++ b/src/gallium/drivers/r600/r600_shader.c @@ -240,6 +240,7 @@ int r600_pipe_shader_create(struct pipe_context *ctx, use_sb &= !shader->shader.uses_atomics; use_sb &= !shader->shader.uses_images; use_sb &= !shader->shader.uses_helper_invocation; + use_sb &= !shader->shader.disable_sb; /* SB can't handle READ_SCRATCH properly */ use_sb &= !(shader->shader.needs_scratch_space && rscreen->b.gfx_level < R700); diff --git a/src/gallium/drivers/r600/r600_shader.h b/src/gallium/drivers/r600/r600_shader.h index 39afb6fdd14..e5940ad6843 100644 --- a/src/gallium/drivers/r600/r600_shader.h +++ b/src/gallium/drivers/r600/r600_shader.h @@ -125,6 +125,7 @@ struct r600_shader { uint8_t atomic_base; uint8_t rat_base; uint8_t image_size_const_offset; + boolean disable_sb; }; union r600_shader_key { diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp b/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp index cad91d5c5eb..9ae54e19682 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp @@ -2643,6 +2643,8 @@ emit_dot(const nir_alu_instr& alu, int n, Shader& shader) ir->set_alu_flag(alu_dst_clamp); shader.emit_instruction(ir); + shader.set_flag(Shader::sh_disble_sb); + return true; } diff --git a/src/gallium/drivers/r600/sfn/sfn_shader.cpp b/src/gallium/drivers/r600/sfn/sfn_shader.cpp index 848616e4a55..9f13c3580c1 100644 --- a/src/gallium/drivers/r600/sfn/sfn_shader.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_shader.cpp @@ -1567,6 +1567,7 @@ Shader::get_shader_info(r600_shader *sh_info) sh_info->needs_scratch_space = m_flags.test(sh_needs_scratch_space); sh_info->uses_images = m_flags.test(sh_uses_images); sh_info->uses_atomics = m_flags.test(sh_uses_atomics); + sh_info->disable_sb = m_flags.test(sh_disble_sb); sh_info->has_txq_cube_array_z_comp = m_flags.test(sh_txs_cube_array_comp); sh_info->indirect_files = m_indirect_files; do_get_shader_info(sh_info); diff --git a/src/gallium/drivers/r600/sfn/sfn_shader.h b/src/gallium/drivers/r600/sfn/sfn_shader.h index 16343806096..1204291e122 100644 --- a/src/gallium/drivers/r600/sfn/sfn_shader.h +++ b/src/gallium/drivers/r600/sfn/sfn_shader.h @@ -227,6 +227,7 @@ public: sh_indirect_atomic, sh_mem_barrier, sh_legacy_math_rules, + sh_disble_sb, sh_flags_count };