i965/fs: Avoid scalar destinations in emit_uniformize()
authorKristian Høgsberg Kristensen <krh@bitplanet.net>
Wed, 21 Oct 2015 06:31:49 +0000 (23:31 -0700)
committerKristian Høgsberg Kristensen <krh@bitplanet.net>
Fri, 23 Oct 2015 16:42:28 +0000 (09:42 -0700)
The scalar destination registers break copy propagation. Instead compute
the results to a regular register and then reference a component when we
later use the result as a source.

Reviewed-by: Francisco Jerez <currojerez@riseup.net>
Signed-off-by: Kristian Høgsberg Kristensen <krh@bitplanet.net>
src/mesa/drivers/dri/i965/brw_fs_builder.h

index df10a9d..f121f34 100644 (file)
@@ -390,14 +390,21 @@ namespace brw {
       src_reg
       emit_uniformize(const src_reg &src) const
       {
+         /* FIXME: We use a vector chan_index and dst to allow constant and
+          * copy propagration to move result all the way into the consuming
+          * instruction (typically a surface index or sampler index for a
+          * send). This uses 1 or 3 extra hw registers in 16 or 32 wide
+          * dispatch. Once we teach const/copy propagation about scalars we
+          * should go back to scalar destinations here.
+          */
          const fs_builder ubld = exec_all();
-         const dst_reg chan_index = component(vgrf(BRW_REGISTER_TYPE_UD), 0);
-         const dst_reg dst = component(vgrf(src.type), 0);
+         const dst_reg chan_index = vgrf(BRW_REGISTER_TYPE_UD);
+         const dst_reg dst = vgrf(src.type);
 
          ubld.emit(SHADER_OPCODE_FIND_LIVE_CHANNEL, chan_index);
-         ubld.emit(SHADER_OPCODE_BROADCAST, dst, src, chan_index);
+         ubld.emit(SHADER_OPCODE_BROADCAST, dst, src, component(chan_index, 0));
 
-         return src_reg(dst);
+         return src_reg(component(dst, 0));
       }
 
       /**