Fix query resolve not marking buffer as initialized

-> on uninitialized buffers query results would be overriden with 0
This commit is contained in:
Andreas Reich 2021-06-27 08:22:05 +02:00
parent b6a6a67534
commit 34e770b281
3 changed files with 94 additions and 0 deletions

View File

@ -5,6 +5,7 @@
"buffer-copy.ron",
"clear-buffer-image.ron",
"buffer-zero-init.ron",
"pipeline-statistics-query.ron",
"quad.ron",
],
)

View File

@ -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,
)
]),
],
)

View File

@ -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<G: GlobalIdentityHandlerFactory> Global<G> {
.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,