[Mesa-dev] [PATCH 2/3] i965/fs: Make emit_uniformize a no-op for immediates

Kristian Høgsberg Kristensen krh at bitplanet.net
Sun Oct 18 21:31:43 PDT 2015

An immdiate is already uniform so just return it up front. Without this,
brw_fs_surface_builder ends up passing immediate surface indices through
SHADER_OPCODE_BROADCAST. This writes to a stride 0 dst, which we can't
constant propagate out of, and further, we don't constant propagate into
the typed/untype read/write opcodes at all.  The end result is that all
typed/untyped read/write/atomics end up as indirect sends.

Code generation should always produce either an immediate or an actual
indirect surface index, so we can fix this by just special casing
immediates in emit_uniformize.

Signed-off-by: Kristian Høgsberg Kristensen <krh at bitplanet.net>
 src/mesa/drivers/dri/i965/brw_fs_builder.h | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/mesa/drivers/dri/i965/brw_fs_builder.h b/src/mesa/drivers/dri/i965/brw_fs_builder.h
index df10a9d..98ce71e 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_builder.h
+++ b/src/mesa/drivers/dri/i965/brw_fs_builder.h
@@ -394,6 +394,9 @@ namespace brw {
          const dst_reg chan_index = component(vgrf(BRW_REGISTER_TYPE_UD), 0);
          const dst_reg dst = component(vgrf(src.type), 0);
+         if (src.file == IMM)
+            return src;
          ubld.emit(SHADER_OPCODE_FIND_LIVE_CHANNEL, chan_index);
          ubld.emit(SHADER_OPCODE_BROADCAST, dst, src, chan_index);

More information about the mesa-dev mailing list