}
/* Occlusion queries. */
- if (cmd_buffer->state.active_occlusion_queries > 0) {
- radv_set_db_count_control(cmd_buffer, false);
+ if (cmd_buffer->state.active_occlusion_queries) {
+ state->active_occlusion_queries = cmd_buffer->state.active_occlusion_queries;
+ cmd_buffer->state.active_occlusion_queries = 0;
+ cmd_buffer->state.dirty |= RADV_CMD_DIRTY_OCCLUSION_QUERY;
}
/* Primitives generated queries (legacy). */
}
/* Occlusion queries. */
- if (cmd_buffer->state.active_occlusion_queries > 0) {
- radv_set_db_count_control(cmd_buffer, true);
+ if (state->active_occlusion_queries) {
+ cmd_buffer->state.active_occlusion_queries = state->active_occlusion_queries;
+ cmd_buffer->state.dirty |= RADV_CMD_DIRTY_OCCLUSION_QUERY;
}
/* Primitives generated queries (legacy). */
unsigned active_pipeline_gds_queries;
unsigned active_prims_gen_gds_queries;
unsigned active_prims_xfb_gds_queries;
+ unsigned active_occlusion_queries;
bool predicating;
};
cmd_buffer->state.dirty &= ~RADV_CMD_DIRTY_INDEX_BUFFER;
}
-void
-radv_set_db_count_control(struct radv_cmd_buffer *cmd_buffer, bool enable_occlusion_queries)
+static void
+radv_flush_occlusion_query_state(struct radv_cmd_buffer *cmd_buffer)
{
+ const bool enable_occlusion_queries = cmd_buffer->state.active_occlusion_queries ||
+ cmd_buffer->state.inherited_occlusion_queries;
uint32_t db_count_control;
if (!enable_occlusion_queries) {
uint32_t sample_rate = util_logbase2(cmd_buffer->state.render.max_samples);
bool gfx10_perfect =
cmd_buffer->device->physical_device->rad_info.gfx_level >= GFX10 &&
- cmd_buffer->state.perfect_occlusion_queries_enabled;
+ (cmd_buffer->state.perfect_occlusion_queries_enabled ||
+ cmd_buffer->state.inherited_query_control_flags & VK_QUERY_CONTROL_PRECISE_BIT);
if (cmd_buffer->device->physical_device->rad_info.gfx_level >= GFX7) {
/* Always enable PERFECT_ZPASS_COUNTS due to issues with partially
cmd_buffer->state.last_pa_sc_binner_cntl_0 = -1;
cmd_buffer->usage_flags = pBeginInfo->flags;
- cmd_buffer->state.dirty |= RADV_CMD_DIRTY_DYNAMIC_ALL | RADV_CMD_DIRTY_GUARDBAND;
+ cmd_buffer->state.dirty |= RADV_CMD_DIRTY_DYNAMIC_ALL | RADV_CMD_DIRTY_GUARDBAND |
+ RADV_CMD_DIRTY_OCCLUSION_QUERY;
if (cmd_buffer->device->physical_device->rad_info.gfx_level >= GFX7) {
uint32_t pred_value = 0;
if (cmd_buffer->state.inherited_pipeline_statistics &
VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT)
cmd_buffer->state.dirty |= RADV_CMD_DIRTY_NGG_QUERY;
+
+ cmd_buffer->state.inherited_occlusion_queries =
+ pBeginInfo->pInheritanceInfo->occlusionQueryEnable;
+ cmd_buffer->state.inherited_query_control_flags = pBeginInfo->pInheritanceInfo->queryFlags;
+ if (cmd_buffer->state.inherited_occlusion_queries)
+ cmd_buffer->state.dirty |= RADV_CMD_DIRTY_OCCLUSION_QUERY;
}
if (unlikely(cmd_buffer->device->trace_bo))
*/
primary->state.dirty |= RADV_CMD_DIRTY_PIPELINE | RADV_CMD_DIRTY_INDEX_BUFFER |
RADV_CMD_DIRTY_GUARDBAND | RADV_CMD_DIRTY_DYNAMIC_ALL |
- RADV_CMD_DIRTY_NGG_QUERY;
+ RADV_CMD_DIRTY_NGG_QUERY | RADV_CMD_DIRTY_OCCLUSION_QUERY;
radv_mark_descriptor_sets_dirty(primary, VK_PIPELINE_BIND_POINT_GRAPHICS);
radv_mark_descriptor_sets_dirty(primary, VK_PIPELINE_BIND_POINT_COMPUTE);
radv_flush_ngg_query_state(cmd_buffer);
}
+ if (cmd_buffer->state.dirty & RADV_CMD_DIRTY_OCCLUSION_QUERY) {
+ radv_flush_occlusion_query_state(cmd_buffer);
+ cmd_buffer->state.dirty &= ~RADV_CMD_DIRTY_OCCLUSION_QUERY;
+ }
+
if ((cmd_buffer->state.dirty &
(RADV_CMD_DIRTY_PIPELINE | RADV_CMD_DIRTY_DYNAMIC_CULL_MODE |
RADV_CMD_DIRTY_DYNAMIC_FRONT_FACE | RADV_CMD_DIRTY_DYNAMIC_RASTERIZER_DISCARD_ENABLE |
RADV_CMD_DIRTY_GUARDBAND = 1ull << 53,
RADV_CMD_DIRTY_RBPLUS = 1ull << 54,
RADV_CMD_DIRTY_NGG_QUERY = 1ull << 55,
+ RADV_CMD_DIRTY_OCCLUSION_QUERY = 1ull << 56,
};
enum radv_cmd_flush_bits {
/* Inheritance info. */
VkQueryPipelineStatisticFlags inherited_pipeline_statistics;
+ bool inherited_occlusion_queries;
+ VkQueryControlFlags inherited_query_control_flags;
bool context_roll_without_scissor_emitted;
unsigned value);
void si_cp_dma_wait_for_idle(struct radv_cmd_buffer *cmd_buffer);
-void radv_set_db_count_control(struct radv_cmd_buffer *cmd_buffer, bool enable_occlusion_queries);
uint32_t radv_get_pa_su_sc_mode_cntl(const struct radv_cmd_buffer *cmd_buffer);
uint32_t radv_get_vgt_index_size(uint32_t type);
cmd_buffer->state.perfect_occlusion_queries_enabled = true;
}
- radv_set_db_count_control(cmd_buffer, true);
+ cmd_buffer->state.dirty |= RADV_CMD_DIRTY_OCCLUSION_QUERY;
} else {
if ((flags & VK_QUERY_CONTROL_PRECISE_BIT) &&
!cmd_buffer->state.perfect_occlusion_queries_enabled) {
*/
cmd_buffer->state.perfect_occlusion_queries_enabled = true;
- radv_set_db_count_control(cmd_buffer, true);
+ cmd_buffer->state.dirty |= RADV_CMD_DIRTY_OCCLUSION_QUERY;
}
}
cmd_buffer->state.active_occlusion_queries--;
if (cmd_buffer->state.active_occlusion_queries == 0) {
- radv_set_db_count_control(cmd_buffer, false);
-
/* Reset the perfect occlusion queries hint now that no
* queries are active.
*/
cmd_buffer->state.perfect_occlusion_queries_enabled = false;
+
+ cmd_buffer->state.dirty |= RADV_CMD_DIRTY_OCCLUSION_QUERY;
}
if (cmd_buffer->device->physical_device->rad_info.gfx_level >= GFX11 &&