v3dv: implement VK_EXT_host_query_reset

Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13319>
This commit is contained in:
Ella-0 2021-10-12 16:58:33 +00:00 committed by Marge Bot
parent 393fda2d34
commit 835b98e101
5 changed files with 54 additions and 19 deletions

View File

@ -464,7 +464,7 @@ Vulkan 1.2 -- all DONE: anv, vn
VK_KHR_uniform_buffer_standard_layout DONE (anv, lvp, radv, tu, v3dv, vn)
VK_KHR_vulkan_memory_model DONE (anv, radv, tu, vn)
VK_EXT_descriptor_indexing DONE (anv/gen9+, radv, tu, vn)
VK_EXT_host_query_reset DONE (anv, lvp, radv, tu, vn)
VK_EXT_host_query_reset DONE (anv, lvp, radv, tu, v3dv, vn)
VK_EXT_sampler_filter_minmax DONE (anv/gen9+, lvp, radv, tu, vn)
VK_EXT_scalar_block_layout DONE (anv, lvp, radv/gfx7+, tu, vn)
VK_EXT_separate_stencil_usage DONE (anv, lvp, tu, vn)

View File

@ -143,6 +143,7 @@ get_device_extensions(const struct v3dv_physical_device *device,
.EXT_color_write_enable = true,
.EXT_custom_border_color = true,
.EXT_external_memory_dma_buf = true,
.EXT_host_query_reset = true,
.EXT_index_type_uint8 = true,
.EXT_physical_device_drm = true,
.EXT_pipeline_creation_cache_control = true,
@ -1137,6 +1138,14 @@ v3dv_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
break;
}
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES: {
VkPhysicalDeviceHostQueryResetFeatures *features =
(void *) ext;
features->hostQueryReset = true;
break;
}
/* Vulkan 1.1 */
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: {
VkPhysicalDeviceVulkan11Features *features =

View File

@ -1270,6 +1270,11 @@ VkResult v3dv_get_query_pool_results_cpu(struct v3dv_device *device,
VkDeviceSize stride,
VkQueryResultFlags flags);
void v3dv_reset_query_pools(struct v3dv_device *device,
struct v3dv_query_pool *query_pool,
uint32_t first,
uint32_t last);
typedef void (*v3dv_cmd_buffer_private_obj_destroy_cb)(VkDevice device,
uint64_t pobj,
VkAllocationCallbacks *alloc);

View File

@ -351,3 +351,41 @@ v3dv_CmdEndQuery(VkCommandBuffer commandBuffer,
v3dv_cmd_buffer_end_query(cmd_buffer, pool, query);
}
void
v3dv_reset_query_pools(struct v3dv_device *device,
struct v3dv_query_pool *pool,
uint32_t first,
uint32_t count)
{
for (uint32_t i = first; i < first + count; i++) {
assert(i < pool->query_count);
struct v3dv_query *q = &pool->queries[i];
q->maybe_available = false;
switch (pool->query_type) {
case VK_QUERY_TYPE_OCCLUSION: {
const uint8_t *q_addr = ((uint8_t *) q->bo->map) + q->offset;
uint32_t *counter = (uint32_t *) q_addr;
*counter = 0;
break;
}
case VK_QUERY_TYPE_TIMESTAMP:
q->value = 0;
break;
default:
unreachable("Unsupported query type");
}
}
}
VKAPI_ATTR void VKAPI_CALL
v3dv_ResetQueryPool(VkDevice _device,
VkQueryPool queryPool,
uint32_t firstQuery,
uint32_t queryCount)
{
V3DV_FROM_HANDLE(v3dv_device, device, _device);
V3DV_FROM_HANDLE(v3dv_query_pool, pool, queryPool);
v3dv_reset_query_pools(device, pool, firstQuery, queryCount);
}

View File

@ -176,24 +176,7 @@ handle_reset_query_cpu_job(struct v3dv_job *job)
if (info->pool->query_type == VK_QUERY_TYPE_OCCLUSION)
v3dv_bo_wait(job->device, info->pool->bo, PIPE_TIMEOUT_INFINITE);
for (uint32_t i = info->first; i < info->first + info->count; i++) {
assert(i < info->pool->query_count);
struct v3dv_query *q = &info->pool->queries[i];
q->maybe_available = false;
switch (info->pool->query_type) {
case VK_QUERY_TYPE_OCCLUSION: {
const uint8_t *q_addr = ((uint8_t *) q->bo->map) + q->offset;
uint32_t *counter = (uint32_t *) q_addr;
*counter = 0;
break;
}
case VK_QUERY_TYPE_TIMESTAMP:
q->value = 0;
break;
default:
unreachable("Unsupported query type");
}
}
v3dv_reset_query_pools(job->device, info->pool, info->first, info->count);
return VK_SUCCESS;
}