1 /*
2 * Copyright © 2024 Collabora Ltd.
3 * SPDX-License-Identifier: MIT
4 */
5
6 #ifndef PANVK_QUERY_POOL_H
7 #define PANVK_QUERY_POOL_H
8
9 #ifndef PAN_ARCH
10 #error "PAN_ARCH must be defined"
11 #endif
12
13 #include <stdint.h>
14
15 #include "panvk_mempool.h"
16 #include "vk_query_pool.h"
17
18 #if PAN_ARCH >= 10
19 #include "panvk_cmd_buffer.h"
20 #endif
21
22 struct panvk_query_report {
23 uint64_t value;
24 };
25
26 struct panvk_query_available_obj {
27 #if PAN_ARCH >= 10
28 struct panvk_cs_sync32 sync_obj;
29 #else
30 uint32_t value;
31 #endif
32 };
33
34 static_assert(sizeof(struct panvk_query_report) == 8,
35 "panvk_query_report size is expected to be 8");
36
37 struct panvk_query_pool {
38 struct vk_query_pool vk;
39
40 uint32_t query_stride;
41 uint32_t reports_per_query;
42
43 struct panvk_priv_mem mem;
44 struct panvk_priv_mem available_mem;
45 };
46
47 VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_query_pool, vk.base, VkQueryPool,
48 VK_OBJECT_TYPE_QUERY_POOL)
49
50 static uint64_t
panvk_query_available_dev_addr(struct panvk_query_pool * pool,uint32_t query)51 panvk_query_available_dev_addr(struct panvk_query_pool *pool, uint32_t query)
52 {
53 assert(query < pool->vk.query_count);
54 return panvk_priv_mem_dev_addr(pool->available_mem) + query * sizeof(struct panvk_query_available_obj);
55 }
56
57 static struct panvk_query_available_obj *
panvk_query_available_host_addr(struct panvk_query_pool * pool,uint32_t query)58 panvk_query_available_host_addr(struct panvk_query_pool *pool, uint32_t query)
59 {
60 assert(query < pool->vk.query_count);
61 return (struct panvk_query_available_obj *)panvk_priv_mem_host_addr(pool->available_mem) + query;
62 }
63
64 static uint64_t
panvk_query_offset(struct panvk_query_pool * pool,uint32_t query)65 panvk_query_offset(struct panvk_query_pool *pool, uint32_t query)
66 {
67 assert(query < pool->vk.query_count);
68 return query * (uint64_t)pool->query_stride;
69 }
70
71 static uint64_t
panvk_query_report_dev_addr(struct panvk_query_pool * pool,uint32_t query)72 panvk_query_report_dev_addr(struct panvk_query_pool *pool, uint32_t query)
73 {
74 return panvk_priv_mem_dev_addr(pool->mem) + panvk_query_offset(pool, query);
75 }
76
77 static struct panvk_query_report *
panvk_query_report_host_addr(struct panvk_query_pool * pool,uint32_t query)78 panvk_query_report_host_addr(struct panvk_query_pool *pool, uint32_t query)
79 {
80 return (void *)((char *)panvk_priv_mem_host_addr(pool->mem) +
81 panvk_query_offset(pool, query));
82 }
83
84 #endif
85