• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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