Mesa (master): i965/fs: Avoid scalar destinations in emit_uniformize()

Kristian Høgsberg krh at kemper.freedesktop.org
Fri Oct 23 16:44:03 UTC 2015


Module: Mesa
Branch: master
Commit: 0a5a738252afdd64b778024bcd130473b9a6224e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=0a5a738252afdd64b778024bcd130473b9a6224e

Author: Kristian Høgsberg Kristensen <krh at bitplanet.net>
Date:   Tue Oct 20 23:31:49 2015 -0700

i965/fs: Avoid scalar destinations in emit_uniformize()

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 at riseup.net>
Signed-off-by: Kristian Høgsberg Kristensen <krh at bitplanet.net>

---

 src/mesa/drivers/dri/i965/brw_fs_builder.h |   15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs_builder.h b/src/mesa/drivers/dri/i965/brw_fs_builder.h
index df10a9d..f121f34 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_builder.h
+++ b/src/mesa/drivers/dri/i965/brw_fs_builder.h
@@ -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));
       }
 
       /**




More information about the mesa-commit mailing list