Reviewed-by: Lionel Landwerlin <lionel.g.landwer...@intel.com>

On 16/03/17 21:34, Jason Ekstrand wrote:
In order to get accurate statistics, we need to disable statistics for
blits, clears, and the surface state memcpy at the top of each secondary
command buffer.  There are two possible approaches to this:

  1) Disable before the blit/memcpy and re-enable afterwards

  2) Move emitting 3DSTATE_VF_STATISTICS from initialization and make it
     part of pipeline state and then just disabale statistics before
     blits and memcpy operations.

Emitting 3DSTATE_VF_STATISTICS should be fairly cheap so it doesn't
really matter which path we take.  We choose the second option as it's
more consistent with the way the rest of the statistics are enabled and
disabled.
---
  src/intel/vulkan/genX_blorp_exec.c | 5 +++++
  src/intel/vulkan/genX_gpu_memcpy.c | 4 ++++
  src/intel/vulkan/genX_pipeline.c   | 9 +++++++++
  src/intel/vulkan/genX_state.c      | 3 ---
  4 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/src/intel/vulkan/genX_blorp_exec.c 
b/src/intel/vulkan/genX_blorp_exec.c
index c1499fb..74c2679 100644
--- a/src/intel/vulkan/genX_blorp_exec.c
+++ b/src/intel/vulkan/genX_blorp_exec.c
@@ -169,6 +169,11 @@ genX(blorp_exec)(struct blorp_batch *batch,
      */
     genX(cmd_buffer_enable_pma_fix)(cmd_buffer, false);
+ /* Disable VF statistics */
+   blorp_emit(batch, GENX(3DSTATE_VF_STATISTICS), vf) {
+      vf.StatisticsEnable = false;
+   }
+
     blorp_exec(batch, params);
cmd_buffer->state.vb_dirty = ~0;
diff --git a/src/intel/vulkan/genX_gpu_memcpy.c 
b/src/intel/vulkan/genX_gpu_memcpy.c
index eb11c2f..3cbc723 100644
--- a/src/intel/vulkan/genX_gpu_memcpy.c
+++ b/src/intel/vulkan/genX_gpu_memcpy.c
@@ -218,6 +218,10 @@ genX(cmd_buffer_gpu_memcpy)(struct anv_cmd_buffer 
*cmd_buffer,
     }
  #endif
+ anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_VF_STATISTICS), vf) {
+      vf.StatisticsEnable = false;
+   }
+
     anv_batch_emit(&cmd_buffer->batch, GENX(3DPRIMITIVE), prim) {
        prim.VertexAccessType         = SEQUENTIAL;
        prim.PrimitiveTopologyType    = _3DPRIM_POINTLIST;
diff --git a/src/intel/vulkan/genX_pipeline.c b/src/intel/vulkan/genX_pipeline.c
index bb3e203..5e6e609 100644
--- a/src/intel/vulkan/genX_pipeline.c
+++ b/src/intel/vulkan/genX_pipeline.c
@@ -1564,6 +1564,14 @@ emit_3dstate_vf_topology(struct anv_pipeline *pipeline)
  #endif
static void
+emit_3dstate_vf_statistics(struct anv_pipeline *pipeline)
+{
+   anv_batch_emit(&pipeline->batch, GENX(3DSTATE_VF_STATISTICS), vfs) {
+      vfs.StatisticsEnable = true;
+   }
+}
+
+static void
  compute_kill_pixel(struct anv_pipeline *pipeline,
                     const VkPipelineMultisampleStateCreateInfo *ms_info,
                     const struct anv_subpass *subpass)
@@ -1669,6 +1677,7 @@ genX(graphics_pipeline_create)(
     emit_3dstate_ps_extra(pipeline, subpass);
     emit_3dstate_vf_topology(pipeline);
  #endif
+   emit_3dstate_vf_statistics(pipeline);
*pPipeline = anv_pipeline_to_handle(pipeline); diff --git a/src/intel/vulkan/genX_state.c b/src/intel/vulkan/genX_state.c
index fd8f8ac..bf1217b 100644
--- a/src/intel/vulkan/genX_state.c
+++ b/src/intel/vulkan/genX_state.c
@@ -52,9 +52,6 @@ genX(init_device_state)(struct anv_device *device)
        ps.PipelineSelection = _3D;
     }
- anv_batch_emit(&batch, GENX(3DSTATE_VF_STATISTICS), vfs)
-      vfs.StatisticsEnable = true;
-
     anv_batch_emit(&batch, GENX(3DSTATE_AA_LINE_PARAMETERS), aa);
anv_batch_emit(&batch, GENX(3DSTATE_DRAWING_RECTANGLE), rect) {


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to