nir: Don't set LOD=0 for compute shader that has derivative group
authorCaio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Fri, 5 Apr 2019 23:04:40 +0000 (16:04 -0700)
committerCaio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Tue, 9 Apr 2019 02:29:33 +0000 (19:29 -0700)
When using NV_compute_shader_derivatives to set a derivative group,
a compute shader supports texture with implicit LOD calculation, so
don't set an explicit LOD.

Note if the extension is used but the derivative group is not
specified, it will default to LOD=0 as before.

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/compiler/nir/nir_lower_tex.c

index eee1b3105d5e988fadef79618ce571a57c531ef9..54db7b761cb823fa5b5b5bc0cbbe0a1ca0111dda 100644 (file)
@@ -1111,14 +1111,18 @@ nir_lower_tex_block(nir_block *block, nir_builder *b,
          continue;
       }
 
+      bool shader_supports_implicit_lod =
+         b->shader->info.stage == MESA_SHADER_FRAGMENT ||
+         (b->shader->info.stage == MESA_SHADER_COMPUTE &&
+          b->shader->info.cs.derivative_group != DERIVATIVE_GROUP_NONE);
+
       /* TXF, TXS and TXL require a LOD but not everything we implement using those
        * three opcodes provides one.  Provide a default LOD of 0.
        */
       if ((nir_tex_instr_src_index(tex, nir_tex_src_lod) == -1) &&
           (tex->op == nir_texop_txf || tex->op == nir_texop_txs ||
            tex->op == nir_texop_txl || tex->op == nir_texop_query_levels ||
-           (tex->op == nir_texop_tex &&
-            b->shader->info.stage != MESA_SHADER_FRAGMENT))) {
+           (tex->op == nir_texop_tex && !shader_supports_implicit_lod))) {
          b->cursor = nir_before_instr(&tex->instr);
          nir_tex_instr_add_src(tex, nir_tex_src_lod, nir_src_for_ssa(nir_imm_int(b, 0)));
          progress = true;