i965: Write gl_FragCoord directly to the destination.
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 14 Jul 2016 23:52:10 +0000 (16:52 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 18 Jul 2016 02:26:53 +0000 (19:26 -0700)
This patch makes emit_general_interpolation take a destination register
as an argument, and write directly to that.  This is simpler than the
old approach of ralloc'ing a register, writing to that temporary, and
then making the caller emit per-component MOVs to copy it to the actual
destination.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
src/mesa/drivers/dri/i965/brw_fs.cpp
src/mesa/drivers/dri/i965/brw_fs.h
src/mesa/drivers/dri/i965/brw_fs_nir.cpp

index 940f425b98ec9b99fa830bdb08463c857731997e..7316247dbd21fb70df43646e03acaacbee023058 100644 (file)
@@ -1039,12 +1039,10 @@ fs_visitor::import_uniforms(fs_visitor *v)
    this->uniforms = v->uniforms;
 }
 
-fs_reg *
-fs_visitor::emit_fragcoord_interpolation()
+void
+fs_visitor::emit_fragcoord_interpolation(fs_reg wpos)
 {
    assert(stage == MESA_SHADER_FRAGMENT);
-   fs_reg *reg = new(this->mem_ctx) fs_reg(vgrf(glsl_type::vec4_type));
-   fs_reg wpos = *reg;
 
    /* gl_FragCoord.x */
    bld.MOV(wpos, this->pixel_x);
@@ -1066,8 +1064,6 @@ fs_visitor::emit_fragcoord_interpolation()
 
    /* gl_FragCoord.w: Already set up in emit_interpolation */
    bld.MOV(wpos, this->wpos_w);
-
-   return reg;
 }
 
 static enum brw_barycentric_mode
index 29c13cd802875136046e99162a70431b39f52c64..7998f5141550d0f21765e9853a3520248bf39f00 100644 (file)
@@ -169,7 +169,7 @@ public:
 
    void emit_dummy_fs();
    void emit_repclear_shader();
-   fs_reg *emit_fragcoord_interpolation();
+   void emit_fragcoord_interpolation(fs_reg wpos);
    fs_reg *emit_frontfacing_interpolation();
    fs_reg *emit_samplepos_setup();
    fs_reg *emit_sampleid_setup();
index ccf0d093f5bd83d530a90e33f4782313e3959277..898f23ae746f65402446560ba254621e451a5e00 100644 (file)
@@ -62,9 +62,7 @@ fs_visitor::nir_setup_inputs()
 
       fs_reg reg;
       if (var->data.location == VARYING_SLOT_POS) {
-         reg = *emit_fragcoord_interpolation();
-         emit_percomp(bld, fs_inst(BRW_OPCODE_MOV, bld.dispatch_width(),
-                                   input, reg), 0xF);
+         emit_fragcoord_interpolation(input);
       } else if (var->data.location == VARYING_SLOT_LAYER) {
          struct brw_reg reg = suboffset(interp_reg(VARYING_SLOT_LAYER, 1), 3);
          reg.type = BRW_REGISTER_TYPE_D;