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