/* * Copyright © 2024 Collabora Ltd. * SPDX-License-Identifier: MIT */ #ifndef PANVK_QUERY_POOL_H #define PANVK_QUERY_POOL_H #ifndef PAN_ARCH #error "PAN_ARCH must be defined" #endif #include #include "panvk_mempool.h" #include "vk_query_pool.h" #if PAN_ARCH >= 10 #include "panvk_cmd_buffer.h" #endif struct panvk_query_report { uint64_t value; }; struct panvk_query_available_obj { #if PAN_ARCH >= 10 struct panvk_cs_sync32 sync_obj; #else uint32_t value; #endif }; static_assert(sizeof(struct panvk_query_report) == 8, "panvk_query_report size is expected to be 8"); struct panvk_query_pool { struct vk_query_pool vk; uint32_t query_stride; uint32_t reports_per_query; struct panvk_priv_mem mem; struct panvk_priv_mem available_mem; }; VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_query_pool, vk.base, VkQueryPool, VK_OBJECT_TYPE_QUERY_POOL) static uint64_t panvk_query_available_dev_addr(struct panvk_query_pool *pool, uint32_t query) { assert(query < pool->vk.query_count); return panvk_priv_mem_dev_addr(pool->available_mem) + query * sizeof(struct panvk_query_available_obj); } static struct panvk_query_available_obj * panvk_query_available_host_addr(struct panvk_query_pool *pool, uint32_t query) { assert(query < pool->vk.query_count); return (struct panvk_query_available_obj *)panvk_priv_mem_host_addr(pool->available_mem) + query; } static uint64_t panvk_query_offset(struct panvk_query_pool *pool, uint32_t query) { assert(query < pool->vk.query_count); return query * (uint64_t)pool->query_stride; } static uint64_t panvk_query_report_dev_addr(struct panvk_query_pool *pool, uint32_t query) { return panvk_priv_mem_dev_addr(pool->mem) + panvk_query_offset(pool, query); } static struct panvk_query_report * panvk_query_report_host_addr(struct panvk_query_pool *pool, uint32_t query) { return (void *)((char *)panvk_priv_mem_host_addr(pool->mem) + panvk_query_offset(pool, query)); } #endif