mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-26 02:00:12 +01:00
radv: use vk_query
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24416>
This commit is contained in:
parent
97c926cf17
commit
a7d6edfb36
3 changed files with 32 additions and 36 deletions
|
|
@ -65,6 +65,7 @@
|
|||
#include "vk_instance.h"
|
||||
#include "vk_log.h"
|
||||
#include "vk_physical_device.h"
|
||||
#include "vk_query_pool.h"
|
||||
#include "vk_queue.h"
|
||||
#include "vk_sampler.h"
|
||||
#include "vk_shader_module.h"
|
||||
|
|
@ -2939,14 +2940,12 @@ VkResult radv_device_init_meta(struct radv_device *device);
|
|||
void radv_device_finish_meta(struct radv_device *device);
|
||||
|
||||
struct radv_query_pool {
|
||||
struct vk_object_base base;
|
||||
struct vk_query_pool vk;
|
||||
struct radeon_winsys_bo *bo;
|
||||
uint32_t stride;
|
||||
uint32_t availability_offset;
|
||||
uint64_t size;
|
||||
char *ptr;
|
||||
VkQueryType type;
|
||||
uint32_t pipeline_stats_mask;
|
||||
bool uses_gds; /* For NGG GS on GFX10+ */
|
||||
};
|
||||
|
||||
|
|
@ -3661,7 +3660,7 @@ VK_DEFINE_NONDISP_HANDLE_CASTS(radv_indirect_command_layout, base, VkIndirectCom
|
|||
VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NV)
|
||||
VK_DEFINE_NONDISP_HANDLE_CASTS(radv_pipeline, base, VkPipeline, VK_OBJECT_TYPE_PIPELINE)
|
||||
VK_DEFINE_NONDISP_HANDLE_CASTS(radv_pipeline_layout, base, VkPipelineLayout, VK_OBJECT_TYPE_PIPELINE_LAYOUT)
|
||||
VK_DEFINE_NONDISP_HANDLE_CASTS(radv_query_pool, base, VkQueryPool, VK_OBJECT_TYPE_QUERY_POOL)
|
||||
VK_DEFINE_NONDISP_HANDLE_CASTS(radv_query_pool, vk.base, VkQueryPool, VK_OBJECT_TYPE_QUERY_POOL)
|
||||
VK_DEFINE_NONDISP_HANDLE_CASTS(radv_sampler, vk.base, VkSampler, VK_OBJECT_TYPE_SAMPLER)
|
||||
|
||||
VK_DEFINE_NONDISP_HANDLE_CASTS(radv_video_session, vk.base, VkVideoSessionKHR, VK_OBJECT_TYPE_VIDEO_SESSION_KHR)
|
||||
|
|
|
|||
|
|
@ -1027,7 +1027,7 @@ static void
|
|||
radv_destroy_query_pool(struct radv_device *device, const VkAllocationCallbacks *pAllocator,
|
||||
struct radv_query_pool *pool)
|
||||
{
|
||||
if (pool->type == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR)
|
||||
if (pool->vk.query_type == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR)
|
||||
radv_pc_deinit_query_pool((struct radv_pc_query_pool *)pool);
|
||||
|
||||
if (pool->bo) {
|
||||
|
|
@ -1036,7 +1036,7 @@ radv_destroy_query_pool(struct radv_device *device, const VkAllocationCallbacks
|
|||
}
|
||||
|
||||
radv_rmv_log_resource_destroy(device, (uint64_t)radv_query_pool_to_handle(pool));
|
||||
vk_object_base_finish(&pool->base);
|
||||
vk_query_pool_finish(&pool->vk);
|
||||
vk_free2(&device->vk.alloc, pAllocator, pool);
|
||||
}
|
||||
|
||||
|
|
@ -1055,10 +1055,7 @@ radv_create_query_pool(struct radv_device *device, const VkQueryPoolCreateInfo *
|
|||
if (!pool)
|
||||
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
|
||||
|
||||
vk_object_base_init(&device->vk, &pool->base, VK_OBJECT_TYPE_QUERY_POOL);
|
||||
|
||||
pool->type = pCreateInfo->queryType;
|
||||
pool->pipeline_stats_mask = pCreateInfo->pipelineStatistics;
|
||||
vk_query_pool_init(&device->vk, &pool->vk, pCreateInfo);
|
||||
|
||||
/* The number of primitives generated by geometry shader invocations is only counted by the
|
||||
* hardware if GS uses the legacy path. When NGG GS is used, the hardware can't know the number
|
||||
|
|
@ -1070,8 +1067,8 @@ radv_create_query_pool(struct radv_device *device, const VkQueryPoolCreateInfo *
|
|||
*/
|
||||
pool->uses_gds =
|
||||
(device->physical_device->emulate_ngg_gs_query_pipeline_stat &&
|
||||
(pool->pipeline_stats_mask & (VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
|
||||
VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT))) ||
|
||||
(pool->vk.pipeline_statistics & (VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT |
|
||||
VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT))) ||
|
||||
(device->physical_device->use_ngg && pCreateInfo->queryType == VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT);
|
||||
|
||||
switch (pCreateInfo->queryType) {
|
||||
|
|
@ -1175,7 +1172,7 @@ radv_GetQueryPoolResults(VkDevice _device, VkQueryPool queryPool, uint32_t first
|
|||
char *src = pool->ptr + query * pool->stride;
|
||||
uint32_t available;
|
||||
|
||||
switch (pool->type) {
|
||||
switch (pool->vk.query_type) {
|
||||
case VK_QUERY_TYPE_TIMESTAMP:
|
||||
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR:
|
||||
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR:
|
||||
|
|
@ -1258,9 +1255,9 @@ radv_GetQueryPoolResults(VkDevice _device, VkQueryPool queryPool, uint32_t first
|
|||
const uint64_t *stop = (uint64_t *)(src + pipelinestat_block_size);
|
||||
if (flags & VK_QUERY_RESULT_64_BIT) {
|
||||
uint64_t *dst = (uint64_t *)dest;
|
||||
dest += util_bitcount(pool->pipeline_stats_mask) * 8;
|
||||
dest += util_bitcount(pool->vk.pipeline_statistics) * 8;
|
||||
for (int i = 0; i < ARRAY_SIZE(pipeline_statistics_indices); ++i) {
|
||||
if (pool->pipeline_stats_mask & (1u << i)) {
|
||||
if (pool->vk.pipeline_statistics & (1u << i)) {
|
||||
if (available || (flags & VK_QUERY_RESULT_PARTIAL_BIT)) {
|
||||
*dst = stop[pipeline_statistics_indices[i]] - start[pipeline_statistics_indices[i]];
|
||||
}
|
||||
|
|
@ -1270,9 +1267,9 @@ radv_GetQueryPoolResults(VkDevice _device, VkQueryPool queryPool, uint32_t first
|
|||
|
||||
} else {
|
||||
uint32_t *dst = (uint32_t *)dest;
|
||||
dest += util_bitcount(pool->pipeline_stats_mask) * 4;
|
||||
dest += util_bitcount(pool->vk.pipeline_statistics) * 4;
|
||||
for (int i = 0; i < ARRAY_SIZE(pipeline_statistics_indices); ++i) {
|
||||
if (pool->pipeline_stats_mask & (1u << i)) {
|
||||
if (pool->vk.pipeline_statistics & (1u << i)) {
|
||||
if (available || (flags & VK_QUERY_RESULT_PARTIAL_BIT)) {
|
||||
*dst = stop[pipeline_statistics_indices[i]] - start[pipeline_statistics_indices[i]];
|
||||
}
|
||||
|
|
@ -1417,7 +1414,7 @@ static size_t
|
|||
radv_query_result_size(const struct radv_query_pool *pool, VkQueryResultFlags flags)
|
||||
{
|
||||
unsigned values = (flags & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) ? 1 : 0;
|
||||
switch (pool->type) {
|
||||
switch (pool->vk.query_type) {
|
||||
case VK_QUERY_TYPE_TIMESTAMP:
|
||||
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR:
|
||||
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR:
|
||||
|
|
@ -1427,7 +1424,7 @@ radv_query_result_size(const struct radv_query_pool *pool, VkQueryResultFlags fl
|
|||
values += 1;
|
||||
break;
|
||||
case VK_QUERY_TYPE_PIPELINE_STATISTICS:
|
||||
values += util_bitcount(pool->pipeline_stats_mask);
|
||||
values += util_bitcount(pool->vk.pipeline_statistics);
|
||||
break;
|
||||
case VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT:
|
||||
values += 2;
|
||||
|
|
@ -1477,7 +1474,7 @@ radv_CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPoo
|
|||
*/
|
||||
emit_query_flush(cmd_buffer, pool);
|
||||
|
||||
switch (pool->type) {
|
||||
switch (pool->vk.query_type) {
|
||||
case VK_QUERY_TYPE_OCCLUSION:
|
||||
radv_query_shader(cmd_buffer, &cmd_buffer->device->meta_state.query.occlusion_query_pipeline, pool->bo,
|
||||
dst_buffer->bo, firstQuery * pool->stride, dst_buffer->offset + dstOffset, pool->stride, stride,
|
||||
|
|
@ -1498,7 +1495,7 @@ radv_CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPoo
|
|||
}
|
||||
radv_query_shader(cmd_buffer, &cmd_buffer->device->meta_state.query.pipeline_statistics_query_pipeline, pool->bo,
|
||||
dst_buffer->bo, firstQuery * pool->stride, dst_buffer->offset + dstOffset, pool->stride, stride,
|
||||
dst_size, queryCount, flags, pool->pipeline_stats_mask,
|
||||
dst_size, queryCount, flags, pool->vk.pipeline_statistics,
|
||||
pool->availability_offset + 4 * firstQuery, false);
|
||||
break;
|
||||
case VK_QUERY_TYPE_TIMESTAMP:
|
||||
|
|
@ -1587,7 +1584,7 @@ radv_CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uin
|
|||
{
|
||||
RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
RADV_FROM_HANDLE(radv_query_pool, pool, queryPool);
|
||||
uint32_t value = query_clear_value(pool->type);
|
||||
uint32_t value = query_clear_value(pool->vk.query_type);
|
||||
uint32_t flush_bits = 0;
|
||||
|
||||
/* Make sure to sync all previous work if the given command buffer has
|
||||
|
|
@ -1599,7 +1596,7 @@ radv_CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uin
|
|||
flush_bits |= radv_fill_buffer(cmd_buffer, NULL, pool->bo, radv_buffer_get_va(pool->bo) + firstQuery * pool->stride,
|
||||
queryCount * pool->stride, value);
|
||||
|
||||
if (pool->type == VK_QUERY_TYPE_PIPELINE_STATISTICS) {
|
||||
if (pool->vk.query_type == VK_QUERY_TYPE_PIPELINE_STATISTICS) {
|
||||
flush_bits |=
|
||||
radv_fill_buffer(cmd_buffer, NULL, pool->bo,
|
||||
radv_buffer_get_va(pool->bo) + pool->availability_offset + firstQuery * 4, queryCount * 4, 0);
|
||||
|
|
@ -1617,14 +1614,14 @@ radv_ResetQueryPool(VkDevice _device, VkQueryPool queryPool, uint32_t firstQuery
|
|||
{
|
||||
RADV_FROM_HANDLE(radv_query_pool, pool, queryPool);
|
||||
|
||||
uint32_t value = query_clear_value(pool->type);
|
||||
uint32_t value = query_clear_value(pool->vk.query_type);
|
||||
uint32_t *data = (uint32_t *)(pool->ptr + firstQuery * pool->stride);
|
||||
uint32_t *data_end = (uint32_t *)(pool->ptr + (firstQuery + queryCount) * pool->stride);
|
||||
|
||||
for (uint32_t *p = data; p != data_end; ++p)
|
||||
*p = value;
|
||||
|
||||
if (pool->type == VK_QUERY_TYPE_PIPELINE_STATISTICS) {
|
||||
if (pool->vk.query_type == VK_QUERY_TYPE_PIPELINE_STATISTICS) {
|
||||
memset(pool->ptr + pool->availability_offset + firstQuery * 4, 0, queryCount * 4);
|
||||
}
|
||||
}
|
||||
|
|
@ -1737,13 +1734,13 @@ emit_begin_query(struct radv_cmd_buffer *cmd_buffer, struct radv_query_pool *poo
|
|||
radeon_emit(cs, va >> 32);
|
||||
|
||||
if (pool->uses_gds) {
|
||||
if (pool->pipeline_stats_mask & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
|
||||
if (pool->vk.pipeline_statistics & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
|
||||
uint32_t gs_prim_offset =
|
||||
radv_get_pipelinestat_query_offset(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT);
|
||||
|
||||
gfx10_copy_gds_query(cmd_buffer, RADV_SHADER_QUERY_GS_PRIM_EMIT_OFFSET, va + gs_prim_offset);
|
||||
} else {
|
||||
assert(pool->pipeline_stats_mask & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT);
|
||||
assert(pool->vk.pipeline_statistics & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT);
|
||||
uint32_t gs_invoc_offset =
|
||||
radv_get_pipelinestat_query_offset(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT);
|
||||
|
||||
|
|
@ -1886,13 +1883,13 @@ emit_end_query(struct radv_cmd_buffer *cmd_buffer, struct radv_query_pool *pool,
|
|||
EOP_DATA_SEL_VALUE_32BIT, avail_va, 1, cmd_buffer->gfx9_eop_bug_va);
|
||||
|
||||
if (pool->uses_gds) {
|
||||
if (pool->pipeline_stats_mask & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
|
||||
if (pool->vk.pipeline_statistics & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) {
|
||||
uint32_t gs_prim_offset =
|
||||
radv_get_pipelinestat_query_offset(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT);
|
||||
|
||||
gfx10_copy_gds_query(cmd_buffer, RADV_SHADER_QUERY_GS_PRIM_EMIT_OFFSET, va + gs_prim_offset);
|
||||
} else {
|
||||
assert(pool->pipeline_stats_mask & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT);
|
||||
assert(pool->vk.pipeline_statistics & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT);
|
||||
uint32_t gs_invoc_offset =
|
||||
radv_get_pipelinestat_query_offset(VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT);
|
||||
|
||||
|
|
@ -1991,7 +1988,7 @@ radv_CmdBeginQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPoo
|
|||
|
||||
va += pool->stride * query;
|
||||
|
||||
emit_begin_query(cmd_buffer, pool, va, pool->type, flags, index);
|
||||
emit_begin_query(cmd_buffer, pool, va, pool->vk.query_type, flags, index);
|
||||
}
|
||||
|
||||
VKAPI_ATTR void VKAPI_CALL
|
||||
|
|
@ -2006,7 +2003,7 @@ radv_CmdEndQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
|
|||
/* Do not need to add the pool BO to the list because the query must
|
||||
* currently be active, which means the BO is already in the list.
|
||||
*/
|
||||
emit_end_query(cmd_buffer, pool, va, avail_va, pool->type, index);
|
||||
emit_end_query(cmd_buffer, pool, va, avail_va, pool->vk.query_type, index);
|
||||
|
||||
/*
|
||||
* For multiview we have to emit a query for each bit in the mask,
|
||||
|
|
@ -2020,8 +2017,8 @@ radv_CmdEndQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
|
|||
for (unsigned i = 1; i < util_bitcount(cmd_buffer->state.render.view_mask); i++) {
|
||||
va += pool->stride;
|
||||
avail_va += 4;
|
||||
emit_begin_query(cmd_buffer, pool, va, pool->type, 0, 0);
|
||||
emit_end_query(cmd_buffer, pool, va, avail_va, pool->type, 0);
|
||||
emit_begin_query(cmd_buffer, pool, va, pool->vk.query_type, 0, 0);
|
||||
emit_end_query(cmd_buffer, pool, va, avail_va, pool->vk.query_type, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -607,8 +607,8 @@ radv_rmv_log_query_pool_create(struct radv_device *device, VkQueryPool _pool, bo
|
|||
|
||||
RADV_FROM_HANDLE(radv_query_pool, pool, _pool);
|
||||
|
||||
if (pool->type != VK_QUERY_TYPE_OCCLUSION && pool->type != VK_QUERY_TYPE_PIPELINE_STATISTICS &&
|
||||
pool->type != VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT)
|
||||
if (pool->vk.query_type != VK_QUERY_TYPE_OCCLUSION && pool->vk.query_type != VK_QUERY_TYPE_PIPELINE_STATISTICS &&
|
||||
pool->vk.query_type != VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT)
|
||||
return;
|
||||
|
||||
radv_rmv_log_bo_allocate(device, pool->bo, pool->size, is_internal);
|
||||
|
|
@ -618,7 +618,7 @@ radv_rmv_log_query_pool_create(struct radv_device *device, VkQueryPool _pool, bo
|
|||
create_token.is_driver_internal = is_internal;
|
||||
create_token.resource_id = vk_rmv_get_resource_id_locked(&device->vk, (uint64_t)_pool);
|
||||
create_token.type = VK_RMV_RESOURCE_TYPE_QUERY_HEAP;
|
||||
create_token.query_pool.type = pool->type;
|
||||
create_token.query_pool.type = pool->vk.query_type;
|
||||
create_token.query_pool.has_cpu_access = true;
|
||||
|
||||
vk_rmv_emit_token(&device->vk.memory_trace_data, VK_RMV_TOKEN_TYPE_RESOURCE_CREATE, &create_token);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue