From dda54890f3daddd664c9edee524754e6b2b42aa8 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Thu, 16 Mar 2017 14:12:03 -0700 Subject: [PATCH] anv: Disable VF statistics for blorp and SOL memcpy 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. Reviewed-by: Lionel Landwerlin --- 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 86730e07def..6b46a1e10ad 100644 --- a/src/intel/vulkan/genX_blorp_exec.c +++ b/src/intel/vulkan/genX_blorp_exec.c @@ -173,6 +173,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 eb11c2f0874..3cbc7235cfc 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 9d884a05d16..cfc7c06fa4c 100644 --- a/src/intel/vulkan/genX_pipeline.c +++ b/src/intel/vulkan/genX_pipeline.c @@ -1569,6 +1569,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, @@ -1675,6 +1683,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 fd8f8ac9ce0..bf1217bbcdc 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) { -- 2.30.2