std::mem::replace(&mut vec_pair.0[query as usize], true)
}
pubfn reset_queries(&mutself, raw_encoder: &mutdyn hal::DynCommandEncoder) { for (_, (state, query_set)) inself.map.drain() {
debug_assert_eq!(state.len(), query_set.desc.count as usize);
// Need to find all "runs" of values which need resets. If the state vector is: // [false, true, true, false, true], we want to reset [1..3, 4..5]. This minimizes // the amount of resets needed. letmut run_start: Option<u32> = None; for (idx, value) in state.into_iter().chain(iter::once(false)).enumerate() { match (run_start, value) { // We're inside of a run, do nothing
(Some(..), true) => {} // We've hit the end of a run, dispatch a reset
(Some(start), false) => {
run_start = None; unsafe { raw_encoder.reset_queries(query_set.raw(), start..idx as u32) };
} // We're starting a run
(None, true) => {
run_start = Some(idx as u32);
} // We're in a run of falses, do nothing.
(None, false) => {}
}
}
}
}
}
/// Error encountered when dealing with queries #[derive(Clone, Debug, Error)] #[non_exhaustive] pubenum QueryError { #[error(transparent)]
Device(#[from] DeviceError), #[error(transparent)]
Encoder(#[from] CommandEncoderError), #[error(transparent)]
MissingFeature(#[from] MissingFeatures), #[error("Error encountered while trying to use queries")] Use(#[from] QueryUseError), #[error("Error encountered while trying to resolve a query")]
Resolve(#[from] ResolveError), #[error(transparent)]
DestroyedResource(#[from] DestroyedResourceError), #[error(transparent)]
InvalidResource(#[from] InvalidResourceError),
}
/// Error encountered while trying to use queries #[derive(Clone, Debug, Error)] #[non_exhaustive] pubenum QueryUseError { #[error(transparent)]
Device(#[from] DeviceError), #[error("Query {query_index} is out of bounds for a query set of size {query_set_size}")]
OutOfBounds {
query_index: u32,
query_set_size: u32,
}, #[error("Query {query_index} has already been used within the same renderpass. Queries must only be used once per renderpass")]
UsedTwiceInsideRenderpass { query_index: u32 }, #[error("Query {new_query_index} was started while query {active_query_index} was already active. No more than one statistic or occlusion query may be active at once")]
AlreadyStarted {
active_query_index: u32,
new_query_index: u32,
}, #[error("Query was stopped while there was no active query")]
AlreadyStopped, #[error("A query of type {query_type:?} was started using a query set of type {set_type:?}")]
IncompatibleType {
set_type: SimplifiedQueryType,
query_type: SimplifiedQueryType,
},
}
/// Error encountered while trying to resolve a query. #[derive(Clone, Debug, Error)] #[non_exhaustive] pubenum ResolveError { #[error(transparent)]
MissingBufferUsage(#[from] MissingBufferUsageError), #[error("Resolve buffer offset has to be aligned to `QUERY_RESOLVE_BUFFER_ALIGNMENT")]
BufferOffsetAlignment, #[error("Resolving queries {start_query}..{end_query} would overrun the query set of size {query_set_size}")]
QueryOverrun {
start_query: u32,
end_query: u32,
query_set_size: u32,
}, #[error("Resolving queries {start_query}..{end_query} ({stride} byte queries) will end up overrunning the bounds of the destination buffer of size {buffer_size} using offsets {buffer_start_offset}..{buffer_end_offset}")]
BufferOverrun {
start_query: u32,
end_query: u32,
stride: u32,
buffer_size: BufferAddress,
buffer_start_offset: BufferAddress,
buffer_end_offset: BufferAddress,
},
}
impl QuerySet { pub(crate) fn validate_query( self: &Arc<Self>,
query_type: SimplifiedQueryType,
query_index: u32,
reset_state: Option<&mut QueryResetMap>,
) -> Result<(), QueryUseError> { // We need to defer our resets because we are in a renderpass, // add the usage to the reset map. iflet Some(reset) = reset_state { let used = reset.use_query_set(self, query_index); if used { return Err(QueryUseError::UsedTwiceInsideRenderpass { query_index });
}
}
let simple_set_type = SimplifiedQueryType::from(self.desc.ty); if simple_set_type != query_type { return Err(QueryUseError::IncompatibleType {
query_type,
set_type: simple_set_type,
});
}
unsafe { // If we don't have a reset state tracker which can defer resets, we must reset now. if needs_reset {
raw_encoder.reset_queries(self.raw(), query_index..(query_index + 1));
}
raw_encoder.write_timestamp(self.raw(), query_index);
}
unsafe { // If we don't have a reset state tracker which can defer resets, we must reset now. if needs_reset {
raw_encoder.reset_queries(query_set.raw(), query_index..(query_index + 1));
}
raw_encoder.begin_query(query_set.raw(), query_index);
}
unsafe { // If we don't have a reset state tracker which can defer resets, we must reset now. if needs_reset {
raw_encoder.reset_queries(query_set.raw(), query_index..(query_index + 1));
}
raw_encoder.begin_query(query_set.raw(), query_index);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.