break;
case VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT:
pool->stride = 32;
- if (pool->uses_gds) {
- /* When the query pool needs GDS, allocate 2x32-bit values for begin/end. */
+ if (pool->uses_gds && device->physical_device->rad_info.gfx_level < GFX11) {
+ /* When the hardware can use both the legacy and the NGG paths in the same begin/end pair,
+ * allocate 2x32-bit values for the GDS counters.
+ */
pool->stride += 4 * 2;
}
break;
primitive_storage_needed = src64[2] - src64[0];
- if (pool->uses_gds) {
+ if (pool->uses_gds && device->physical_device->rad_info.gfx_level < GFX11) {
uint32_t const *src32 = (uint32_t const *)src;
/* Accumulate the result that was copied from GDS in case NGG shader has been used. */
radv_query_shader(cmd_buffer, &cmd_buffer->device->meta_state.query.pg_query_pipeline,
pool->bo, dst_buffer->bo, firstQuery * pool->stride,
dst_buffer->offset + dstOffset, pool->stride, stride, dst_size, queryCount,
- flags, 0, 0, pool->uses_gds);
+ flags, 0, 0, pool->uses_gds && cmd_buffer->device->physical_device->rad_info.gfx_level < GFX11);
break;
default:
unreachable("trying to get results of unhandled query type");
}
break;
case VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT: {
- if (!cmd_buffer->state.active_prims_gen_queries) {
- bool old_streamout_enabled = radv_is_streamout_enabled(cmd_buffer);
+ if (cmd_buffer->device->physical_device->rad_info.gfx_level >= GFX11) {
+ /* On GFX11+, primitives generated query always use GDS. */
+ gfx10_copy_gds_query(cmd_buffer, 4 + index * 4, va);
+ radv_emit_write_data_imm(cs, V_370_ME, va + 4, 0x80000000);
- cmd_buffer->state.active_prims_gen_queries++;
+ /* Record that the command buffer needs GDS. */
+ cmd_buffer->gds_needed = true;
- if (old_streamout_enabled != radv_is_streamout_enabled(cmd_buffer)) {
- radv_emit_streamout_enable(cmd_buffer);
- }
+ cmd_buffer->state.active_prims_gen_gds_queries++;
} else {
- cmd_buffer->state.active_prims_gen_queries++;
- }
+ if (!cmd_buffer->state.active_prims_gen_queries) {
+ bool old_streamout_enabled = radv_is_streamout_enabled(cmd_buffer);
- emit_sample_streamout(cmd_buffer, va, index);
+ cmd_buffer->state.active_prims_gen_queries++;
- if (pool->uses_gds) {
- /* generated prim counter */
- gfx10_copy_gds_query(cmd_buffer, 4 + index * 4, va + 32);
+ if (old_streamout_enabled != radv_is_streamout_enabled(cmd_buffer)) {
+ radv_emit_streamout_enable(cmd_buffer);
+ }
+ } else {
+ cmd_buffer->state.active_prims_gen_queries++;
+ }
- /* Record that the command buffer needs GDS. */
- cmd_buffer->gds_needed = true;
+ emit_sample_streamout(cmd_buffer, va, index);
- cmd_buffer->state.active_prims_gen_gds_queries++;
+ if (pool->uses_gds) {
+ /* generated prim counter */
+ gfx10_copy_gds_query(cmd_buffer, 4 + index * 4, va + 32);
+
+ /* Record that the command buffer needs GDS. */
+ cmd_buffer->gds_needed = true;
+
+ cmd_buffer->state.active_prims_gen_gds_queries++;
+ }
}
break;
}
}
break;
case VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT: {
- if (cmd_buffer->state.active_prims_gen_queries == 1) {
- bool old_streamout_enabled = radv_is_streamout_enabled(cmd_buffer);
+ if (cmd_buffer->device->physical_device->rad_info.gfx_level >= GFX11) {
+ /* On GFX11+, primitives generated query always use GDS. */
+ gfx10_copy_gds_query(cmd_buffer, 4 + index * 4, va + 16);
+ radv_emit_write_data_imm(cs, V_370_ME, va + 20, 0x80000000);
- cmd_buffer->state.active_prims_gen_queries--;
+ cmd_buffer->state.active_prims_gen_gds_queries--;
+ } else {
+ if (cmd_buffer->state.active_prims_gen_queries == 1) {
+ bool old_streamout_enabled = radv_is_streamout_enabled(cmd_buffer);
- if (old_streamout_enabled != radv_is_streamout_enabled(cmd_buffer)) {
- radv_emit_streamout_enable(cmd_buffer);
+ cmd_buffer->state.active_prims_gen_queries--;
+
+ if (old_streamout_enabled != radv_is_streamout_enabled(cmd_buffer)) {
+ radv_emit_streamout_enable(cmd_buffer);
+ }
+ } else {
+ cmd_buffer->state.active_prims_gen_queries--;
}
- } else {
- cmd_buffer->state.active_prims_gen_queries--;
- }
- emit_sample_streamout(cmd_buffer, va + 16, index);
+ emit_sample_streamout(cmd_buffer, va + 16, index);
- if (pool->uses_gds) {
- /* generated prim counter */
- gfx10_copy_gds_query(cmd_buffer, 4 + index * 4, va + 36);
+ if (pool->uses_gds) {
+ /* generated prim counter */
+ gfx10_copy_gds_query(cmd_buffer, 4 + index * 4, va + 36);
- cmd_buffer->state.active_prims_gen_gds_queries--;
+ cmd_buffer->state.active_prims_gen_gds_queries--;
+ }
}
break;
}