From 30a2071ac7d6d4d6d24dbbb4a5cd4ac6339c3a4a Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Sat, 29 Jan 2022 09:41:03 -0800 Subject: [PATCH] d3d12: Handle indexed queries Reviewed-by: Sil Vilerino Part-of: --- src/gallium/drivers/d3d12/d3d12_query.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/gallium/drivers/d3d12/d3d12_query.cpp b/src/gallium/drivers/d3d12/d3d12_query.cpp index a62fdd5c53c..062a5f63e72 100644 --- a/src/gallium/drivers/d3d12/d3d12_query.cpp +++ b/src/gallium/drivers/d3d12/d3d12_query.cpp @@ -101,7 +101,7 @@ d3d12_query_heap_type(unsigned query_type, unsigned sub_query) } static D3D12_QUERY_TYPE -d3d12_query_type(unsigned query_type, unsigned sub_query) +d3d12_query_type(unsigned query_type, unsigned sub_query, unsigned index) { switch (query_type) { case PIPE_QUERY_OCCLUSION_COUNTER: @@ -117,7 +117,7 @@ d3d12_query_type(unsigned query_type, unsigned sub_query) D3D12_QUERY_TYPE_PIPELINE_STATISTICS; case PIPE_QUERY_PRIMITIVES_EMITTED: case PIPE_QUERY_SO_STATISTICS: - return D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0; + return (D3D12_QUERY_TYPE)(D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 + index); case PIPE_QUERY_TIMESTAMP: case PIPE_QUERY_TIME_ELAPSED: return D3D12_QUERY_TYPE_TIMESTAMP; @@ -143,7 +143,7 @@ d3d12_create_query(struct pipe_context *pctx, query->type = (pipe_query_type)query_type; for (unsigned i = 0; i < num_sub_queries(query_type); ++i) { assert(i < MAX_SUBQUERIES); - query->subqueries[i].d3d12qtype = d3d12_query_type(query_type, i); + query->subqueries[i].d3d12qtype = d3d12_query_type(query_type, i, index); query->subqueries[i].num_queries = 16; /* With timer queries we want a few more queries, especially since we need two slots @@ -155,21 +155,20 @@ d3d12_create_query(struct pipe_context *pctx, query->subqueries[i].num_queries = 1; query->subqueries[i].curr_query = 0; + desc.Count = query->subqueries[i].num_queries; + desc.Type = d3d12_query_heap_type(query_type, i); - switch (query->subqueries[i].d3d12qtype) { - case D3D12_QUERY_TYPE_PIPELINE_STATISTICS: + switch (desc.Type) { + case D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS: query->subqueries[i].query_size = sizeof(D3D12_QUERY_DATA_PIPELINE_STATISTICS); break; - case D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0: + case D3D12_QUERY_HEAP_TYPE_SO_STATISTICS: query->subqueries[i].query_size = sizeof(D3D12_QUERY_DATA_SO_STATISTICS); break; default: query->subqueries[i].query_size = sizeof(uint64_t); break; } - - desc.Count = query->subqueries[i].num_queries; - desc.Type = d3d12_query_heap_type(query_type, i); if (FAILED(screen->dev->CreateQueryHeap(&desc, IID_PPV_ARGS(&query->subqueries[i].query_heap)))) { FREE(query); @@ -258,6 +257,9 @@ accumulate_subresult(struct d3d12_context *ctx, struct d3d12_query *q_parent, break; case D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0: + case D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1: + case D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2: + case D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3: result->so_statistics.num_primitives_written += results_so[i].NumPrimitivesWritten; result->so_statistics.primitives_storage_needed += results_so[i].PrimitivesStorageNeeded; break;