Skip to content

Commit 15477b8

Browse files
committed
[wgpu-hal] make begin_render_pass fallible
1 parent 5ecc48d commit 15477b8

File tree

11 files changed

+47
-27
lines changed

11 files changed

+47
-27
lines changed

wgpu-core/src/command/clear.rs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -324,10 +324,10 @@ pub(crate) fn clear_texture<T: TextureTrackerSetSingle>(
324324
dst_raw,
325325
),
326326
TextureClearMode::Surface { .. } => {
327-
clear_texture_via_render_passes(dst_texture, range, true, encoder)
327+
clear_texture_via_render_passes(dst_texture, range, true, encoder)?
328328
}
329329
TextureClearMode::RenderPass { is_color, .. } => {
330-
clear_texture_via_render_passes(dst_texture, range, is_color, encoder)
330+
clear_texture_via_render_passes(dst_texture, range, is_color, encoder)?
331331
}
332332
TextureClearMode::None => {
333333
return Err(ClearError::NoValidTextureClearMode(
@@ -437,7 +437,7 @@ fn clear_texture_via_render_passes(
437437
range: TextureInitRange,
438438
is_color: bool,
439439
encoder: &mut dyn hal::DynCommandEncoder,
440-
) {
440+
) -> Result<(), ClearError> {
441441
assert_eq!(dst_texture.desc.dimension, wgt::TextureDimension::D2);
442442

443443
let extent_base = wgt::Extent3d {
@@ -487,18 +487,22 @@ fn clear_texture_via_render_passes(
487487
)
488488
};
489489
unsafe {
490-
encoder.begin_render_pass(&hal::RenderPassDescriptor {
491-
label: Some("(wgpu internal) clear_texture clear pass"),
492-
extent,
493-
sample_count: dst_texture.desc.sample_count,
494-
color_attachments,
495-
depth_stencil_attachment,
496-
multiview: None,
497-
timestamp_writes: None,
498-
occlusion_query_set: None,
499-
});
490+
encoder
491+
.begin_render_pass(&hal::RenderPassDescriptor {
492+
label: Some("(wgpu internal) clear_texture clear pass"),
493+
extent,
494+
sample_count: dst_texture.desc.sample_count,
495+
color_attachments,
496+
depth_stencil_attachment,
497+
multiview: None,
498+
timestamp_writes: None,
499+
occlusion_query_set: None,
500+
})
501+
.map_err(|e| dst_texture.device.handle_hal_error(e))?;
500502
encoder.end_render_pass();
501503
}
502504
}
503505
}
506+
507+
Ok(())
504508
}

wgpu-core/src/command/render.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1277,7 +1277,10 @@ impl<'d> RenderPassInfo<'d> {
12771277
occlusion_query_set: occlusion_query_set_hal,
12781278
};
12791279
unsafe {
1280-
encoder.raw.begin_render_pass(&hal_desc);
1280+
encoder
1281+
.raw
1282+
.begin_render_pass(&hal_desc)
1283+
.map_err(|e| device.handle_hal_error(e))?;
12811284
};
12821285
drop(color_attachments_hal); // Drop, so we can consume `color_attachments` for the tracker.
12831286

@@ -1313,6 +1316,7 @@ impl<'d> RenderPassInfo<'d> {
13131316

13141317
fn finish(
13151318
mut self,
1319+
device: &Device,
13161320
raw: &mut dyn hal::DynCommandEncoder,
13171321
snatch_guard: &SnatchGuard,
13181322
) -> Result<(UsageScope<'d>, SurfacesInDiscardState), RenderPassErrorInner> {
@@ -1375,7 +1379,8 @@ impl<'d> RenderPassInfo<'d> {
13751379
occlusion_query_set: None,
13761380
};
13771381
unsafe {
1378-
raw.begin_render_pass(&desc);
1382+
raw.begin_render_pass(&desc)
1383+
.map_err(|e| device.handle_hal_error(e))?;
13791384
raw.end_render_pass();
13801385
}
13811386
}
@@ -1974,7 +1979,7 @@ impl Global {
19741979

19751980
let (trackers, pending_discard_init_fixups) = state
19761981
.info
1977-
.finish(state.raw_encoder, state.snatch_guard)
1982+
.finish(device, state.raw_encoder, state.snatch_guard)
19781983
.map_pass_err(pass_scope)?;
19791984

19801985
encoder.close().map_pass_err(pass_scope)?;

wgpu-hal/examples/halmark/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -724,7 +724,7 @@ impl<A: hal::Api> Example<A> {
724724
occlusion_query_set: None,
725725
};
726726
unsafe {
727-
ctx.encoder.begin_render_pass(&pass_desc);
727+
ctx.encoder.begin_render_pass(&pass_desc).unwrap();
728728
ctx.encoder.set_render_pipeline(&self.pipeline);
729729
ctx.encoder
730730
.set_bind_group(&self.pipeline_layout, 0, &self.global_group, &[]);

wgpu-hal/examples/raw-gles.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ fn fill_screen(exposed: &hal::ExposedAdapter<hal::api::Gles>, width: u32, height
335335
};
336336
unsafe {
337337
encoder.begin_encoding(None).unwrap();
338-
encoder.begin_render_pass(&rp_desc);
338+
encoder.begin_render_pass(&rp_desc).unwrap();
339339
encoder.end_render_pass();
340340
let cmd_buf = encoder.end_encoding().unwrap();
341341
od.queue.submit(&[&cmd_buf], &[], (&mut fence, 0)).unwrap();

wgpu-hal/src/dx12/command.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -745,7 +745,7 @@ impl crate::CommandEncoder for super::CommandEncoder {
745745
unsafe fn begin_render_pass(
746746
&mut self,
747747
desc: &crate::RenderPassDescriptor<super::QuerySet, super::TextureView>,
748-
) {
748+
) -> Result<(), crate::DeviceError> {
749749
unsafe { self.begin_pass(super::PassKind::Render, desc.label) };
750750

751751
// Start timestamp if any (before all other commands but after debug marker)
@@ -867,6 +867,8 @@ impl crate::CommandEncoder for super::CommandEncoder {
867867
};
868868
unsafe { list.RSSetViewports(core::slice::from_ref(&raw_vp)) };
869869
unsafe { list.RSSetScissorRects(core::slice::from_ref(&raw_rect)) };
870+
871+
Ok(())
870872
}
871873

872874
unsafe fn end_render_pass(&mut self) {

wgpu-hal/src/dynamic/command.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ pub trait DynCommandEncoder: DynResource + core::fmt::Debug {
9494
unsafe fn begin_render_pass(
9595
&mut self,
9696
desc: &RenderPassDescriptor<dyn DynQuerySet, dyn DynTextureView>,
97-
);
97+
) -> Result<(), DeviceError>;
9898
unsafe fn end_render_pass(&mut self);
9999

100100
unsafe fn set_render_pipeline(&mut self, pipeline: &dyn DynRenderPipeline);
@@ -394,7 +394,7 @@ impl<C: CommandEncoder + DynResource> DynCommandEncoder for C {
394394
unsafe fn begin_render_pass(
395395
&mut self,
396396
desc: &RenderPassDescriptor<dyn DynQuerySet, dyn DynTextureView>,
397-
) {
397+
) -> Result<(), DeviceError> {
398398
let color_attachments = desc
399399
.color_attachments
400400
.iter()
@@ -424,7 +424,7 @@ impl<C: CommandEncoder + DynResource> DynCommandEncoder for C {
424424
.occlusion_query_set
425425
.map(|set| set.expect_downcast_ref()),
426426
};
427-
unsafe { C::begin_render_pass(self, &desc) };
427+
unsafe { C::begin_render_pass(self, &desc) }
428428
}
429429

430430
unsafe fn end_render_pass(&mut self) {

wgpu-hal/src/gles/command.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@ impl crate::CommandEncoder for super::CommandEncoder {
496496
unsafe fn begin_render_pass(
497497
&mut self,
498498
desc: &crate::RenderPassDescriptor<super::QuerySet, super::TextureView>,
499-
) {
499+
) -> Result<(), crate::DeviceError> {
500500
debug_assert!(self.state.end_of_pass_timestamp.is_none());
501501
if let Some(ref t) = desc.timestamp_writes {
502502
if let Some(index) = t.beginning_of_pass_write_index {
@@ -665,6 +665,7 @@ impl crate::CommandEncoder for super::CommandEncoder {
665665
.push(C::ClearStencil(dsat.clear_value.1));
666666
}
667667
}
668+
Ok(())
668669
}
669670
unsafe fn end_render_pass(&mut self) {
670671
for (attachment, dst) in self.state.resolve_attachments.drain(..) {

wgpu-hal/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1411,7 +1411,7 @@ pub trait CommandEncoder: WasmNotSendSync + fmt::Debug {
14111411
unsafe fn begin_render_pass(
14121412
&mut self,
14131413
desc: &RenderPassDescriptor<<Self::A as Api>::QuerySet, <Self::A as Api>::TextureView>,
1414-
);
1414+
) -> Result<(), DeviceError>;
14151415

14161416
/// End the current render pass.
14171417
///

wgpu-hal/src/metal/command.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,7 @@ impl crate::CommandEncoder for super::CommandEncoder {
517517
unsafe fn begin_render_pass(
518518
&mut self,
519519
desc: &crate::RenderPassDescriptor<super::QuerySet, super::TextureView>,
520-
) {
520+
) -> Result<(), crate::DeviceError> {
521521
self.begin_pass();
522522
self.state.index = None;
523523

@@ -650,6 +650,8 @@ impl crate::CommandEncoder for super::CommandEncoder {
650650
}
651651
self.state.render = Some(encoder.to_owned());
652652
});
653+
654+
Ok(())
653655
}
654656

655657
unsafe fn end_render_pass(&mut self) {

wgpu-hal/src/noop/command.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,11 @@ impl crate::CommandEncoder for CommandBuffer {
146146

147147
// render
148148

149-
unsafe fn begin_render_pass(&mut self, desc: &crate::RenderPassDescriptor<Resource, Resource>) {
149+
unsafe fn begin_render_pass(
150+
&mut self,
151+
desc: &crate::RenderPassDescriptor<Resource, Resource>,
152+
) -> DeviceResult<()> {
153+
Ok(())
150154
}
151155
unsafe fn end_render_pass(&mut self) {}
152156

0 commit comments

Comments
 (0)