anv: Refactor pipeline l3 config setup
authorJason Ekstrand <jason.ekstrand@intel.com>
Mon, 22 Aug 2016 23:56:48 +0000 (16:56 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Sat, 3 Sep 2016 15:23:07 +0000 (08:23 -0700)
Now that we're using gen_l3_config.c, we no longer have one set of l3
config functions per gen and we can simplify a bit.  Also, we know that
only compute uses SLM so we don't need to look for it in all of the stages.

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
src/intel/vulkan/anv_genX.h
src/intel/vulkan/anv_pipeline.c
src/intel/vulkan/anv_private.h
src/intel/vulkan/genX_l3.c
src/intel/vulkan/genX_pipeline.c

index cf5a232c218d02a687b47feb5bbeec54c71cd080..11814dd28339df89274c8f7bc5a8831ea658f37e 100644 (file)
@@ -44,8 +44,6 @@ void genX(cmd_buffer_apply_pipe_flushes)(struct anv_cmd_buffer *cmd_buffer);
 void genX(flush_pipeline_select_3d)(struct anv_cmd_buffer *cmd_buffer);
 void genX(flush_pipeline_select_gpgpu)(struct anv_cmd_buffer *cmd_buffer);
 
-void genX(setup_pipeline_l3_config)(struct anv_pipeline *pipeline);
-
 void genX(cmd_buffer_config_l3)(struct anv_cmd_buffer *cmd_buffer,
                                 const struct anv_pipeline *pipeline);
 
index 151073eee5c66176342852ce59c5dd31a892f38d..35acc4aaef9c22d3fef44aa8772b580aa4c0c0d8 100644 (file)
@@ -28,6 +28,7 @@
 #include <fcntl.h>
 
 #include "util/mesa-sha1.h"
+#include "common/gen_l3_config.h"
 #include "anv_private.h"
 #include "brw_nir.h"
 #include "anv_nir.h"
@@ -802,29 +803,6 @@ anv_pipeline_compile_cs(struct anv_pipeline *pipeline,
    return VK_SUCCESS;
 }
 
-
-void
-anv_setup_pipeline_l3_config(struct anv_pipeline *pipeline)
-{
-   const struct gen_device_info *devinfo = &pipeline->device->info;
-   switch (devinfo->gen) {
-   case 7:
-      if (devinfo->is_haswell)
-         gen75_setup_pipeline_l3_config(pipeline);
-      else
-         gen7_setup_pipeline_l3_config(pipeline);
-      break;
-   case 8:
-      gen8_setup_pipeline_l3_config(pipeline);
-      break;
-   case 9:
-      gen9_setup_pipeline_l3_config(pipeline);
-      break;
-   default:
-      unreachable("unsupported gen\n");
-   }
-}
-
 void
 anv_compute_urb_partition(struct anv_pipeline *pipeline)
 {
@@ -1151,6 +1129,26 @@ anv_pipeline_validate_create_info(const VkGraphicsPipelineCreateInfo *info)
    }
 }
 
+/**
+ * Calculate the desired L3 partitioning based on the current state of the
+ * pipeline.  For now this simply returns the conservative defaults calculated
+ * by get_default_l3_weights(), but we could probably do better by gathering
+ * more statistics from the pipeline state (e.g. guess of expected URB usage
+ * and bound surfaces), or by using feed-back from performance counters.
+ */
+void
+anv_pipeline_setup_l3_config(struct anv_pipeline *pipeline, bool needs_slm)
+{
+   const struct gen_device_info *devinfo = &pipeline->device->info;
+
+   const struct gen_l3_weights w =
+      gen_get_default_l3_weights(devinfo, pipeline->needs_data_cache, needs_slm);
+
+   pipeline->urb.l3_config = gen_get_l3_config(devinfo, w);
+   pipeline->urb.total_size =
+      gen_get_l3_config_urb_size(devinfo, pipeline->urb.l3_config);
+}
+
 VkResult
 anv_pipeline_init(struct anv_pipeline *pipeline,
                   struct anv_device *device,
@@ -1243,7 +1241,7 @@ anv_pipeline_init(struct anv_pipeline *pipeline,
       assert(extra->disable_vs);
    }
 
-   anv_setup_pipeline_l3_config(pipeline);
+   anv_pipeline_setup_l3_config(pipeline, false);
    anv_compute_urb_partition(pipeline);
 
    const VkPipelineVertexInputStateCreateInfo *vi_info =
index 5486d92ac71821c9a005d40a437c9342c43360ee..99b3acf1a6ad18fc8c087c3ea4f4f46c4174ea53 100644 (file)
@@ -1648,7 +1648,7 @@ void
 anv_compute_urb_partition(struct anv_pipeline *pipeline);
 
 void
-anv_setup_pipeline_l3_config(struct anv_pipeline *pipeline);
+anv_pipeline_setup_l3_config(struct anv_pipeline *pipeline, bool needs_slm);
 
 /**
  * Subsurface of an anv_image.
index 9efaeb11d91a405b3f9e6a1cdb3aaafc44d6bc89..3a96693572ef8b84a327d852becb6968d1dc7340 100644 (file)
 #include "genxml/gen_macros.h"
 #include "genxml/genX_pack.h"
 
-/**
- * Calculate the desired L3 partitioning based on the current state of the
- * pipeline.  For now this simply returns the conservative defaults calculated
- * by get_default_l3_weights(), but we could probably do better by gathering
- * more statistics from the pipeline state (e.g. guess of expected URB usage
- * and bound surfaces), or by using feed-back from performance counters.
- */
-static struct gen_l3_weights
-get_pipeline_state_l3_weights(const struct anv_pipeline *pipeline)
-{
-   bool needs_dc = false, needs_slm = false;
-
-   for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
-      if (!anv_pipeline_has_stage(pipeline, i))
-         continue;
-
-      const struct brw_stage_prog_data *prog_data =
-         anv_shader_bin_get_prog_data(pipeline->shaders[i]);
-
-      needs_dc |= pipeline->needs_data_cache;
-      needs_slm |= prog_data->total_shared;
-   }
-
-   return gen_get_default_l3_weights(&pipeline->device->info,
-                                     needs_dc, needs_slm);
-}
-
 #define emit_lri(batch, reg, imm)                               \
    anv_batch_emit(batch, GENX(MI_LOAD_REGISTER_IMM), lri) {     \
       lri.RegisterOffset = __anv_reg_num(reg);                  \
@@ -207,17 +180,6 @@ setup_l3_config(struct anv_cmd_buffer *cmd_buffer/*, struct brw_context *brw*/,
 
 }
 
-void
-genX(setup_pipeline_l3_config)(struct anv_pipeline *pipeline)
-{
-   const struct gen_l3_weights w = get_pipeline_state_l3_weights(pipeline);
-   const struct gen_device_info *devinfo = &pipeline->device->info;
-
-   pipeline->urb.l3_config = gen_get_l3_config(devinfo, w);
-   pipeline->urb.total_size =
-      gen_get_l3_config_urb_size(devinfo, pipeline->urb.l3_config);
-}
-
 void
 genX(cmd_buffer_config_l3)(struct anv_cmd_buffer *cmd_buffer,
                            const struct anv_pipeline *pipeline)
index 7d8129de9e9c6892456aec09c570083201c43f2f..5a3e1ab2524a696a2a2b8cbf370be66411ec2fac 100644 (file)
@@ -85,10 +85,10 @@ genX(compute_pipeline_create)(
 
    pipeline->use_repclear = false;
 
-   anv_setup_pipeline_l3_config(pipeline);
-
    const struct brw_cs_prog_data *cs_prog_data = get_cs_prog_data(pipeline);
 
+   anv_pipeline_setup_l3_config(pipeline, cs_prog_data->base.total_shared > 0);
+
    uint32_t group_size = cs_prog_data->local_size[0] *
       cs_prog_data->local_size[1] * cs_prog_data->local_size[2];
    uint32_t remainder = group_size & (cs_prog_data->simd_size - 1);