remove label getters from Global

Also removes label from `Element::Error` and slightly refactors ContextError.
This commit is contained in:
teoxoy 2024-06-28 19:09:43 +02:00 committed by Teodor Tanasoaia
parent 9d3d4ee297
commit ed1e8ecf4b
12 changed files with 85 additions and 388 deletions

View File

@ -146,7 +146,6 @@ pub fn op_webgpu_create_compute_pipeline(
#[serde(rename_all = "camelCase")]
pub struct PipelineLayout {
rid: ResourceId,
label: String,
err: Option<WebGpuError>,
}
@ -165,9 +164,6 @@ pub fn op_webgpu_compute_pipeline_get_bind_group_layout(
let (bind_group_layout, maybe_err) = gfx_select!(compute_pipeline => instance.compute_pipeline_get_bind_group_layout(compute_pipeline, index, None));
let label =
gfx_select!(bind_group_layout => instance.bind_group_layout_label(bind_group_layout));
let rid = state
.resource_table
.add(super::binding::WebGpuBindGroupLayout(
@ -177,7 +173,6 @@ pub fn op_webgpu_compute_pipeline_get_bind_group_layout(
Ok(PipelineLayout {
rid,
label,
err: maybe_err.map(WebGpuError::from),
})
}
@ -441,9 +436,6 @@ pub fn op_webgpu_render_pipeline_get_bind_group_layout(
let (bind_group_layout, maybe_err) = gfx_select!(render_pipeline => instance.render_pipeline_get_bind_group_layout(render_pipeline, index, None));
let label =
gfx_select!(bind_group_layout => instance.bind_group_layout_label(bind_group_layout));
let rid = state
.resource_table
.add(super::binding::WebGpuBindGroupLayout(
@ -453,7 +445,6 @@ pub fn op_webgpu_render_pipeline_get_bind_group_layout(
Ok(PipelineLayout {
rid,
label,
err: maybe_err.map(WebGpuError::from),
})
}

View File

@ -4,7 +4,7 @@ use crate::{
api_log, binding_model, command, conv,
device::{
bgl, life::WaitIdleError, map_buffer, queue, DeviceError, DeviceLostClosure,
DeviceLostReason, HostMap, IMPLICIT_BIND_GROUP_LAYOUT_ERROR_LABEL,
DeviceLostReason, HostMap,
},
global::Global,
hal_api::HalApi,
@ -17,7 +17,7 @@ use crate::{
self, BufferAccessError, BufferAccessResult, BufferMapOperation, CreateBufferError,
Trackable,
},
Label, LabelHelpers as _,
Label,
};
use arrayvec::ArrayVec;
@ -284,7 +284,7 @@ impl Global {
.schedule_resource_destruction(queue::TempResource::Buffer(Arc::new(buffer)), !0);
}
let id = fid.assign_error(desc.label.borrow_or_default());
let id = fid.assign_error();
(id, Some(error))
}
@ -316,32 +316,28 @@ impl Global {
/// [`device_create_buffer`]: Global::device_create_buffer
/// [`usage`]: https://www.w3.org/TR/webgpu/#dom-gputexturedescriptor-usage
/// [`wgpu_types::BufferUsages`]: wgt::BufferUsages
pub fn create_buffer_error<A: HalApi>(&self, id_in: Option<id::BufferId>, label: Label) {
pub fn create_buffer_error<A: HalApi>(&self, id_in: Option<id::BufferId>) {
let hub = A::hub(self);
let fid = hub.buffers.prepare(id_in);
fid.assign_error(label.borrow_or_default());
fid.assign_error();
}
pub fn create_render_bundle_error<A: HalApi>(
&self,
id_in: Option<id::RenderBundleId>,
label: Label,
) {
pub fn create_render_bundle_error<A: HalApi>(&self, id_in: Option<id::RenderBundleId>) {
let hub = A::hub(self);
let fid = hub.render_bundles.prepare(id_in);
fid.assign_error(label.borrow_or_default());
fid.assign_error();
}
/// Assign `id_in` an error with the given `label`.
///
/// See `create_buffer_error` for more context and explanation.
pub fn create_texture_error<A: HalApi>(&self, id_in: Option<id::TextureId>, label: Label) {
pub fn create_texture_error<A: HalApi>(&self, id_in: Option<id::TextureId>) {
let hub = A::hub(self);
let fid = hub.textures.prepare(id_in);
fid.assign_error(label.borrow_or_default());
fid.assign_error();
}
#[cfg(feature = "replay")]
@ -474,10 +470,6 @@ impl Global {
Ok(())
}
pub fn buffer_label<A: HalApi>(&self, id: id::BufferId) -> String {
A::hub(self).buffers.label_for_resource(id)
}
pub fn buffer_destroy<A: HalApi>(
&self,
buffer_id: id::BufferId,
@ -598,7 +590,7 @@ impl Global {
log::error!("Device::create_texture error: {error}");
let id = fid.assign_error(desc.label.borrow_or_default());
let id = fid.assign_error();
(id, Some(error))
}
@ -671,7 +663,7 @@ impl Global {
log::error!("Device::create_texture error: {error}");
let id = fid.assign_error(desc.label.borrow_or_default());
let id = fid.assign_error();
(id, Some(error))
}
@ -721,14 +713,10 @@ impl Global {
log::error!("Device::create_buffer error: {error}");
let id = fid.assign_error(desc.label.borrow_or_default());
let id = fid.assign_error();
(id, Some(error))
}
pub fn texture_label<A: HalApi>(&self, id: id::TextureId) -> String {
A::hub(self).textures.label_for_resource(id)
}
pub fn texture_destroy<A: HalApi>(
&self,
texture_id: id::TextureId,
@ -855,14 +843,10 @@ impl Global {
};
log::error!("Texture::create_view({texture_id:?}) error: {error}");
let id = fid.assign_error(desc.label.borrow_or_default());
let id = fid.assign_error();
(id, Some(error))
}
pub fn texture_view_label<A: HalApi>(&self, id: id::TextureViewId) -> String {
A::hub(self).texture_views.label_for_resource(id)
}
pub fn texture_view_drop<A: HalApi>(
&self,
texture_view_id: id::TextureViewId,
@ -933,14 +917,10 @@ impl Global {
return (id, None);
};
let id = fid.assign_error(desc.label.borrow_or_default());
let id = fid.assign_error();
(id, Some(error))
}
pub fn sampler_label<A: HalApi>(&self, id: id::SamplerId) -> String {
A::hub(self).samplers.label_for_resource(id)
}
pub fn sampler_drop<A: HalApi>(&self, sampler_id: id::SamplerId) {
profiling::scope!("Sampler::drop");
api_log!("Sampler::drop {sampler_id:?}");
@ -1042,14 +1022,10 @@ impl Global {
};
let fid = hub.bind_group_layouts.prepare(id_in);
let id = fid.assign_error(desc.label.borrow_or_default());
let id = fid.assign_error();
(id, Some(error))
}
pub fn bind_group_layout_label<A: HalApi>(&self, id: id::BindGroupLayoutId) -> String {
A::hub(self).bind_group_layouts.label_for_resource(id)
}
pub fn bind_group_layout_drop<A: HalApi>(&self, bind_group_layout_id: id::BindGroupLayoutId) {
profiling::scope!("BindGroupLayout::drop");
api_log!("BindGroupLayout::drop {bind_group_layout_id:?}");
@ -1106,14 +1082,10 @@ impl Global {
return (id, None);
};
let id = fid.assign_error(desc.label.borrow_or_default());
let id = fid.assign_error();
(id, Some(error))
}
pub fn pipeline_layout_label<A: HalApi>(&self, id: id::PipelineLayoutId) -> String {
A::hub(self).pipeline_layouts.label_for_resource(id)
}
pub fn pipeline_layout_drop<A: HalApi>(&self, pipeline_layout_id: id::PipelineLayoutId) {
profiling::scope!("PipelineLayout::drop");
api_log!("PipelineLayout::drop {pipeline_layout_id:?}");
@ -1192,14 +1164,10 @@ impl Global {
return (id, None);
};
let id = fid.assign_error(desc.label.borrow_or_default());
let id = fid.assign_error();
(id, Some(error))
}
pub fn bind_group_label<A: HalApi>(&self, id: id::BindGroupId) -> String {
A::hub(self).bind_groups.label_for_resource(id)
}
pub fn bind_group_drop<A: HalApi>(&self, bind_group_id: id::BindGroupId) {
profiling::scope!("BindGroup::drop");
api_log!("BindGroup::drop {bind_group_id:?}");
@ -1300,7 +1268,7 @@ impl Global {
log::error!("Device::create_shader_module error: {error}");
let id = fid.assign_error(desc.label.borrow_or_default());
let id = fid.assign_error();
(id, Some(error))
}
@ -1354,14 +1322,10 @@ impl Global {
log::error!("Device::create_shader_module_spirv error: {error}");
let id = fid.assign_error(desc.label.borrow_or_default());
let id = fid.assign_error();
(id, Some(error))
}
pub fn shader_module_label<A: HalApi>(&self, id: id::ShaderModuleId) -> String {
A::hub(self).shader_modules.label_for_resource(id)
}
pub fn shader_module_drop<A: HalApi>(&self, shader_module_id: id::ShaderModuleId) {
profiling::scope!("ShaderModule::drop");
api_log!("ShaderModule::drop {shader_module_id:?}");
@ -1406,14 +1370,10 @@ impl Global {
return (id.into_command_encoder_id(), None);
};
let id = fid.assign_error(desc.label.borrow_or_default());
let id = fid.assign_error();
(id.into_command_encoder_id(), Some(error))
}
pub fn command_buffer_label<A: HalApi>(&self, id: id::CommandBufferId) -> String {
A::hub(self).command_buffers.label_for_resource(id)
}
pub fn command_encoder_drop<A: HalApi>(&self, command_encoder_id: id::CommandEncoderId) {
profiling::scope!("CommandEncoder::drop");
api_log!("CommandEncoder::drop {command_encoder_id:?}");
@ -1501,14 +1461,10 @@ impl Global {
return (id, None);
};
let id = fid.assign_error(desc.label.borrow_or_default());
let id = fid.assign_error();
(id, Some(error))
}
pub fn render_bundle_label<A: HalApi>(&self, id: id::RenderBundleId) -> String {
A::hub(self).render_bundles.label_for_resource(id)
}
pub fn render_bundle_drop<A: HalApi>(&self, render_bundle_id: id::RenderBundleId) {
profiling::scope!("RenderBundle::drop");
api_log!("RenderBundle::drop {render_bundle_id:?}");
@ -1567,7 +1523,7 @@ impl Global {
return (id, None);
};
let id = fid.assign_error("");
let id = fid.assign_error();
(id, Some(error))
}
@ -1593,10 +1549,6 @@ impl Global {
}
}
pub fn query_set_label<A: HalApi>(&self, id: id::QuerySetId) -> String {
A::hub(self).query_sets.label_for_resource(id)
}
pub fn device_create_render_pipeline<A: HalApi>(
&self,
device_id: DeviceId,
@ -1648,7 +1600,7 @@ impl Global {
return (id, None);
};
let id = fid.assign_error(desc.label.borrow_or_default());
let id = fid.assign_error();
// We also need to assign errors to the implicit pipeline layout and the
// implicit bind group layout. We have to remove any existing entries first.
@ -1658,12 +1610,12 @@ impl Global {
if pipeline_layout_guard.contains(ids.root_id) {
pipeline_layout_guard.remove(ids.root_id);
}
pipeline_layout_guard.insert_error(ids.root_id, IMPLICIT_BIND_GROUP_LAYOUT_ERROR_LABEL);
pipeline_layout_guard.insert_error(ids.root_id);
for &bgl_id in ids.group_ids.iter() {
if bgl_guard.contains(bgl_id) {
bgl_guard.remove(bgl_id);
}
bgl_guard.insert_error(bgl_id, IMPLICIT_BIND_GROUP_LAYOUT_ERROR_LABEL);
bgl_guard.insert_error(bgl_id);
}
}
@ -1699,17 +1651,10 @@ impl Global {
return (id, None);
};
let id = hub
.bind_group_layouts
.prepare(id_in)
.assign_error("<derived>");
let id = hub.bind_group_layouts.prepare(id_in).assign_error();
(id, Some(error))
}
pub fn render_pipeline_label<A: HalApi>(&self, id: id::RenderPipelineId) -> String {
A::hub(self).render_pipelines.label_for_resource(id)
}
pub fn render_pipeline_drop<A: HalApi>(&self, render_pipeline_id: id::RenderPipelineId) {
profiling::scope!("RenderPipeline::drop");
api_log!("RenderPipeline::drop {render_pipeline_id:?}");
@ -1786,7 +1731,7 @@ impl Global {
return (id, None);
};
let id = fid.assign_error(desc.label.borrow_or_default());
let id = fid.assign_error();
// We also need to assign errors to the implicit pipeline layout and the
// implicit bind group layout. We have to remove any existing entries first.
@ -1796,12 +1741,12 @@ impl Global {
if pipeline_layout_guard.contains(ids.root_id) {
pipeline_layout_guard.remove(ids.root_id);
}
pipeline_layout_guard.insert_error(ids.root_id, IMPLICIT_BIND_GROUP_LAYOUT_ERROR_LABEL);
pipeline_layout_guard.insert_error(ids.root_id);
for &bgl_id in ids.group_ids.iter() {
if bgl_guard.contains(bgl_id) {
bgl_guard.remove(bgl_id);
}
bgl_guard.insert_error(bgl_id, IMPLICIT_BIND_GROUP_LAYOUT_ERROR_LABEL);
bgl_guard.insert_error(bgl_id);
}
}
(id, Some(error))
@ -1836,17 +1781,10 @@ impl Global {
return (id, None);
};
let id = hub
.bind_group_layouts
.prepare(id_in)
.assign_error("<derived>");
let id = hub.bind_group_layouts.prepare(id_in).assign_error();
(id, Some(error))
}
pub fn compute_pipeline_label<A: HalApi>(&self, id: id::ComputePipelineId) -> String {
A::hub(self).compute_pipelines.label_for_resource(id)
}
pub fn compute_pipeline_drop<A: HalApi>(&self, compute_pipeline_id: id::ComputePipelineId) {
profiling::scope!("ComputePipeline::drop");
api_log!("ComputePipeline::drop {compute_pipeline_id:?}");
@ -1916,7 +1854,7 @@ impl Global {
}
};
let id = fid.assign_error(desc.label.borrow_or_default());
let id = fid.assign_error();
(id, Some(error))
}
@ -2350,10 +2288,6 @@ impl Global {
Ok(all_queue_empty)
}
pub fn device_label<A: HalApi>(&self, id: DeviceId) -> String {
A::hub(self).devices.label_for_resource(id)
}
pub fn device_start_capture<A: HalApi>(&self, id: DeviceId) {
api_log!("Device::start_capture");
@ -2385,8 +2319,7 @@ impl Global {
// the registry.
pub fn device_make_invalid<A: HalApi>(&self, device_id: DeviceId) {
let hub = A::hub(self);
hub.devices
.force_replace_with_error(device_id, "Made invalid.");
hub.devices.force_replace_with_error(device_id);
}
pub fn pipeline_cache_get_data<A: HalApi>(&self, id: id::PipelineCacheId) -> Option<Vec<u8>> {

View File

@ -39,7 +39,6 @@ pub(crate) const ZERO_BUFFER_SIZE: BufferAddress = 512 << 10;
// See https://github.com/gfx-rs/wgpu/issues/4589. 60s to reduce the chances of this.
const CLEANUP_WAIT_MS: u32 = 60000;
const IMPLICIT_BIND_GROUP_LAYOUT_ERROR_LABEL: &str = "Implicit BindGroupLayout in the Error State";
const ENTRYPOINT_FAILURE_ERROR: &str = "The given EntryPoint is Invalid";
pub type DeviceDescriptor<'a> = wgt::DeviceDescriptor<Label<'a>>;

View File

@ -42,7 +42,7 @@ pub struct Queue<A: HalApi> {
}
crate::impl_resource_type!(Queue);
// TODO: remove once we get rid of Registry.label_for_resource
// TODO: https://github.com/gfx-rs/wgpu/issues/4014
impl<A: HalApi> Labeled for Queue<A> {
fn label(&self) -> &str {
""

View File

@ -60,7 +60,7 @@ use super::{
life::ResourceMaps,
queue::{self, Queue},
DeviceDescriptor, DeviceError, ImplicitPipelineContext, UserClosures, ENTRYPOINT_FAILURE_ERROR,
IMPLICIT_BIND_GROUP_LAYOUT_ERROR_LABEL, ZERO_BUFFER_SIZE,
ZERO_BUFFER_SIZE,
};
/// Structure describing a logical device. Some members are internally mutable,
@ -2615,10 +2615,10 @@ impl<A: HalApi> Device<A> {
// that are not even in the storage.
if let Some(ref ids) = implicit_context {
let mut pipeline_layout_guard = hub.pipeline_layouts.write();
pipeline_layout_guard.insert_error(ids.root_id, IMPLICIT_BIND_GROUP_LAYOUT_ERROR_LABEL);
pipeline_layout_guard.insert_error(ids.root_id);
let mut bgl_guard = hub.bind_group_layouts.write();
for &bgl_id in ids.group_ids.iter() {
bgl_guard.insert_error(bgl_id, IMPLICIT_BIND_GROUP_LAYOUT_ERROR_LABEL);
bgl_guard.insert_error(bgl_id);
}
}
@ -2780,9 +2780,9 @@ impl<A: HalApi> Device<A> {
//TODO: only lock mutable if the layout is derived
let mut pipeline_layout_guard = hub.pipeline_layouts.write();
let mut bgl_guard = hub.bind_group_layouts.write();
pipeline_layout_guard.insert_error(ids.root_id, IMPLICIT_BIND_GROUP_LAYOUT_ERROR_LABEL);
pipeline_layout_guard.insert_error(ids.root_id);
for &bgl_id in ids.group_ids.iter() {
bgl_guard.insert_error(bgl_id, IMPLICIT_BIND_GROUP_LAYOUT_ERROR_LABEL);
bgl_guard.insert_error(bgl_id);
}
}

View File

@ -1,89 +1,14 @@
use core::fmt;
use std::{error::Error, sync::Arc};
use crate::{gfx_select, global::Global};
pub struct ErrorFormatter<'a> {
writer: &'a mut dyn fmt::Write,
global: &'a Global,
}
impl<'a> ErrorFormatter<'a> {
pub fn error(&mut self, err: &dyn Error) {
writeln!(self.writer, " {err}").expect("Error formatting error");
}
pub fn note(&mut self, note: &dyn fmt::Display) {
writeln!(self.writer, " note: {note}").expect("Error formatting error");
}
pub fn label(&mut self, label_key: &str, label_value: &String) {
if !label_key.is_empty() && !label_value.is_empty() {
self.note(&format!("{label_key} = `{label_value}`"));
}
}
pub fn bind_group_label(&mut self, id: &crate::id::BindGroupId) {
let label: String = gfx_select!(id => self.global.bind_group_label(*id));
self.label("bind group", &label);
}
pub fn bind_group_layout_label(&mut self, id: &crate::id::BindGroupLayoutId) {
let label: String = gfx_select!(id => self.global.bind_group_layout_label(*id));
self.label("bind group layout", &label);
}
pub fn render_pipeline_label(&mut self, id: &crate::id::RenderPipelineId) {
let label: String = gfx_select!(id => self.global.render_pipeline_label(*id));
self.label("render pipeline", &label);
}
pub fn compute_pipeline_label(&mut self, id: &crate::id::ComputePipelineId) {
let label: String = gfx_select!(id => self.global.compute_pipeline_label(*id));
self.label("compute pipeline", &label);
}
pub fn buffer_label_with_key(&mut self, id: &crate::id::BufferId, key: &str) {
let label: String = gfx_select!(id => self.global.buffer_label(*id));
self.label(key, &label);
}
pub fn buffer_label(&mut self, id: &crate::id::BufferId) {
self.buffer_label_with_key(id, "buffer");
}
pub fn texture_label_with_key(&mut self, id: &crate::id::TextureId, key: &str) {
let label: String = gfx_select!(id => self.global.texture_label(*id));
self.label(key, &label);
}
pub fn texture_label(&mut self, id: &crate::id::TextureId) {
self.texture_label_with_key(id, "texture");
}
pub fn texture_view_label_with_key(&mut self, id: &crate::id::TextureViewId, key: &str) {
let label: String = gfx_select!(id => self.global.texture_view_label(*id));
self.label(key, &label);
}
pub fn texture_view_label(&mut self, id: &crate::id::TextureViewId) {
self.texture_view_label_with_key(id, "texture view");
}
pub fn sampler_label(&mut self, id: &crate::id::SamplerId) {
let label: String = gfx_select!(id => self.global.sampler_label(*id));
self.label("sampler", &label);
}
pub fn command_buffer_label(&mut self, id: &crate::id::CommandBufferId) {
let label: String = gfx_select!(id => self.global.command_buffer_label(*id));
self.label("command buffer", &label);
}
pub fn query_set_label(&mut self, id: &crate::id::QuerySetId) {
let label: String = gfx_select!(id => self.global.query_set_label(*id));
self.label("query set", &label);
}
}
pub trait PrettyError: Error + Sized {
@ -92,12 +17,8 @@ pub trait PrettyError: Error + Sized {
}
}
pub fn format_pretty_any(
writer: &mut dyn fmt::Write,
global: &Global,
error: &(dyn Error + 'static),
) {
let mut fmt = ErrorFormatter { writer, global };
pub fn format_pretty_any(writer: &mut dyn fmt::Write, error: &(dyn Error + 'static)) {
let mut fmt = ErrorFormatter { writer };
if let Some(pretty_err) = error.downcast_ref::<ContextError>() {
return pretty_err.fmt_pretty(&mut fmt);
@ -152,31 +73,33 @@ pub fn format_pretty_any(
#[derive(Debug)]
pub struct ContextError {
pub string: &'static str,
pub fn_ident: &'static str,
#[cfg(send_sync)]
pub cause: Box<dyn Error + Send + Sync + 'static>,
pub source: Box<dyn Error + Send + Sync + 'static>,
#[cfg(not(send_sync))]
pub cause: Box<dyn Error + 'static>,
pub label_key: &'static str,
pub source: Box<dyn Error + 'static>,
pub label: String,
}
impl PrettyError for ContextError {
fn fmt_pretty(&self, fmt: &mut ErrorFormatter) {
fmt.error(self);
fmt.label(self.label_key, &self.label);
writeln!(fmt.writer, " In {}", self.fn_ident).expect("Error formatting error");
if !self.label.is_empty() {
writeln!(fmt.writer, " note: label = `{}`", self.label)
.expect("Error formatting error");
}
}
}
impl fmt::Display for ContextError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "In {}", self.string)
write!(f, "In {}", self.fn_ident)
}
}
impl Error for ContextError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
Some(self.cause.as_ref())
Some(self.source.as_ref())
}
}

View File

@ -9,8 +9,8 @@ use crate::{
id::{markers, AdapterId, DeviceId, Id, Marker, QueueId, SurfaceId},
lock::{rank, Mutex},
present::Presentation,
resource::{Labeled, ResourceType},
resource_log, LabelHelpers, DOWNLEVEL_WARNING_MESSAGE,
resource::ResourceType,
resource_log, DOWNLEVEL_WARNING_MESSAGE,
};
use wgt::{Backend, Backends, PowerPreference};
@ -147,12 +147,6 @@ pub struct Surface {
impl ResourceType for Surface {
const TYPE: &'static str = "Surface";
}
// TODO: remove once we get rid of Registry.label_for_resource
impl Labeled for Surface {
fn label(&self) -> &str {
""
}
}
impl crate::storage::StorageItem for Surface {
type Marker = markers::Surface;
}
@ -367,12 +361,6 @@ impl<A: HalApi> Adapter<A> {
}
crate::impl_resource_type!(Adapter);
// TODO: remove once we get rid of Registry.label_for_resource
impl<A: HalApi> Labeled for Adapter<A> {
fn label(&self) -> &str {
""
}
}
crate::impl_storage_item!(Adapter);
#[derive(Clone, Debug, Error)]
@ -1103,8 +1091,8 @@ impl Global {
return (device_id, queue_id, None);
};
let device_id = device_fid.assign_error(desc.label.borrow_or_default());
let queue_id = queue_fid.assign_error(desc.label.borrow_or_default());
let device_id = device_fid.assign_error();
let queue_id = queue_fid.assign_error();
(device_id, queue_id, Some(error))
}
@ -1154,8 +1142,8 @@ impl Global {
return (device_id, queue_id, None);
};
let device_id = devices_fid.assign_error(desc.label.borrow_or_default());
let queue_id = queues_fid.assign_error(desc.label.borrow_or_default());
let device_id = devices_fid.assign_error();
let queue_id = queues_fid.assign_error();
(device_id, queue_id, Some(error))
}
}

View File

@ -96,15 +96,10 @@ pub type RawString = *const c_char;
pub type Label<'a> = Option<Cow<'a, str>>;
trait LabelHelpers<'a> {
fn borrow_option(&'a self) -> Option<&'a str>;
fn to_hal(&'a self, flags: wgt::InstanceFlags) -> Option<&'a str>;
fn borrow_or_default(&'a self) -> &'a str;
fn to_string(&self) -> String;
}
impl<'a> LabelHelpers<'a> for Label<'a> {
fn borrow_option(&'a self) -> Option<&'a str> {
self.as_ref().map(|cow| cow.as_ref())
}
fn to_hal(&'a self, flags: wgt::InstanceFlags) -> Option<&'a str> {
if flags.contains(wgt::InstanceFlags::DISCARD_HAL_LABELS) {
return None;
@ -112,9 +107,6 @@ impl<'a> LabelHelpers<'a> for Label<'a> {
self.as_ref().map(|cow| cow.as_ref())
}
fn borrow_or_default(&'a self) -> &'a str {
self.borrow_option().unwrap_or_default()
}
fn to_string(&self) -> String {
self.as_ref().map(|cow| cow.to_string()).unwrap_or_default()
}

View File

@ -92,8 +92,8 @@ impl<T: StorageItem> FutureId<'_, T> {
self.id
}
pub fn assign_error(self, label: &str) -> Id<T::Marker> {
self.data.write().insert_error(self.id, label);
pub fn assign_error(self) -> Id<T::Marker> {
self.data.write().insert_error(self.id);
self.id
}
}
@ -136,10 +136,10 @@ impl<T: StorageItem> Registry<T> {
let mut storage = self.storage.write();
storage.force_replace(id, value)
}
pub(crate) fn force_replace_with_error(&self, id: Id<T::Marker>, label: &str) {
pub(crate) fn force_replace_with_error(&self, id: Id<T::Marker>) {
let mut storage = self.storage.write();
storage.remove(id);
storage.insert_error(id, label);
storage.insert_error(id);
}
pub(crate) fn unregister(&self, id: Id<T::Marker>) -> Option<Arc<T>> {
let value = self.storage.write().remove(id);
@ -151,33 +151,6 @@ impl<T: StorageItem> Registry<T> {
value
}
pub(crate) fn label_for_resource(&self, id: Id<T::Marker>) -> String {
let guard = self.storage.read();
let type_name = guard.kind();
// Using `get` over `try_get` is fine for the most part.
// However, there's corner cases where it can happen that a resource still holds an Arc
// to another resource that was already dropped explicitly from the registry.
// That resource is now in an invalid state, likely causing an error that lead
// us here, trying to print its label but failing because the id is now vacant.
match guard.try_get(id) {
Ok(Some(res)) => {
let label = res.label();
if label.is_empty() {
format!("<{}-{:?}>", type_name, id.unzip())
} else {
label.to_owned()
}
}
_ => format!(
"<Invalid-{} label={}>",
type_name,
guard.label_for_invalid_id(id)
),
}
}
pub(crate) fn generate_report(&self) -> RegistryReport {
let storage = self.storage.read();
let mut report = RegistryReport {
@ -189,7 +162,7 @@ impl<T: StorageItem> Registry<T> {
match *element {
Element::Occupied(..) => report.num_kept_from_user += 1,
Element::Vacant => report.num_released_from_user += 1,
Element::Error(..) => report.num_error += 1,
Element::Error(_) => report.num_error += 1,
}
}
report
@ -200,11 +173,7 @@ impl<T: StorageItem> Registry<T> {
mod tests {
use std::sync::Arc;
use crate::{
id::Marker,
resource::{Labeled, ResourceType},
storage::StorageItem,
};
use crate::{id::Marker, resource::ResourceType, storage::StorageItem};
use super::Registry;
struct TestData;
@ -214,12 +183,6 @@ mod tests {
impl ResourceType for TestData {
const TYPE: &'static str = "TestData";
}
// TODO: remove once we get rid of Registry.label_for_resource
impl Labeled for TestData {
fn label(&self) -> &str {
""
}
}
impl StorageItem for TestData {
type Marker = TestDataId;
}

View File

@ -893,7 +893,7 @@ impl<A: HalApi> Drop for StagingBuffer<A> {
}
crate::impl_resource_type!(StagingBuffer);
// TODO: remove once we get rid of Registry.label_for_resource
// TODO: add label
impl<A: HalApi> Labeled for StagingBuffer<A> {
fn label(&self) -> &str {
""

View File

@ -4,7 +4,7 @@ use std::sync::Arc;
use wgt::Backend;
use crate::id::{Id, Marker};
use crate::resource::{Labeled, ResourceType};
use crate::resource::ResourceType;
use crate::{Epoch, Index};
/// An entry in a `Storage::map` table.
@ -19,16 +19,13 @@ pub(crate) enum Element<T> {
/// Like `Occupied`, but an error occurred when creating the
/// resource.
///
/// The given `String` is the resource's descriptor label.
Error(Epoch, String),
Error(Epoch),
}
#[derive(Clone, Debug)]
pub(crate) struct InvalidId;
// The Labeled bound is still needed because of label_for_resource
pub(crate) trait StorageItem: ResourceType + Labeled {
pub(crate) trait StorageItem: ResourceType {
type Marker: Marker;
}
@ -88,7 +85,7 @@ where
let (index, epoch, _) = id.unzip();
match self.map.get(index as usize) {
Some(&Element::Vacant) => false,
Some(&Element::Occupied(_, storage_epoch) | &Element::Error(storage_epoch, _)) => {
Some(&Element::Occupied(_, storage_epoch) | &Element::Error(storage_epoch)) => {
storage_epoch == epoch
}
None => false,
@ -107,7 +104,7 @@ where
let (result, storage_epoch) = match self.map.get(index as usize) {
Some(&Element::Occupied(ref v, epoch)) => (Ok(Some(v)), epoch),
Some(&Element::Vacant) => return Ok(None),
Some(&Element::Error(epoch, ..)) => (Err(InvalidId), epoch),
Some(&Element::Error(epoch)) => (Err(InvalidId), epoch),
None => return Err(InvalidId),
};
assert_eq!(
@ -125,7 +122,7 @@ where
let (result, storage_epoch) = match self.map.get(index as usize) {
Some(&Element::Occupied(ref v, epoch)) => (Ok(v), epoch),
Some(&Element::Vacant) => panic!("{}[{:?}] does not exist", self.kind, id),
Some(&Element::Error(epoch, ..)) => (Err(InvalidId), epoch),
Some(&Element::Error(epoch)) => (Err(InvalidId), epoch),
None => return Err(InvalidId),
};
assert_eq!(
@ -142,14 +139,6 @@ where
Ok(Arc::clone(self.get(id)?))
}
pub(crate) fn label_for_invalid_id(&self, id: Id<T::Marker>) -> &str {
let (index, _, _) = id.unzip();
match self.map.get(index as usize) {
Some(Element::Error(_, label)) => label,
_ => "",
}
}
fn insert_impl(&mut self, index: usize, epoch: Epoch, element: Element<T>) {
if index >= self.map.len() {
self.map.resize_with(index + 1, || Element::Vacant);
@ -164,7 +153,7 @@ where
T::TYPE
);
}
Element::Error(storage_epoch, _) => {
Element::Error(storage_epoch) => {
assert_ne!(
epoch,
storage_epoch,
@ -181,22 +170,15 @@ where
self.insert_impl(index as usize, epoch, Element::Occupied(value, epoch))
}
pub(crate) fn insert_error(&mut self, id: Id<T::Marker>, label: &str) {
pub(crate) fn insert_error(&mut self, id: Id<T::Marker>) {
log::trace!("User is inserting as error {}{:?}", T::TYPE, id);
let (index, epoch, _) = id.unzip();
self.insert_impl(
index as usize,
epoch,
Element::Error(epoch, label.to_string()),
)
self.insert_impl(index as usize, epoch, Element::Error(epoch))
}
pub(crate) fn replace_with_error(&mut self, id: Id<T::Marker>) -> Result<Arc<T>, InvalidId> {
let (index, epoch, _) = id.unzip();
match std::mem::replace(
&mut self.map[index as usize],
Element::Error(epoch, String::new()),
) {
match std::mem::replace(&mut self.map[index as usize], Element::Error(epoch)) {
Element::Vacant => panic!("Cannot access vacant resource"),
Element::Occupied(value, storage_epoch) => {
assert_eq!(epoch, storage_epoch);
@ -220,7 +202,7 @@ where
assert_eq!(epoch, storage_epoch);
Some(value)
}
Element::Error(..) => None,
Element::Error(_) => None,
Element::Vacant => panic!("Cannot remove a vacant resource"),
}
}
@ -237,10 +219,6 @@ where
})
}
pub(crate) fn kind(&self) -> &str {
self.kind
}
pub(crate) fn len(&self) -> usize {
self.map.len()
}

View File

@ -29,8 +29,6 @@ use wgc::{
};
use wgt::WasmNotSendSync;
const LABEL: &str = "label";
pub struct ContextWgpuCore(wgc::global::Global);
impl Drop for ContextWgpuCore {
@ -63,10 +61,6 @@ impl ContextWgpuCore {
Self(unsafe { wgc::global::Global::from_instance(core_instance) })
}
pub(crate) fn global(&self) -> &wgc::global::Global {
&self.0
}
pub fn enumerate_adapters(&self, backends: wgt::Backends) -> Vec<wgc::id::AdapterId> {
self.0
.enumerate_adapters(wgc::instance::AdapterInputs::Mask(backends, |_| None))
@ -150,7 +144,6 @@ impl ContextWgpuCore {
self.handle_error(
&device.error_sink,
cause,
LABEL,
desc.label,
"Device::create_texture_from_hal",
);
@ -179,7 +172,6 @@ impl ContextWgpuCore {
self.handle_error(
&device.error_sink,
cause,
LABEL,
desc.label,
"Device::create_buffer_from_hal",
);
@ -273,16 +265,14 @@ impl ContextWgpuCore {
fn handle_error(
&self,
sink_mutex: &Mutex<ErrorSinkRaw>,
cause: impl Error + WasmNotSendSync + 'static,
label_key: &'static str,
source: impl Error + WasmNotSendSync + 'static,
label: Label<'_>,
string: &'static str,
fn_ident: &'static str,
) {
let error = wgc::error::ContextError {
string,
cause: Box::new(cause),
fn_ident,
source: Box::new(source),
label: label.unwrap_or_default().to_string(),
label_key,
};
let mut sink = sink_mutex.lock();
let mut source_opt: Option<&(dyn Error + 'static)> = Some(&error);
@ -307,10 +297,10 @@ impl ContextWgpuCore {
fn handle_error_nolabel(
&self,
sink_mutex: &Mutex<ErrorSinkRaw>,
cause: impl Error + WasmNotSendSync + 'static,
string: &'static str,
source: impl Error + WasmNotSendSync + 'static,
fn_ident: &'static str,
) {
self.handle_error(sink_mutex, cause, "", None, string)
self.handle_error(sink_mutex, source, None, fn_ident)
}
#[track_caller]
@ -323,24 +313,18 @@ impl ContextWgpuCore {
}
fn format_error(&self, err: &(impl Error + 'static)) -> String {
let global = self.global();
let mut err_descs = vec![];
let mut level = 0;
fn print_tree(
err_descs: &mut Vec<String>,
level: &mut usize,
global: &wgc::global::Global,
e: &(dyn Error + 'static),
) {
fn print_tree(err_descs: &mut Vec<String>, level: &mut usize, e: &(dyn Error + 'static)) {
let mut print = |e| {
let mut err_str = " ".repeat(*level * 2);
wgc::error::format_pretty_any(&mut err_str, global, e);
wgc::error::format_pretty_any(&mut err_str, e);
err_descs.push(err_str);
if let Some(e) = e.source() {
*level += 1;
print_tree(err_descs, level, global, e);
print_tree(err_descs, level, e);
*level -= 1;
}
};
@ -353,7 +337,7 @@ impl ContextWgpuCore {
}
}
print_tree(&mut err_descs, &mut level, global, err);
print_tree(&mut err_descs, &mut level, err);
format!("Validation Error\n\nCaused by:\n{}", err_descs.join(""))
}
@ -940,7 +924,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&device_data.error_sink,
cause.clone(),
LABEL,
desc.label,
"Device::create_shader_module",
);
@ -972,7 +955,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&device_data.error_sink,
cause.clone(),
LABEL,
desc.label,
"Device::create_shader_module_spirv",
);
@ -1000,7 +982,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&device_data.error_sink,
cause,
LABEL,
desc.label,
"Device::create_bind_group_layout",
);
@ -1114,7 +1095,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&device_data.error_sink,
cause,
LABEL,
desc.label,
"Device::create_bind_group",
);
@ -1156,7 +1136,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&device_data.error_sink,
cause,
LABEL,
desc.label,
"Device::create_pipeline_layout",
);
@ -1241,7 +1220,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&device_data.error_sink,
cause,
LABEL,
desc.label,
"Device::create_render_pipeline",
);
@ -1296,7 +1274,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&device_data.error_sink,
cause,
LABEL,
desc.label,
"Device::create_compute_pipeline",
);
@ -1326,7 +1303,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&device_data.error_sink,
cause,
LABEL,
desc.label,
"Device::device_create_pipeline_cache_init",
);
@ -1349,7 +1325,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&device_data.error_sink,
cause,
LABEL,
desc.label,
"Device::create_buffer",
);
@ -1377,7 +1352,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&device_data.error_sink,
cause,
LABEL,
desc.label,
"Device::create_texture",
);
@ -1422,7 +1396,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&device_data.error_sink,
cause,
LABEL,
desc.label,
"Device::create_sampler",
);
@ -1460,7 +1433,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&device_data.error_sink,
cause,
LABEL,
desc.label,
"Device::create_command_encoder",
);
@ -1671,7 +1643,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&texture_data.error_sink,
cause,
LABEL,
desc.label,
"Texture::create_view",
);
@ -1945,7 +1916,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&encoder_data.error_sink,
cause,
LABEL,
desc.label,
"CommandEncoder::begin_compute_pass",
);
@ -2017,7 +1987,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&encoder_data.error_sink,
cause,
LABEL,
desc.label,
"CommandEncoder::begin_compute_pass",
);
@ -2425,7 +2394,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"ComputePass::set_pipeline",
);
@ -2448,7 +2416,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"ComputePass::set_bind_group",
);
@ -2466,7 +2433,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"ComputePass::set_push_constant",
);
@ -2483,7 +2449,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"ComputePass::insert_debug_marker",
);
@ -2500,7 +2465,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"ComputePass::push_debug_group",
);
@ -2516,7 +2480,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"ComputePass::pop_debug_group",
);
@ -2538,7 +2501,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"ComputePass::write_timestamp",
);
@ -2561,7 +2523,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"ComputePass::begin_pipeline_statistics_query",
);
@ -2577,7 +2538,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"ComputePass::end_pipeline_statistics_query",
);
@ -2596,7 +2556,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"ComputePass::dispatch_workgroups",
);
@ -2619,7 +2578,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"ComputePass::dispatch_workgroups_indirect",
);
@ -2635,7 +2593,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"ComputePass::end",
);
@ -2838,7 +2795,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::set_pipeline",
);
@ -2861,7 +2817,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::set_bind_group",
);
@ -2886,7 +2841,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::set_index_buffer",
);
@ -2910,7 +2864,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::set_vertex_buffer",
);
@ -2932,7 +2885,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::set_push_constants",
);
@ -2956,7 +2908,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::draw",
);
@ -2982,7 +2933,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::draw_indexed",
);
@ -3004,7 +2954,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::draw_indirect",
);
@ -3027,7 +2976,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::draw_indexed_indirect",
);
@ -3051,7 +2999,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::multi_draw_indirect",
);
@ -3076,7 +3023,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::multi_draw_indexed_indirect",
);
@ -3106,7 +3052,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::multi_draw_indirect_count",
);
@ -3136,7 +3081,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::multi_draw_indexed_indirect_count",
);
@ -3153,7 +3097,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::set_blend_constant",
);
@ -3176,7 +3119,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::set_scissor_rect",
);
@ -3201,7 +3143,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::set_viewport",
);
@ -3218,7 +3159,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::set_stencil_reference",
);
@ -3235,7 +3175,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::insert_debug_marker",
);
@ -3252,7 +3191,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::push_debug_group",
);
@ -3268,7 +3206,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::pop_debug_group",
);
@ -3290,7 +3227,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::write_timestamp",
);
@ -3307,7 +3243,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::begin_occlusion_query",
);
@ -3323,7 +3258,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::end_occlusion_query",
);
@ -3346,7 +3280,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::begin_pipeline_statistics_query",
);
@ -3362,7 +3295,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::end_pipeline_statistics_query",
);
@ -3383,7 +3315,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::execute_bundles",
);
@ -3399,7 +3330,6 @@ impl crate::Context for ContextWgpuCore {
self.handle_error(
&pass_data.error_sink,
cause,
LABEL,
pass_data.pass.label(),
"RenderPass::end",
);