From 34fd2da6039dbc360720c3bbcb9636f78ed900be Mon Sep 17 00:00:00 2001 From: Almar Klein Date: Wed, 22 Nov 2023 17:41:53 +0100 Subject: [PATCH] GetBindGroupLayout 'raises error' instead of panicing on invalid index (#320) --- src/lib.rs | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 747ed76b..7a369c10 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -147,6 +147,7 @@ pub struct WGPUComputePassEncoderImpl { pub struct WGPUComputePipelineImpl { context: Arc, id: id::ComputePipelineId, + error_sink: ErrorSink, } impl Drop for WGPUComputePipelineImpl { fn drop(&mut self) { @@ -245,6 +246,7 @@ pub struct WGPURenderPassEncoderImpl { pub struct WGPURenderPipelineImpl { context: Arc, id: id::RenderPipelineId, + error_sink: ErrorSink, } impl Drop for WGPURenderPipelineImpl { fn drop(&mut self) { @@ -1680,17 +1682,21 @@ pub unsafe extern "C" fn wgpuComputePipelineGetBindGroupLayout( pipeline: native::WGPUComputePipeline, group_index: u32, ) -> native::WGPUBindGroupLayout { - let (pipeline_id, context) = { + let (pipeline_id, context, error_sink) = { let pipeline = pipeline.as_ref().expect("invalid pipeline"); - (pipeline.id, &pipeline.context) + (pipeline.id, &pipeline.context, &pipeline.error_sink) }; let (bind_group_layout_id, error) = gfx_select!(pipeline_id => context.compute_pipeline_get_bind_group_layout(pipeline_id, group_index, ())); if let Some(cause) = error { - panic!( - "Error in wgpuComputePipelineGetBindGroupLayout: Error reflecting bind group {group_index}: {f}", - f = format_error(context, &cause) - ); + handle_error( + context, + error_sink, + cause, + "", + None, + "wgpuComputePipelineGetBindGroupLayout", + ) } Arc::into_raw(Arc::new(WGPUBindGroupLayoutImpl { @@ -1945,6 +1951,7 @@ pub unsafe extern "C" fn wgpuDeviceCreateComputePipeline( Arc::into_raw(Arc::new(WGPUComputePipelineImpl { context: context.clone(), id: compute_pipeline_id, + error_sink: error_sink.clone(), })) } @@ -2227,6 +2234,7 @@ pub unsafe extern "C" fn wgpuDeviceCreateRenderPipeline( Arc::into_raw(Arc::new(WGPURenderPipelineImpl { context: context.clone(), id: render_pipeline_id, + error_sink: error_sink.clone(), })) } @@ -3500,17 +3508,24 @@ pub unsafe extern "C" fn wgpuRenderPipelineGetBindGroupLayout( render_pipeline: native::WGPURenderPipeline, group_index: u32, ) -> native::WGPUBindGroupLayout { - let (render_pipeline_id, context) = { + let (render_pipeline_id, context, error_sink) = { let render_pipeline = render_pipeline.as_ref().expect("invalid render pipeline"); - (render_pipeline.id, &render_pipeline.context) + ( + render_pipeline.id, + &render_pipeline.context, + &render_pipeline.error_sink, + ) }; - let (bind_group_layout_id, error) = gfx_select!(render_pipeline_id => context.render_pipeline_get_bind_group_layout(render_pipeline_id, group_index, ())); if let Some(cause) = error { - panic!( - "Error in wgpuRenderPipelineGetBindGroupLayout: Error reflecting bind group {group_index}: {f}", - f = format_error(context, &cause) - ); + handle_error( + context, + error_sink, + cause, + "", + None, + "wgpuRenderPipelineGetBindGroupLayout", + ) } Arc::into_raw(Arc::new(WGPUBindGroupLayoutImpl {