Fix Occlusion Queries on Mac (#4001)

This commit is contained in:
Connor Fitzgerald 2023-08-02 19:10:21 -04:00 committed by GitHub
parent 3305e88d63
commit d11d2f96dc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 33 additions and 6 deletions

View File

@ -453,6 +453,7 @@ fn clear_texture_via_render_passes<A: hal::Api>(
depth_stencil_attachment,
multiview: None,
timestamp_writes: None,
occlusion_query_set: None,
});
encoder.end_render_pass();
}

View File

@ -758,6 +758,7 @@ impl<'a, A: HalApi> RenderPassInfo<'a, A> {
color_attachments: &[Option<RenderPassColorAttachment>],
depth_stencil_attachment: Option<&RenderPassDepthStencilAttachment>,
timestamp_writes: Option<&RenderPassTimestampWrites>,
occlusion_query_set: Option<id::QuerySetId>,
cmd_buf: &mut CommandBuffer<A>,
view_guard: &'a Storage<TextureView<A>, id::TextureViewId>,
buffer_guard: &'a Storage<Buffer<A>, id::BufferId>,
@ -1151,6 +1152,18 @@ impl<'a, A: HalApi> RenderPassInfo<'a, A> {
None
};
let occlusion_query_set = if let Some(occlusion_query_set) = occlusion_query_set {
let query_set = cmd_buf
.trackers
.query_sets
.add_single(query_set_guard, occlusion_query_set)
.ok_or(RenderPassErrorInner::InvalidQuerySet(occlusion_query_set))?;
Some(&query_set.raw)
} else {
None
};
let hal_desc = hal::RenderPassDescriptor {
label,
extent,
@ -1159,6 +1172,7 @@ impl<'a, A: HalApi> RenderPassInfo<'a, A> {
depth_stencil_attachment: depth_stencil,
multiview,
timestamp_writes,
occlusion_query_set,
};
unsafe {
cmd_buf.encoder.raw.begin_render_pass(&hal_desc);
@ -1247,6 +1261,7 @@ impl<'a, A: HalApi> RenderPassInfo<'a, A> {
}),
multiview: self.multiview,
timestamp_writes: None,
occlusion_query_set: None,
};
unsafe {
raw.begin_render_pass(&desc);
@ -1343,6 +1358,7 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
color_attachments,
depth_stencil_attachment,
timestamp_writes,
occlusion_query_set_id,
cmd_buf,
&*view_guard,
&*buffer_guard,

View File

@ -680,6 +680,7 @@ impl<A: hal::Api> Example<A> {
depth_stencil_attachment: None,
multiview: None,
timestamp_writes: None,
occlusion_query_set: None,
};
unsafe {
ctx.encoder.begin_render_pass(&pass_desc);

View File

@ -176,6 +176,7 @@ fn fill_screen(exposed: &hal::ExposedAdapter<hal::api::Gles>, width: u32, height
depth_stencil_attachment: None,
multiview: None,
timestamp_writes: None,
occlusion_query_set: None,
};
unsafe {
encoder.begin_encoding(None).unwrap();

View File

@ -465,7 +465,13 @@ pub trait CommandEncoder<A: Api>: WasmNotSend + WasmNotSync + fmt::Debug {
// queries
/// # Safety:
///
/// - If `set` is an occlusion query set, it must be the same one as used in the [`RenderPassDescriptor::occlusion_query_set`] parameter.
unsafe fn begin_query(&mut self, set: &A::QuerySet, index: u32);
/// # Safety:
///
/// - If `set` is an occlusion query set, it must be the same one as used in the [`RenderPassDescriptor::occlusion_query_set`] parameter.
unsafe fn end_query(&mut self, set: &A::QuerySet, index: u32);
unsafe fn write_timestamp(&mut self, set: &A::QuerySet, index: u32);
unsafe fn reset_queries(&mut self, set: &A::QuerySet, range: Range<u32>);
@ -1293,6 +1299,7 @@ pub struct RenderPassDescriptor<'a, A: Api> {
pub depth_stencil_attachment: Option<DepthStencilAttachment<'a, A>>,
pub multiview: Option<NonZeroU32>,
pub timestamp_writes: Option<RenderPassTimestampWrites<'a, A>>,
pub occlusion_query_set: Option<&'a A::QuerySet>,
}
#[derive(Debug)]

View File

@ -385,7 +385,6 @@ impl crate::CommandEncoder<super::Api> for super::CommandEncoder {
objc::rc::autoreleasepool(|| {
let descriptor = metal::RenderPassDescriptor::new();
//TODO: set visibility results buffer
for (i, at) in desc.color_attachments.iter().enumerate() {
if let Some(at) = at.as_ref() {
@ -454,11 +453,8 @@ impl crate::CommandEncoder<super::Api> for super::CommandEncoder {
}
}
if let Some(timestamp_writes) = desc.timestamp_writes.as_ref() {
let sba_descriptor = descriptor
.sample_buffer_attachments()
.object_at(0 as _)
.unwrap();
if let Some(ref timestamp_writes) = desc.timestamp_writes {
let sba_descriptor = descriptor.sample_buffer_attachments().object_at(0).unwrap();
sba_descriptor.set_sample_buffer(
timestamp_writes
.query_set
@ -475,6 +471,11 @@ impl crate::CommandEncoder<super::Api> for super::CommandEncoder {
}
}
if let Some(occlusion_query_set) = desc.occlusion_query_set {
descriptor
.set_visibility_result_buffer(Some(occlusion_query_set.raw_buffer.as_ref()))
}
let raw = self.raw_cmd_buf.as_ref().unwrap();
let encoder = raw.new_render_command_encoder(descriptor);
if let Some(label) = desc.label {