[Mesa-dev] [PATCH] i965/vec4: Initialize LOD to 0.0f for textureQueryLevels() and texture().

Iago Toral itoral at igalia.com
Wed Oct 21 23:54:18 PDT 2015


Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>

On Wed, 2015-10-21 at 12:30 -0700, Matt Turner 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.
> 
> Essentially the same logic applies to texture. A vertex shader cannot
> compute derivatives and so cannot produce an LOD, so TXL with an LOD of
> 0.0 is used.
> ---
>  src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> index c39f97e..b8f90f2 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> @@ -882,6 +882,18 @@ vec4_visitor::emit_texture(ir_texture_opcode op,
>                             uint32_t sampler,
>                             src_reg sampler_reg)
>  {
> +   /* The sampler can only meaningfully compute LOD for fragment shader
> +    * messages. For all other stages, we change the opcode to TXL and hardcode
> +    * the LOD to 0.
> +    *
> +    * textureQueryLevels() is implemented in terms of TXS so we need to pass a
> +    * valid LOD argument.
> +    */
> +   if (op == ir_tex || op == ir_query_levels) {
> +      assert(lod.file == BAD_FILE);
> +      lod = src_reg(0.0f);
> +   }
> +
>     enum opcode opcode;
>     switch (op) {
>     case ir_tex: opcode = SHADER_OPCODE_TXL; break;




More information about the mesa-dev mailing list