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