xref: /aosp_15_r20/external/mesa3d/src/intel/shaders/query_copy.cl (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1/* Copyright © 2023 Intel Corporation
2 * SPDX-License-Identifier: MIT
3 */
4
5void
6genX(libanv_query_copy)(global void *destination_base,
7                        uint32_t destination_stride,
8                        global void *query_data,
9                        uint32_t first_query,
10                        uint32_t num_queries,
11                        uint32_t query_data_offset,
12                        uint32_t query_stride,
13                        uint32_t num_query_items,
14                        uint32_t copy_flags,
15                        uint32_t copy_item_idx)
16{
17   if (copy_item_idx >= num_queries)
18      return;
19
20   bool is_result64     = (copy_flags & ANV_COPY_QUERY_FLAG_RESULT64) != 0;
21   bool write_available = (copy_flags & ANV_COPY_QUERY_FLAG_AVAILABLE) != 0;
22   bool compute_delta   = (copy_flags & ANV_COPY_QUERY_FLAG_DELTA) != 0;
23   bool partial_result  = (copy_flags & ANV_COPY_QUERY_FLAG_PARTIAL) != 0;
24
25
26   uint query_byte = (first_query + copy_item_idx) * query_stride;
27   uint query_data_byte = query_byte + query_data_offset;
28
29   global uint64_t *query = query_data + (first_query + copy_item_idx) * query_stride;
30   global uint64_t *dest64 = destination_base + copy_item_idx * destination_stride;
31   global uint32_t *dest32 = destination_base + copy_item_idx * destination_stride;
32
33   uint64_t availability = *(global uint32_t *)(query_data + query_byte);
34
35   if (write_available) {
36      if (is_result64)
37         dest64[num_query_items] = availability;
38      else
39         dest32[num_query_items] = availability;
40   }
41
42   for (uint32_t i = 0; i < num_query_items; i++) {
43      uint32_t qw_offset = 1 + i * 2;
44      uint64_t v;
45      if (compute_delta) {
46         struct delta64 {
47            uint64_t v0;
48            uint64_t v1;
49         } data = *((global struct delta64 *)&query[qw_offset]);
50         v = data.v1 - data.v0;
51      } else {
52         v = query[qw_offset + 0];
53      }
54
55      /* vkCmdCopyQueryPoolResults:
56       *
57       *    "If VK_QUERY_RESULT_PARTIAL_BIT is set, then for any query that is
58       *     unavailable, an intermediate result between zero and the final
59       *     result value is written for that query."
60       *
61       * We write 0 as the values not being written yet, we can't really make
62       * provide any sensible value.
63       */
64      if (partial_result && availability == 0)
65         v = 0;
66
67      if (is_result64)
68         dest64[i] = v;
69      else
70         dest32[i] = v;
71   }
72}
73