vk: Implement workaround for occlusion queries
We have an issue with occlusion queries (PIPE_CONTROL depth writes) after using the pipeline with the VS disabled. We work around it by using a depth cache flush PIPE_CONTROL before doing a depth write. Fixes dEQP-VK.query_pool.*
This commit is contained in:
parent
6fc278ae4f
commit
d7a193327b
|
@ -123,6 +123,7 @@ anv_cmd_state_init(struct anv_cmd_state *state)
|
|||
state->pipeline = NULL;
|
||||
state->restart_index = UINT32_MAX;
|
||||
state->dynamic = default_dynamic_state;
|
||||
state->need_query_wa = true;
|
||||
|
||||
state->gen7.index_buffer = NULL;
|
||||
}
|
||||
|
|
|
@ -144,6 +144,11 @@ anv_meta_restore(const struct anv_meta_saved_state *state,
|
|||
anv_dynamic_state_copy(&cmd_buffer->state.dynamic, &state->dynamic,
|
||||
state->dynamic_mask);
|
||||
cmd_buffer->state.dirty |= state->dynamic_mask;
|
||||
|
||||
/* Since we've used the pipeline with the VS disabled, set
|
||||
* need_query_wa. See CmdBeginQuery.
|
||||
*/
|
||||
cmd_buffer->state.need_query_wa = true;
|
||||
}
|
||||
|
||||
VkImageViewType
|
||||
|
|
|
@ -1082,6 +1082,7 @@ struct anv_cmd_state {
|
|||
struct anv_state binding_tables[MESA_SHADER_STAGES];
|
||||
struct anv_state samplers[MESA_SHADER_STAGES];
|
||||
struct anv_dynamic_state dynamic;
|
||||
bool need_query_wa;
|
||||
|
||||
struct {
|
||||
struct anv_buffer * index_buffer;
|
||||
|
|
|
@ -896,6 +896,19 @@ void genX(CmdBeginQuery)(
|
|||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
ANV_FROM_HANDLE(anv_query_pool, pool, queryPool);
|
||||
|
||||
/* Workaround: When meta uses the pipeline with the VS disabled, it seems
|
||||
* that the pipelining of the depth write breaks. What we see is that
|
||||
* samples from the render pass clear leaks into the first query
|
||||
* immediately after the clear. Doing a pipecontrol with a post-sync
|
||||
* operation and DepthStallEnable seems to work around the issue.
|
||||
*/
|
||||
if (cmd_buffer->state.need_query_wa) {
|
||||
cmd_buffer->state.need_query_wa = false;
|
||||
anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL),
|
||||
.DepthCacheFlushEnable = true,
|
||||
.DepthStallEnable = true);
|
||||
}
|
||||
|
||||
switch (pool->type) {
|
||||
case VK_QUERY_TYPE_OCCLUSION:
|
||||
emit_ps_depth_count(&cmd_buffer->batch, &pool->bo,
|
||||
|
|
Loading…
Reference in New Issue