diff options
author | 2024-02-10 00:50:49 +0100 | |
---|---|---|
committer | 2024-02-10 00:50:49 +0100 | |
commit | c63529095604ffde00a504ed083474707ab484de (patch) | |
tree | 76a8a103f6352263ccd30a7e230089fbb2d54822 /wgpu | |
parent | 7ee00e751a8fe5cedadeeb478c6f0e7d6a5dc0dc (diff) | |
parent | 0bcdefeb00c899c23bc7b54903df5bcbc644fbb5 (diff) | |
download | iced-c63529095604ffde00a504ed083474707ab484de.tar.gz iced-c63529095604ffde00a504ed083474707ab484de.tar.bz2 iced-c63529095604ffde00a504ed083474707ab484de.zip |
Merge pull request #2231 from Koranir/transparency-fix
Fix alpha mode misconfiguration in wgpu renderer
Diffstat (limited to 'wgpu')
-rw-r--r-- | wgpu/src/window/compositor.rs | 55 |
1 files changed, 40 insertions, 15 deletions
diff --git a/wgpu/src/window/compositor.rs b/wgpu/src/window/compositor.rs index 58f3f654..33133016 100644 --- a/wgpu/src/window/compositor.rs +++ b/wgpu/src/window/compositor.rs @@ -15,6 +15,7 @@ pub struct Compositor { device: wgpu::Device, queue: wgpu::Queue, format: wgpu::TextureFormat, + alpha_mode: wgpu::CompositeAlphaMode, } impl Compositor { @@ -61,25 +62,48 @@ impl Compositor { log::info!("Selected: {:#?}", adapter.get_info()); - let format = compatible_surface.as_ref().and_then(|surface| { - let capabilities = surface.get_capabilities(&adapter); + let (format, alpha_mode) = + compatible_surface.as_ref().and_then(|surface| { + let capabilities = surface.get_capabilities(&adapter); - let mut formats = capabilities.formats.iter().copied(); + let mut formats = capabilities.formats.iter().copied(); - let format = if color::GAMMA_CORRECTION { - formats.find(wgpu::TextureFormat::is_srgb) - } else { - formats.find(|format| !wgpu::TextureFormat::is_srgb(format)) - }; + log::info!("Available formats: {formats:#?}"); - format.or_else(|| { - log::warn!("No format found!"); + let format = if color::GAMMA_CORRECTION { + formats.find(wgpu::TextureFormat::is_srgb) + } else { + formats.find(|format| !wgpu::TextureFormat::is_srgb(format)) + }; - capabilities.formats.first().copied() - }) - })?; + let format = format.or_else(|| { + log::warn!("No format found!"); + + capabilities.formats.first().copied() + }); + + let alpha_modes = capabilities.alpha_modes; + + log::info!("Available alpha modes: {alpha_modes:#?}"); - log::info!("Selected format: {format:?}"); + let preferred_alpha = if alpha_modes + .contains(&wgpu::CompositeAlphaMode::PostMultiplied) + { + wgpu::CompositeAlphaMode::PostMultiplied + } else if alpha_modes + .contains(&wgpu::CompositeAlphaMode::PreMultiplied) + { + wgpu::CompositeAlphaMode::PreMultiplied + } else { + wgpu::CompositeAlphaMode::Auto + }; + + format.zip(Some(preferred_alpha)) + })?; + + log::info!( + "Selected format: {format:?} with alpha mode: {alpha_mode:?}" + ); #[cfg(target_arch = "wasm32")] let limits = [wgpu::Limits::downlevel_webgl2_defaults() @@ -120,6 +144,7 @@ impl Compositor { device, queue, format, + alpha_mode, }) } @@ -249,7 +274,7 @@ impl graphics::Compositor for Compositor { present_mode: self.settings.present_mode, width, height, - alpha_mode: wgpu::CompositeAlphaMode::Auto, + alpha_mode: self.alpha_mode, view_formats: vec![], desired_maximum_frame_latency: 2, }, |