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