i965/vec4: Initialize LOD to 0.0f for textureQueryLevels() and texture().
authorMatt Turner <mattst88@gmail.com>
Mon, 19 Oct 2015 17:51:42 +0000 (10:51 -0700)
committerMatt Turner <mattst88@gmail.com>
Thu, 22 Oct 2015 17:16:52 +0000 (10:16 -0700)
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.

Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp

index c39f97e3962aee511db9b2b464e6aa27232e0bc6..b8f90f2aa20c2b7cdf0e9054be1ef7fe224c6b50 100644 (file)
@@ -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;