From d20c0199d77ac70c6f782ffbebebacb2437dbbd2 Mon Sep 17 00:00:00 2001 From: Gordon-F Date: Fri, 19 Mar 2021 00:18:29 +0300 Subject: [PATCH] Properly return native shader module errors to users --- wgpu-core/src/conv.rs | 19 +++++++++++++++++++ wgpu-core/src/device/mod.rs | 21 +++++++++++++++++---- wgpu-core/src/pipeline.rs | 7 +++++++ 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/wgpu-core/src/conv.rs b/wgpu-core/src/conv.rs index 5c41c8789b..2b2fda8676 100644 --- a/wgpu-core/src/conv.rs +++ b/wgpu-core/src/conv.rs @@ -154,6 +154,25 @@ pub fn map_shader_stage_flags(shader_stage_flags: wgt::ShaderStage) -> hal::pso: value } +pub fn map_hal_flags_to_shader_stage( + shader_stage_flags: hal::pso::ShaderStageFlags, +) -> wgt::ShaderStage { + use hal::pso::ShaderStageFlags as H; + use wgt::ShaderStage as Ss; + + let mut value = Ss::empty(); + if shader_stage_flags.contains(H::VERTEX) { + value |= Ss::VERTEX; + } + if shader_stage_flags.contains(H::FRAGMENT) { + value |= Ss::FRAGMENT; + } + if shader_stage_flags.contains(H::COMPUTE) { + value |= Ss::COMPUTE; + } + value +} + pub fn map_extent(extent: &wgt::Extent3d, dim: wgt::TextureDimension) -> hal::image::Extent { hal::image::Extent { width: extent.width, diff --git a/wgpu-core/src/device/mod.rs b/wgpu-core/src/device/mod.rs index 260e8b0aa7..50e8780e34 100644 --- a/wgpu-core/src/device/mod.rs +++ b/wgpu-core/src/device/mod.rs @@ -1940,10 +1940,15 @@ impl Device { let raw = unsafe { self.raw.create_compute_pipeline(&pipeline_desc, None) }.map_err(|err| { match err { - hal::pso::CreationError::OutOfMemory(_) => DeviceError::OutOfMemory, + hal::pso::CreationError::OutOfMemory(_) => { + pipeline::CreateComputePipelineError::Device(DeviceError::OutOfMemory) + } + hal::pso::CreationError::ShaderCreationError(_, error) => { + pipeline::CreateComputePipelineError::Internal(error) + } _ => { log::error!("failed to create compute pipeline: {}", err); - DeviceError::OutOfMemory + pipeline::CreateComputePipelineError::Device(DeviceError::OutOfMemory) } } })?; @@ -2391,10 +2396,18 @@ impl Device { let raw = unsafe { self.raw.create_graphics_pipeline(&pipeline_desc, None) }.map_err(|err| { match err { - hal::pso::CreationError::OutOfMemory(_) => DeviceError::OutOfMemory, + hal::pso::CreationError::OutOfMemory(_) => { + pipeline::CreateRenderPipelineError::Device(DeviceError::OutOfMemory) + } + hal::pso::CreationError::ShaderCreationError(stage, error) => { + pipeline::CreateRenderPipelineError::Internal { + stage: conv::map_hal_flags_to_shader_stage(stage), + error, + } + } _ => { log::error!("failed to create graphics pipeline: {}", err); - DeviceError::OutOfMemory + pipeline::CreateRenderPipelineError::Device(DeviceError::OutOfMemory) } } })?; diff --git a/wgpu-core/src/pipeline.rs b/wgpu-core/src/pipeline.rs index 2f35c1a77b..0454fdde2a 100644 --- a/wgpu-core/src/pipeline.rs +++ b/wgpu-core/src/pipeline.rs @@ -113,6 +113,8 @@ pub enum CreateComputePipelineError { Implicit(#[from] ImplicitLayoutError), #[error(transparent)] Stage(validation::StageError), + #[error("Internal error: {0}")] + Internal(String), } #[derive(Debug)] @@ -234,6 +236,11 @@ pub enum CreateRenderPipelineError { #[source] error: validation::StageError, }, + #[error("Internal error in stage {stage:?}: {error}")] + Internal { + stage: wgt::ShaderStage, + error: String, + }, } bitflags::bitflags! {