It doesn't matter if the opcode supplies a lod. The only thing that matters is if the opcode computes derivatives. It seems that the only opcodes computing derivatives are tex, tex_bias, and query_lod. This only applies to fragment shaders. Other stages never compute derivatives. There is an NV extension that enables derivatives in compute shaders.
Marek On Thu, May 30, 2019, 2:47 PM Rhys Perry <pendingchao...@gmail.com> wrote: > Seems txf can(should?) have a lod supplied. txf_ms and tg4 always use > the 0th level. > > I'll add txf, txf_ms and tg4 to the list of nir_texop which don't ever > have implicit derivatives. > > On Thu, 30 May 2019 at 19:43, Ilia Mirkin <imir...@alum.mit.edu> wrote: > > > > txf supplies an lod, but tg4's is implicitly always 0. > > > > On Thu, May 30, 2019 at 2:26 PM Bas Nieuwenhuizen > > <b...@basnieuwenhuizen.nl> wrote: > > > > > > On Thu, May 30, 2019 at 6:50 PM Rhys Perry <pendingchao...@gmail.com> > wrote: > > > > > > > > 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; > > > > +} > > > > > > txf, tg4 and friends do not provide any of lod/ddx/ddy do they? > > > > > > > + > > > > 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 > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev