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 <k...@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);
 
-- 
2.6.2

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

Reply via email to