diff --git a/player/tests/data/all.ron b/player/tests/data/all.ron index e519d793c..c96b96c38 100644 --- a/player/tests/data/all.ron +++ b/player/tests/data/all.ron @@ -5,6 +5,7 @@ "buffer-copy.ron", "clear-buffer-image.ron", "buffer-zero-init.ron", + "pipeline-statistics-query.ron", "quad.ron", ], ) \ No newline at end of file diff --git a/player/tests/data/pipeline-statistics-query.ron b/player/tests/data/pipeline-statistics-query.ron new file mode 100644 index 000000000..c765b9d58 --- /dev/null +++ b/player/tests/data/pipeline-statistics-query.ron @@ -0,0 +1,81 @@ +( + features: (bits: 0x0000_0000_0000_0008), // PIPELINE_STATISTICS_QUERY + expectations: [ + ( + name: "Queried number of compute invocations is correct", + buffer: (index: 0, epoch: 1), + offset: 0, + data: Raw([0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), + ), + ], + actions: [ + CreatePipelineLayout(Id(0, 1, Empty), ( + label: Some("empty"), + bind_group_layouts: [], + push_constant_ranges: [], + )), + CreateShaderModule( + id: Id(0, 1, Empty), + desc: ( + label: None, + flags: (bits: 3), + ), + data: "empty.wgsl", + ), + CreateComputePipeline( + id: Id(0, 1, Empty), + desc: ( + label: None, + layout: Some(Id(0, 1, Empty)), + stage: ( + module: Id(0, 1, Empty), + entry_point: "main", + ), + ), + ), + CreateQuerySet( + id: Id(0, 1, Empty), + desc: ( + label: Some("Compute Invocation QuerySet"), + count: 2, + ty: PipelineStatistics((bits: 0x10)), // COMPUTE_SHADER_INVOCATIONS + ), + ), + CreateBuffer( + Id(0, 1, Empty), + ( + label: Some("Compute Invocation Result Buffer"), + size: 8, + usage: ( + bits: 9, // COPY_DST | MAP_READ + ), + mapped_at_creation: false, + ), + ), + Submit(1, [ + RunComputePass( + base: ( + commands: [ + SetPipeline(Id(0, 1, Empty)), + BeginPipelineStatisticsQuery( + query_set_id: Id(0, 1, Empty), + query_index: 0, + ), + Dispatch((2, 3, 7,)), + EndPipelineStatisticsQuery, + ], + dynamic_offsets: [], + string_data: [], + push_constant_data: [], + ), + ), + ResolveQuerySet( + query_set_id: Id(0, 1, Empty), + start_query: 0, + query_count: 1, + destination: Id(0, 1, Empty), + destination_offset: 0, + ) + ]), + ], +) diff --git a/wgpu-core/src/command/query.rs b/wgpu-core/src/command/query.rs index f3e7fe320..2c81f2b2a 100644 --- a/wgpu-core/src/command/query.rs +++ b/wgpu-core/src/command/query.rs @@ -11,6 +11,7 @@ use crate::{ device::all_buffer_stages, hub::{GfxBackend, Global, GlobalIdentityHandlerFactory, Storage, Token}, id::{self, Id, TypedId}, + memory_init_tracker::{MemoryInitKind, MemoryInitTrackerAction}, resource::{BufferUse, QuerySet}, track::UseExtendError, Epoch, FastHashMap, Index, @@ -399,6 +400,17 @@ impl Global { .into()); } + cmd_buf.buffer_memory_init_actions.extend( + dst_buffer + .initialization_status + .check(buffer_start_offset..buffer_end_offset) + .map(|range| MemoryInitTrackerAction { + id: destination, + range, + kind: MemoryInitKind::ImplicitlyInitialized, + }), + ); + unsafe { cmd_buf_raw.pipeline_barrier( all_buffer_stages()..hal::pso::PipelineStage::TRANSFER,