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