anv: narrow flushing of the render target to buffer writes

In commit 9a7b319903 ("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 by 1952fd8d2c
    ("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)
This commit is contained in:
Lionel Landwerlin
2019-01-17 17:00:14 +00:00
parent 6ca652faf3
commit 3c4c18341a
6 changed files with 15 additions and 20 deletions

View File

@@ -475,6 +475,8 @@ void anv_CmdCopyImageToBuffer(
copy_buffer_to_image(cmd_buffer, dst_buffer, src_image, srcImageLayout, copy_buffer_to_image(cmd_buffer, dst_buffer, src_image, srcImageLayout,
regionCount, pRegions, false); regionCount, pRegions, false);
cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_BUFFER_WRITES;
} }
static bool static bool
@@ -682,6 +684,8 @@ void anv_CmdCopyBuffer(
} }
blorp_batch_finish(&batch); blorp_batch_finish(&batch);
cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_BUFFER_WRITES;
} }
void anv_CmdUpdateBuffer( void anv_CmdUpdateBuffer(
@@ -737,6 +741,8 @@ void anv_CmdUpdateBuffer(
} }
blorp_batch_finish(&batch); blorp_batch_finish(&batch);
cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_BUFFER_WRITES;
} }
void anv_CmdFillBuffer( void anv_CmdFillBuffer(
@@ -824,6 +830,8 @@ void anv_CmdFillBuffer(
} }
blorp_batch_finish(&batch); blorp_batch_finish(&batch);
cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_BUFFER_WRITES;
} }
void anv_CmdClearColorImage( void anv_CmdClearColorImage(

View File

@@ -1790,11 +1790,12 @@ enum anv_pipe_bits {
ANV_PIPE_NEEDS_CS_STALL_BIT = (1 << 21), ANV_PIPE_NEEDS_CS_STALL_BIT = (1 << 21),
/* This bit does not exist directly in PIPE_CONTROL. It means that render /* This bit does not exist directly in PIPE_CONTROL. It means that render
* target operations are ongoing. Some operations like copies on the * target operations related to transfer commands with VkBuffer as
* command streamer might need to be aware of this to trigger the * destination are ongoing. Some operations like copies on the command
* appropriate stall before they can proceed with the copy. * 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 ( \ #define ANV_PIPE_FLUSH_BITS ( \

View File

@@ -268,5 +268,4 @@ genX(blorp_exec)(struct blorp_batch *batch,
cmd_buffer->state.gfx.vb_dirty = ~0; cmd_buffer->state.gfx.vb_dirty = ~0;
cmd_buffer->state.gfx.dirty = ~0; cmd_buffer->state.gfx.dirty = ~0;
cmd_buffer->state.push_constants_dirty = ~0; cmd_buffer->state.push_constants_dirty = ~0;
cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_WRITES;
} }

View File

@@ -1811,7 +1811,7 @@ genX(cmd_buffer_apply_pipe_flushes)(struct anv_cmd_buffer *cmd_buffer)
* saying that render target writes are ongoing. * saying that render target writes are ongoing.
*/ */
if (bits & ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT) 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); bits &= ~(ANV_PIPE_FLUSH_BITS | ANV_PIPE_CS_STALL_BIT);
} }
@@ -2828,8 +2828,6 @@ void genX(CmdDraw)(
prim.StartInstanceLocation = firstInstance; prim.StartInstanceLocation = firstInstance;
prim.BaseVertexLocation = 0; prim.BaseVertexLocation = 0;
} }
cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_WRITES;
} }
void genX(CmdDrawIndexed)( void genX(CmdDrawIndexed)(
@@ -2873,8 +2871,6 @@ void genX(CmdDrawIndexed)(
prim.StartInstanceLocation = firstInstance; prim.StartInstanceLocation = firstInstance;
prim.BaseVertexLocation = vertexOffset; prim.BaseVertexLocation = vertexOffset;
} }
cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_WRITES;
} }
/* Auto-Draw / Indirect Registers */ /* Auto-Draw / Indirect Registers */
@@ -3012,8 +3008,6 @@ void genX(CmdDrawIndirect)(
offset += stride; offset += stride;
} }
cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_WRITES;
} }
void genX(CmdDrawIndexedIndirect)( void genX(CmdDrawIndexedIndirect)(
@@ -3057,8 +3051,6 @@ void genX(CmdDrawIndexedIndirect)(
offset += stride; offset += stride;
} }
cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_WRITES;
} }
#define TMP_DRAW_COUNT_REG MI_ALU_REG14 #define TMP_DRAW_COUNT_REG MI_ALU_REG14
@@ -3218,8 +3210,6 @@ void genX(CmdDrawIndirectCountKHR)(
offset += stride; offset += stride;
} }
cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_WRITES;
} }
void genX(CmdDrawIndexedIndirectCountKHR)( void genX(CmdDrawIndexedIndirectCountKHR)(
@@ -3280,8 +3270,6 @@ void genX(CmdDrawIndexedIndirectCountKHR)(
offset += stride; offset += stride;
} }
cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_WRITES;
} }
static VkResult static VkResult

View File

@@ -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.gfx.dirty |= ANV_CMD_DIRTY_PIPELINE;
cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_WRITES;
} }

View File

@@ -733,7 +733,7 @@ void genX(CmdCopyQueryPoolResults)(
* to ensure proper ordering of the commands from the 3d pipe and the * to ensure proper ordering of the commands from the 3d pipe and the
* command streamer. * 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 |= cmd_buffer->state.pending_pipe_bits |=
ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT; ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT;
} }