iris: Skip allocating a null surface when there are 0 color regions.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 27 Aug 2019 18:32:24 +0000 (11:32 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 17 Sep 2019 21:27:51 +0000 (14:27 -0700)
The compiler now sets the "Null Render Target" bit in the RT write
extended message descriptor, causing it to write to an implicit null
surface without us needing to set one up in the binding table.

Together with the last patch, this improves performance in Car Chase on
an Icelake 8x8 (locked to 700Mhz) by 0.0445526% +/- 0.0132736% (n=832).

Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
src/gallium/drivers/iris/iris_program.c
src/gallium/drivers/iris/iris_state.c

index 9eb7a47e1f15d4c7e748b2cd5ff5bb567bb5bbf7..50ea72ab9ecf0ae0f2c60b09cc2609dd1f5b0ac8 100644 (file)
@@ -1522,8 +1522,15 @@ iris_compile_fs(struct iris_context *ice,
     */
    brw_nir_lower_fs_outputs(nir);
 
+   /* On Gen11+, shader RT write messages have a "Null Render Target" bit
+    * and do not need a binding table entry with a null surface.  Earlier
+    * generations need an entry for a null surface.
+    */
+   int null_rts = devinfo->gen < 11 ? 1 : 0;
+
    struct iris_binding_table bt;
-   iris_setup_binding_table(devinfo, nir, &bt, MAX2(key->nr_color_regions, 1),
+   iris_setup_binding_table(devinfo, nir, &bt,
+                            MAX2(key->nr_color_regions, null_rts),
                             num_system_values, num_cbufs);
 
    brw_nir_analyze_ubo_ranges(compiler, nir, NULL, prog_data->ubo_ranges);
index 3fca191937d56ab8c3236256834a1ccf0e4fde68..d45b1736af308dcb87d7e805a998e8a1733b233b 100644 (file)
@@ -4337,7 +4337,7 @@ iris_populate_binding_table(struct iris_context *ice,
             }
             push_bt_entry(addr);
          }
-      } else {
+      } else if (GEN_GEN < 11) {
          uint32_t addr = use_null_fb_surface(batch, ice);
          push_bt_entry(addr);
       }