[wgpu-core] use Fallible for ShaderModule

This commit is contained in:
teoxoy 2024-09-06 22:04:01 +02:00 committed by Teodor Tanasoaia
parent 1c5793afb3
commit 5bcdd4266e
3 changed files with 24 additions and 23 deletions

View File

@ -921,14 +921,14 @@ impl Global {
Err(e) => break 'error e,
};
let id = fid.assign(shader);
let id = fid.assign(Fallible::Valid(shader));
api_log!("Device::create_shader_module -> {id:?}");
return (id, None);
};
log::error!("Device::create_shader_module error: {error}");
let id = fid.assign_error();
let id = fid.assign(Fallible::Invalid(Arc::new(desc.label.to_string())));
(id, Some(error))
}
@ -972,14 +972,14 @@ impl Global {
Ok(shader) => shader,
Err(e) => break 'error e,
};
let id = fid.assign(shader);
let id = fid.assign(Fallible::Valid(shader));
api_log!("Device::create_shader_module_spirv -> {id:?}");
return (id, None);
};
log::error!("Device::create_shader_module_spirv error: {error}");
let id = fid.assign_error();
let id = fid.assign(Fallible::Invalid(Arc::new(desc.label.to_string())));
(id, Some(error))
}
@ -989,12 +989,13 @@ impl Global {
let hub = &self.hub;
if let Some(shader_module) = hub.shader_modules.unregister(shader_module_id) {
let _shader_module = hub.shader_modules.strict_unregister(shader_module_id);
#[cfg(feature = "trace")]
if let Ok(shader_module) = _shader_module.get() {
if let Some(t) = shader_module.device.trace.lock().as_mut() {
t.add(trace::Action::DestroyShaderModule(shader_module_id));
}
drop(shader_module)
}
}
@ -1241,10 +1242,11 @@ impl Global {
let vertex = {
let module = hub
.shader_modules
.get(desc.vertex.stage.module)
.map_err(|_| pipeline::CreateRenderPipelineError::Stage {
.strict_get(desc.vertex.stage.module)
.get()
.map_err(|e| pipeline::CreateRenderPipelineError::Stage {
stage: wgt::ShaderStages::VERTEX,
error: crate::validation::StageError::InvalidModule,
error: e.into(),
});
let module = match module {
Ok(module) => module,
@ -1266,11 +1268,13 @@ impl Global {
};
let fragment = if let Some(ref state) = desc.fragment {
let module = hub.shader_modules.get(state.stage.module).map_err(|_| {
pipeline::CreateRenderPipelineError::Stage {
let module = hub
.shader_modules
.strict_get(state.stage.module)
.get()
.map_err(|e| pipeline::CreateRenderPipelineError::Stage {
stage: wgt::ShaderStages::FRAGMENT,
error: crate::validation::StageError::InvalidModule,
}
error: e.into(),
});
let module = match module {
Ok(module) => module,
@ -1476,10 +1480,7 @@ impl Global {
Err(e) => break 'error e,
};
let module = hub
.shader_modules
.get(desc.stage.module)
.map_err(|_| crate::validation::StageError::InvalidModule);
let module = hub.shader_modules.strict_get(desc.stage.module).get();
let module = match module {
Ok(module) => module,
Err(e) => break 'error e.into(),

View File

@ -166,7 +166,7 @@ pub struct Hub {
pub(crate) devices: Registry<Arc<Device>>,
pub(crate) queues: Registry<Arc<Queue>>,
pub(crate) pipeline_layouts: Registry<Fallible<PipelineLayout>>,
pub(crate) shader_modules: Registry<Arc<ShaderModule>>,
pub(crate) shader_modules: Registry<Fallible<ShaderModule>>,
pub(crate) bind_group_layouts: Registry<Fallible<BindGroupLayout>>,
pub(crate) bind_groups: Registry<Fallible<BindGroup>>,
pub(crate) command_buffers: Registry<Arc<CommandBuffer>>,

View File

@ -1,4 +1,4 @@
use crate::{device::bgl, FastHashMap, FastHashSet};
use crate::{device::bgl, resource::InvalidResourceError, FastHashMap, FastHashSet};
use arrayvec::ArrayVec;
use std::{collections::hash_map::Entry, fmt};
use thiserror::Error;
@ -200,8 +200,6 @@ pub enum InputError {
#[derive(Clone, Debug, Error)]
#[non_exhaustive]
pub enum StageError {
#[error("Shader module is invalid")]
InvalidModule,
#[error(
"Shader entry point's workgroup size {current:?} ({current_total} total invocations) must be less or equal to the per-dimension limit {limit:?} and the total invocation limit {total}"
)]
@ -241,6 +239,8 @@ pub enum StageError {
but no entry point was specified"
)]
MultipleEntryPointsFound,
#[error(transparent)]
InvalidResource(#[from] InvalidResourceError),
}
fn map_storage_format_to_naga(format: wgt::TextureFormat) -> Option<naga::StorageFormat> {