Otherwise LLVM can sink them and their texture coordinate calculations into divergent branches.
Cc: <mesa-sta...@lists.freedesktop.org> Signed-off-by: Rhys Perry <pendingchao...@gmail.com> --- src/amd/common/ac_nir_to_llvm.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index 265e3b636c4..d2dc617de36 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -1316,6 +1316,30 @@ static nir_deref_instr *get_tex_texture_deref(const nir_tex_instr *instr) return texture_deref_instr; } +static bool has_implicit_derivatives(const nir_tex_instr *instr) +{ + switch (instr->op) { + case nir_texop_txs: + case nir_texop_query_levels: + case nir_texop_texture_samples: + case nir_texop_samples_identical: + return false; + default: + break; + } + for (unsigned i = 0; i < instr->num_srcs; i++) { + switch (instr->src[i].src_type) { + case nir_tex_src_lod: + case nir_tex_src_ddx: + case nir_tex_src_ddy: + return false; + default: + break; + } + } + return true; +} + static LLVMValueRef build_tex_intrinsic(struct ac_nir_context *ctx, const nir_tex_instr *instr, struct ac_image_args *args) @@ -1394,6 +1418,11 @@ static LLVMValueRef build_tex_intrinsic(struct ac_nir_context *ctx, } args->attributes = AC_FUNC_ATTR_READNONE; + /* Prevent texture instructions with implicit derivatives from being + * sinked into branches. */ + if (has_implicit_derivatives(instr)) + args->attributes |= AC_FUNC_ATTR_CONVERGENT; + return ac_build_image_opcode(&ctx->ac, args); } -- 2.21.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev