i965/blorp: Prepare for more than two vertex attributes
authorTopi Pohjolainen <topi.pohjolainen@intel.com>
Wed, 18 May 2016 16:25:33 +0000 (19:25 +0300)
committerTopi Pohjolainen <topi.pohjolainen@intel.com>
Mon, 4 Jul 2016 06:05:02 +0000 (09:05 +0300)
Signed-off-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/mesa/drivers/dri/i965/brw_blorp.h
src/mesa/drivers/dri/i965/gen6_blorp.c
src/mesa/drivers/dri/i965/gen7_blorp.c
src/mesa/drivers/dri/i965/gen8_blorp.c

index c84217006a9c51c03019de1062cc44dce7bf446e..751e082ccc5524fb5bc8bf22cc8a0be966d784be 100644 (file)
@@ -240,6 +240,19 @@ struct brw_blorp_prog_data
    uint8_t param[BRW_BLORP_NUM_PUSH_CONSTANT_DWORDS];
 };
 
+inline unsigned
+brw_blorp_get_urb_length(const struct brw_blorp_prog_data *prog_data)
+{
+   if (prog_data == NULL)
+      return 1;
+
+   /* From the BSpec: 3D Pipeline - Strips and Fans - 3DSTATE_SBE 
+    *
+    * read_length = ceiling((max_source_attr+1)/2)
+    */
+   return MAX2((prog_data->num_varying_inputs + 1) / 2, 1);
+}
+
 struct brw_blorp_params
 {
    uint32_t x0;
index 2f26fa1a51f0b1d9cf71205c8dfb863b6c3dc1cd..8b6b8f92cc3fcbba339299f750c107aeac7a1c2b 100644 (file)
@@ -649,11 +649,13 @@ gen6_blorp_emit_sf_config(struct brw_context *brw,
 {
    const unsigned num_varyings =
       params->wm_prog_data ? params->wm_prog_data->num_varying_inputs : 0;
+   const unsigned urb_read_length =
+      brw_blorp_get_urb_length(params->wm_prog_data);
 
    BEGIN_BATCH(20);
    OUT_BATCH(_3DSTATE_SF << 16 | (20 - 2));
    OUT_BATCH(num_varyings << GEN6_SF_NUM_OUTPUTS_SHIFT |
-             1 << GEN6_SF_URB_ENTRY_READ_LENGTH_SHIFT |
+             urb_read_length << GEN6_SF_URB_ENTRY_READ_LENGTH_SHIFT |
              BRW_SF_URB_ENTRY_READ_OFFSET <<
                 GEN6_SF_URB_ENTRY_READ_OFFSET_SHIFT);
    OUT_BATCH(0); /* dw2 */
index e4cae1f6ca10d2132cabeca403cda9a2aba5928c..42157754d9661d63211839c90cbeee6e9cbfcc96 100644 (file)
@@ -445,6 +445,8 @@ gen7_blorp_emit_sf_config(struct brw_context *brw,
    {
       const unsigned num_varyings =
          params->wm_prog_data ? params->wm_prog_data->num_varying_inputs : 0;
+      const unsigned urb_read_length =
+         brw_blorp_get_urb_length(params->wm_prog_data);
 
       BEGIN_BATCH(14);
       OUT_BATCH(_3DSTATE_SBE << 16 | (14 - 2));
@@ -457,7 +459,7 @@ gen7_blorp_emit_sf_config(struct brw_context *brw,
        * than one vec4 worth of vertex attributes are needed.
        */
       OUT_BATCH(num_varyings << GEN7_SBE_NUM_OUTPUTS_SHIFT |
-                1 << GEN7_SBE_URB_ENTRY_READ_LENGTH_SHIFT |
+                urb_read_length << GEN7_SBE_URB_ENTRY_READ_LENGTH_SHIFT |
                 BRW_SF_URB_ENTRY_READ_OFFSET <<
                    GEN7_SBE_URB_ENTRY_READ_OFFSET_SHIFT);
       for (int i = 0; i < 9; ++i)
index 13dda928575fef29bad3690a4d081fb5986c31a8..553c6373153af3420a460d828acbb1d42a2f1d38 100644 (file)
@@ -295,6 +295,8 @@ gen8_blorp_emit_sbe_state(struct brw_context *brw,
                           const struct brw_blorp_params *params)
 {
    const unsigned num_varyings = params->wm_prog_data->num_varying_inputs;
+   const unsigned urb_read_length =
+      brw_blorp_get_urb_length(params->wm_prog_data);
 
    /* 3DSTATE_SBE */
    {
@@ -310,7 +312,7 @@ gen8_blorp_emit_sbe_state(struct brw_context *brw,
        * than one vec4 worth of vertex attributes are needed.
        */
       OUT_BATCH(num_varyings << GEN7_SBE_NUM_OUTPUTS_SHIFT |
-                1 << GEN7_SBE_URB_ENTRY_READ_LENGTH_SHIFT |
+                urb_read_length << GEN7_SBE_URB_ENTRY_READ_LENGTH_SHIFT |
                 BRW_SF_URB_ENTRY_READ_OFFSET <<
                    GEN8_SBE_URB_ENTRY_READ_OFFSET_SHIFT |
                 GEN8_SBE_FORCE_URB_ENTRY_READ_LENGTH |