In committags/19.0-branchpoint9a7b319903("anv/query: flush render target before copying results") we tracked all the render target writes to apply a flushes in the vkCopyQueryResults(). But we can narrow this down to only when we write a buffer (which is the only input of vkCopyQueryResults). v2: Drop newer render target write flags introduce by1952fd8d2c("anv: Implement VK_EXT_conditional_rendering for gen 7.5+") Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net> (v1)
| @@ -475,6 +475,8 @@ void anv_CmdCopyImageToBuffer( | |||
| copy_buffer_to_image(cmd_buffer, dst_buffer, src_image, srcImageLayout, | |||
| regionCount, pRegions, false); | |||
| cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_BUFFER_WRITES; | |||
| } | |||
| static bool | |||
| @@ -682,6 +684,8 @@ void anv_CmdCopyBuffer( | |||
| } | |||
| blorp_batch_finish(&batch); | |||
| cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_BUFFER_WRITES; | |||
| } | |||
| void anv_CmdUpdateBuffer( | |||
| @@ -737,6 +741,8 @@ void anv_CmdUpdateBuffer( | |||
| } | |||
| blorp_batch_finish(&batch); | |||
| cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_BUFFER_WRITES; | |||
| } | |||
| void anv_CmdFillBuffer( | |||
| @@ -824,6 +830,8 @@ void anv_CmdFillBuffer( | |||
| } | |||
| blorp_batch_finish(&batch); | |||
| cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_BUFFER_WRITES; | |||
| } | |||
| void anv_CmdClearColorImage( | |||
| @@ -1790,11 +1790,12 @@ enum anv_pipe_bits { | |||
| ANV_PIPE_NEEDS_CS_STALL_BIT = (1 << 21), | |||
| /* This bit does not exist directly in PIPE_CONTROL. It means that render | |||
| * target operations are ongoing. Some operations like copies on the | |||
| * command streamer might need to be aware of this to trigger the | |||
| * appropriate stall before they can proceed with the copy. | |||
| * target operations related to transfer commands with VkBuffer as | |||
| * destination are ongoing. Some operations like copies on the command | |||
| * streamer might need to be aware of this to trigger the appropriate stall | |||
| * before they can proceed with the copy. | |||
| */ | |||
| ANV_PIPE_RENDER_TARGET_WRITES = (1 << 22), | |||
| ANV_PIPE_RENDER_TARGET_BUFFER_WRITES = (1 << 22), | |||
| }; | |||
| #define ANV_PIPE_FLUSH_BITS ( \ | |||
| @@ -268,5 +268,4 @@ genX(blorp_exec)(struct blorp_batch *batch, | |||
| cmd_buffer->state.gfx.vb_dirty = ~0; | |||
| cmd_buffer->state.gfx.dirty = ~0; | |||
| cmd_buffer->state.push_constants_dirty = ~0; | |||
| cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_WRITES; | |||
| } | |||
| @@ -1811,7 +1811,7 @@ genX(cmd_buffer_apply_pipe_flushes)(struct anv_cmd_buffer *cmd_buffer) | |||
| * saying that render target writes are ongoing. | |||
| */ | |||
| if (bits & ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT) | |||
| bits &= ~(ANV_PIPE_RENDER_TARGET_WRITES); | |||
| bits &= ~(ANV_PIPE_RENDER_TARGET_BUFFER_WRITES); | |||
| bits &= ~(ANV_PIPE_FLUSH_BITS | ANV_PIPE_CS_STALL_BIT); | |||
| } | |||
| @@ -2828,8 +2828,6 @@ void genX(CmdDraw)( | |||
| prim.StartInstanceLocation = firstInstance; | |||
| prim.BaseVertexLocation = 0; | |||
| } | |||
| cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_WRITES; | |||
| } | |||
| void genX(CmdDrawIndexed)( | |||
| @@ -2873,8 +2871,6 @@ void genX(CmdDrawIndexed)( | |||
| prim.StartInstanceLocation = firstInstance; | |||
| prim.BaseVertexLocation = vertexOffset; | |||
| } | |||
| cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_WRITES; | |||
| } | |||
| /* Auto-Draw / Indirect Registers */ | |||
| @@ -3012,8 +3008,6 @@ void genX(CmdDrawIndirect)( | |||
| offset += stride; | |||
| } | |||
| cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_WRITES; | |||
| } | |||
| void genX(CmdDrawIndexedIndirect)( | |||
| @@ -3057,8 +3051,6 @@ void genX(CmdDrawIndexedIndirect)( | |||
| offset += stride; | |||
| } | |||
| cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_WRITES; | |||
| } | |||
| #define TMP_DRAW_COUNT_REG MI_ALU_REG14 | |||
| @@ -3218,8 +3210,6 @@ void genX(CmdDrawIndirectCountKHR)( | |||
| offset += stride; | |||
| } | |||
| cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_WRITES; | |||
| } | |||
| void genX(CmdDrawIndexedIndirectCountKHR)( | |||
| @@ -3280,8 +3270,6 @@ void genX(CmdDrawIndexedIndirectCountKHR)( | |||
| offset += stride; | |||
| } | |||
| cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_WRITES; | |||
| } | |||
| static VkResult | |||
| @@ -299,5 +299,4 @@ genX(cmd_buffer_so_memcpy)(struct anv_cmd_buffer *cmd_buffer, | |||
| } | |||
| cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_PIPELINE; | |||
| cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_WRITES; | |||
| } | |||
| @@ -733,7 +733,7 @@ void genX(CmdCopyQueryPoolResults)( | |||
| * to ensure proper ordering of the commands from the 3d pipe and the | |||
| * command streamer. | |||
| */ | |||
| if (cmd_buffer->state.pending_pipe_bits & ANV_PIPE_RENDER_TARGET_WRITES) { | |||
| if (cmd_buffer->state.pending_pipe_bits & ANV_PIPE_RENDER_TARGET_BUFFER_WRITES) { | |||
| cmd_buffer->state.pending_pipe_bits |= | |||
| ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT; | |||
| } | |||