use std::{
collections::HashSet,
sync::{Arc, Mutex},
};
use bevy::{app::Plugin, render::renderer::RenderDevice};
pub struct WgpuErrorHandlerPlugin;
impl Plugin for WgpuErrorHandlerPlugin {
fn build(&self, _app: &mut bevy::app::App) {}
fn finish(&self, app: &mut bevy::app::App) {
let Some(render_app) = app.get_sub_app(bevy::render::RenderApp) else {
return;
};
let Some(device) = render_app.world().get_resource::<RenderDevice>() else {
return;
};
let seen: Arc<Mutex<HashSet<String>>> = Arc::new(Mutex::new(HashSet::new()));
device
.wgpu_device()
.on_uncaptured_error(Arc::new(move |error| match &error {
wgpu::Error::Validation { description, .. } => {
let is_new = seen
.lock()
.map(|mut set| set.insert(description.clone()))
.unwrap_or(true);
if is_new {
bevy::log::error!("wgpu validation error (non-fatal): {error}");
}
}
_ => panic!("wgpu error: {error}"),
}));
}
}