[Mesa-dev] [PATCH 2/9] i965/vec4: Initialize LOD to 0.0f.

Iago Toral itoral at igalia.com
Tue Oct 20 01:19:24 PDT 2015


On Mon, 2015-10-19 at 23:11 -0700, Matt Turner wrote:
> On Mon, Oct 19, 2015 at 9:09 PM, Matt Turner <mattst88 at gmail.com> wrote:
> > We implement textureQueryLevels (which takes no arguments, save the
> > sampler) using the resinfo message (which takes an argument of LOD).
> > Without initializing it, we'd generate a MOV from the null register to
> > load the LOD argument.
> > ---
> >  src/mesa/drivers/dri/i965/brw_vec4_nir.cpp | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp b/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
> > index ea1e3e7..c942c80 100644
> > --- a/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
> > +++ b/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
> > @@ -1579,7 +1579,7 @@ vec4_visitor::nir_emit_texture(nir_tex_instr *instr)
> >     const glsl_type *coord_type = NULL;
> >     src_reg shadow_comparitor;
> >     src_reg offset_value;
> > -   src_reg lod, lod2;
> > +   src_reg lod(0.0f), lod2;
> >     src_reg sample_index;
> >     src_reg mcs;
> 
> The fs backend handles this differently --
> 
>    if (op == ir_query_levels) {
>       /* textureQueryLevels() is implemented in terms of TXS so we need to
>        * pass a valid LOD argument.
>        */
>       assert(lod.file == BAD_FILE);
>       lod = fs_reg(0u);
>    }
> 
> That kinda seems worse -- but it does indicate that I should probably
> initialize lod with 0u instead, though it doesn't seem to matter...


I don't care much either way, the good thing about the code in the fs
backend is that it makes things more explicit. I think I kind of like
that a bit better but works for me either way. Whatever we do, we should
probably use the same solution in both backends though.

> mov(8)          g10<1>F         [0F, 0F, 0F, 0F]VF
> send(8)         g3<1>UW         g10<8,8,1>F
>                  sampler resinfo SIMD8 Surface = 1 Sampler = 0 mlen 1 rlen 4
> 
> Opinions?

isn't LOD a float value by definition? Also, there are other parts of
the FS code that initialize it to 0.0, like this (from
lower_sampler_logical_send_gen7):

   if (bld.shader->stage != MESA_SHADER_FRAGMENT &&
       op == SHADER_OPCODE_TEX) {
      op = SHADER_OPCODE_TXL;
      lod = fs_reg(0.0f);
   }

In any case, in that same function we do:

   for (unsigned i = 0; i < ARRAY_SIZE(sources); i++)
      sources[i] = bld.vgrf(BRW_REGISTER_TYPE_F);

and then later we do:

bld.MOV(sources[length], lod)

so even if we initialize lod to 0u it is going to end up as a float,
which explains the result you obtained, so I think float is probably
what we want.

Iago

> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev




More information about the mesa-dev mailing list