i965/fs: Change brw_wm_prog_data::urb_read_length to num_varying_inputs.
authorPaul Berry <stereotype441@gmail.com>
Tue, 3 Sep 2013 00:35:32 +0000 (17:35 -0700)
committerPaul Berry <stereotype441@gmail.com>
Mon, 16 Sep 2013 19:53:14 +0000 (12:53 -0700)
On gen4-5, the FS stage reads varying inputs from URB entries that
were output by the SF thread, where each register stores the
interpolation setup for two components of a vec4, therefore the FS
urb_read_length is twice the number of FS input varyings.  On gen6+,
varying inputs are directly deposited in the FS payload by the SF/SBE
fixed function logic, so urb_read_length is irrelevant.

However, in future patches, it will be nice to be able to consult
brw_wm_prog_data to determine how many varying inputs the FS expects
(rather than inferring it from gl_program::InputsRead).  So instead of
storing urb_read_length, we simply store num_varying_inputs in
brw_wm_prog_data.  On gen4-5, we multiply this by 2 to recover the URB
read length.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_context.h
src/mesa/drivers/dri/i965/brw_fs.cpp
src/mesa/drivers/dri/i965/brw_wm_state.c

index 988e9fbf656d95a52b1e57770ab0beedbde969a7..b9c9f505fe067a859000085317f0010dafa1ff59 100644 (file)
@@ -314,7 +314,7 @@ struct brw_shader {
  */
 struct brw_wm_prog_data {
    GLuint curb_read_length;
-   GLuint urb_read_length;
+   GLuint num_varying_inputs;
 
    GLuint first_curbe_grf;
    GLuint first_curbe_grf_16;
index e788196aeb9400477ffc43899a5cf3c75b7b1906..29676658e640a2a97784c3db56e39c52c183f90c 100644 (file)
@@ -1272,8 +1272,7 @@ fs_visitor::calculate_urb_setup()
          c->prog_data.urb_setup[VARYING_SLOT_PNTC] = urb_next++;
    }
 
-   /* Each attribute is 4 setup channels, each of which is half a reg. */
-   c->prog_data.urb_read_length = urb_next * 2;
+   c->prog_data.num_varying_inputs = urb_next;
 }
 
 void
@@ -1298,7 +1297,9 @@ fs_visitor::assign_urb_setup()
       }
    }
 
-   this->first_non_payload_grf = urb_start + c->prog_data.urb_read_length;
+   /* Each attribute is 4 setup channels, each of which is half a reg. */
+   this->first_non_payload_grf =
+      urb_start + c->prog_data.num_varying_inputs * 2;
 }
 
 /**
index c98ebe75573b57e97cb9882de2fefa6bc99ca718..9aa32c08ec98dd6c0ca1abc8e1920e2a2332268b 100644 (file)
@@ -133,7 +133,8 @@ brw_upload_wm_unit(struct brw_context *brw)
    }
 
    wm->thread3.dispatch_grf_start_reg = brw->wm.prog_data->first_curbe_grf;
-   wm->thread3.urb_entry_read_length = brw->wm.prog_data->urb_read_length;
+   wm->thread3.urb_entry_read_length =
+      brw->wm.prog_data->num_varying_inputs * 2;
    wm->thread3.urb_entry_read_offset = 0;
    wm->thread3.const_urb_entry_read_length =
       brw->wm.prog_data->curb_read_length;