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