i965: Fix variable indexing of sampler arrays under non-uniform control flow.
authorFrancisco Jerez <currojerez@riseup.net>
Thu, 19 Feb 2015 12:49:10 +0000 (14:49 +0200)
committerFrancisco Jerez <currojerez@riseup.net>
Mon, 4 May 2015 14:44:17 +0000 (17:44 +0300)
ARB_gpu_shader5 requires sampler array indexing expressions to be
dynamically uniform, this however doesn't have any implications on the
control flow that leads to the evaluation of that expression being
uniform.  Use emit_uniformize() to obtain an arbitrary live value from
the binding table index calculation instead of assuming that the first
channel is always live.

Fixes the following Piglit test cases:
  arb_gpu_shader5/execution/sampler_array_indexing/fs-nonuniform-control-flow.shader_test
  arb_gpu_shader5/execution/sampler_array_indexing/vs-nonuniform-control-flow.shader_test

part of the series:
  http://lists.freedesktop.org/archives/piglit/2015-February/014615.html

Reviewed-by: Matt Turner <mattst88@gmail.com>
src/mesa/drivers/dri/i965/brw_fs_nir.cpp
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp

index 4c968f050f29eb339740afbbe08a88b31dadcbfd..555987d74d5de854e07aad9a89020ee56fc77df1 100644 (file)
@@ -1707,8 +1707,8 @@ fs_visitor::nir_emit_texture(nir_tex_instr *instr)
 
          /* Emit code to evaluate the actual indexing expression */
          sampler_reg = vgrf(glsl_type::uint_type);
-         emit(ADD(sampler_reg, src, fs_reg(sampler)))
-             ->force_writemask_all = true;
+         emit(ADD(sampler_reg, src, fs_reg(sampler)));
+         emit_uniformize(sampler_reg, sampler_reg);
          break;
       }
 
index 2128795c7ddc2c7942e6109281abee4a658f331f..c080e9bc94e4ba89522676b2f888e7e49bbc067f 100644 (file)
@@ -2317,8 +2317,9 @@ fs_visitor::visit(ir_texture *ir)
       /* Emit code to evaluate the actual indexing expression */
       nonconst_sampler_index->accept(this);
       fs_reg temp = vgrf(glsl_type::uint_type);
-      emit(ADD(temp, this->result, fs_reg(sampler)))
-            ->force_writemask_all = true;
+      emit(ADD(temp, this->result, fs_reg(sampler)));
+      emit_uniformize(temp, temp);
+
       sampler_reg = temp;
    } else {
       /* Single sampler, or constant array index; the indexing expression
index f0416be3d536b21dffe7ee62fb0872a205e101fc..203ac464f1be56475e06b387585eb8846cb938e5 100644 (file)
@@ -2518,8 +2518,9 @@ vec4_visitor::visit(ir_texture *ir)
       /* Emit code to evaluate the actual indexing expression */
       nonconst_sampler_index->accept(this);
       dst_reg temp(this, glsl_type::uint_type);
-      emit(ADD(temp, this->result, src_reg(sampler)))
-         ->force_writemask_all = true;
+      emit(ADD(temp, this->result, src_reg(sampler)));
+      emit_uniformize(temp, src_reg(temp));
+
       sampler_reg = src_reg(temp);
    } else {
       /* Single sampler, or constant array index; the indexing expression