anv/cmd_buffer: Flush the VF cache at the top of all primaries
authorJason Ekstrand <jason.ekstrand@intel.com>
Fri, 31 Mar 2017 22:33:39 +0000 (15:33 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 14 Apr 2017 20:35:02 +0000 (13:35 -0700)
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Cc: "13.0 17.0" <mesa-stable@lists.freedesktop.org>
src/intel/vulkan/genX_cmd_buffer.c

index b78b13d88e6fe66f0611bef71052e7cfeca2c282..7318b6b6881ff497c1706f2587009bb5f4f7bba3 100644 (file)
@@ -597,6 +597,18 @@ genX(BeginCommandBuffer)(
 
    genX(cmd_buffer_emit_state_base_address)(cmd_buffer);
 
+   /* We sometimes store vertex data in the dynamic state buffer for blorp
+    * operations and our dynamic state stream may re-use data from previous
+    * command buffers.  In order to prevent stale cache data, we flush the VF
+    * cache.  We could do this on every blorp call but that's not really
+    * needed as all of the data will get written by the CPU prior to the GPU
+    * executing anything.  The chances are fairly high that they will use
+    * blorp at least once per primary command buffer so it shouldn't be
+    * wasted.
+    */
+   if (cmd_buffer->level == VK_COMMAND_BUFFER_LEVEL_PRIMARY)
+      cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_VF_CACHE_INVALIDATE_BIT;
+
    VkResult result = VK_SUCCESS;
    if (cmd_buffer->usage_flags &
        VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {