diff options
Diffstat (limited to '')
| -rw-r--r-- | CHANGELOG.md | 4 | ||||
| -rw-r--r-- | examples/integration/src/main.rs | 32 | ||||
| -rw-r--r-- | wgpu/src/backend.rs | 8 | ||||
| -rw-r--r-- | wgpu/src/image.rs | 8 | ||||
| -rw-r--r-- | wgpu/src/image/atlas.rs | 14 | ||||
| -rw-r--r-- | wgpu/src/window/compositor.rs | 8 | 
6 files changed, 52 insertions, 22 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index cf04677d..bb488f8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -116,6 +116,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0  - Alpha mode misconfiguration in `iced_wgpu`. [#2231](https://github.com/iced-rs/iced/pull/2231)  - Outdated documentation leading to a dead link. [#2232](https://github.com/iced-rs/iced/pull/2232) +## Patched +- Black images when using OpenGL backend in `iced_wgpu`. [#2259](https://github.com/iced-rs/iced/pull/2259) +  Many thanks to...  - @akshayr-mecha @@ -156,6 +159,7 @@ Many thanks to...  - @nicksenger  - @Nisatru  - @nyurik +- @PolyMeilex  - @Remmirad  - @ripytide  - @snaggen diff --git a/examples/integration/src/main.rs b/examples/integration/src/main.rs index ed61459f..0e2e53ac 100644 --- a/examples/integration/src/main.rs +++ b/examples/integration/src/main.rs @@ -87,7 +87,7 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {      });      let surface = instance.create_surface(window.clone())?; -    let (format, (device, queue)) = +    let (format, adapter, device, queue) =          futures::futures::executor::block_on(async {              let adapter = wgpu::util::initialize_adapter_from_env_or_default(                  &instance, @@ -107,6 +107,19 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {              let capabilities = surface.get_capabilities(&adapter); +            let (device, queue) = adapter +                .request_device( +                    &wgpu::DeviceDescriptor { +                        label: None, +                        required_features: adapter_features +                            & wgpu::Features::default(), +                        required_limits: needed_limits, +                    }, +                    None, +                ) +                .await +                .expect("Request device"); +              (                  capabilities                      .formats @@ -115,18 +128,9 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {                      .find(wgpu::TextureFormat::is_srgb)                      .or_else(|| capabilities.formats.first().copied())                      .expect("Get preferred format"), -                adapter -                    .request_device( -                        &wgpu::DeviceDescriptor { -                            label: None, -                            required_features: adapter_features -                                & wgpu::Features::default(), -                            required_limits: needed_limits, -                        }, -                        None, -                    ) -                    .await -                    .expect("Request device"), +                adapter, +                device, +                queue,              )          }); @@ -153,7 +157,7 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {      // Initialize iced      let mut debug = Debug::new();      let mut renderer = Renderer::new( -        Backend::new(&device, &queue, Settings::default(), format), +        Backend::new(&adapter, &device, &queue, Settings::default(), format),          Font::default(),          Pixels(16.0),      ); diff --git a/wgpu/src/backend.rs b/wgpu/src/backend.rs index 77b6fa83..09ddbe4d 100644 --- a/wgpu/src/backend.rs +++ b/wgpu/src/backend.rs @@ -27,7 +27,6 @@ pub struct Backend {      text_pipeline: text::Pipeline,      triangle_pipeline: triangle::Pipeline,      pipeline_storage: pipeline::Storage, -      #[cfg(any(feature = "image", feature = "svg"))]      image_pipeline: image::Pipeline,  } @@ -35,6 +34,7 @@ pub struct Backend {  impl Backend {      /// Creates a new [`Backend`].      pub fn new( +        _adapter: &wgpu::Adapter,          device: &wgpu::Device,          queue: &wgpu::Queue,          settings: Settings, @@ -46,7 +46,11 @@ impl Backend {              triangle::Pipeline::new(device, format, settings.antialiasing);          #[cfg(any(feature = "image", feature = "svg"))] -        let image_pipeline = image::Pipeline::new(device, format); +        let image_pipeline = { +            let backend = _adapter.get_info().backend; + +            image::Pipeline::new(device, format, backend) +        };          Self {              quad_pipeline, diff --git a/wgpu/src/image.rs b/wgpu/src/image.rs index 06c22870..c8e4a4c2 100644 --- a/wgpu/src/image.rs +++ b/wgpu/src/image.rs @@ -176,7 +176,11 @@ impl Data {  }  impl Pipeline { -    pub fn new(device: &wgpu::Device, format: wgpu::TextureFormat) -> Self { +    pub fn new( +        device: &wgpu::Device, +        format: wgpu::TextureFormat, +        backend: wgpu::Backend, +    ) -> Self {          let nearest_sampler = device.create_sampler(&wgpu::SamplerDescriptor {              address_mode_u: wgpu::AddressMode::ClampToEdge,              address_mode_v: wgpu::AddressMode::ClampToEdge, @@ -318,7 +322,7 @@ impl Pipeline {                  multiview: None,              }); -        let texture_atlas = Atlas::new(device); +        let texture_atlas = Atlas::new(device, backend);          let texture = device.create_bind_group(&wgpu::BindGroupDescriptor {              label: Some("iced_wgpu::image texture atlas bind group"), diff --git a/wgpu/src/image/atlas.rs b/wgpu/src/image/atlas.rs index 789e35b4..ea36e06d 100644 --- a/wgpu/src/image/atlas.rs +++ b/wgpu/src/image/atlas.rs @@ -23,11 +23,19 @@ pub struct Atlas {  }  impl Atlas { -    pub fn new(device: &wgpu::Device) -> Self { +    pub fn new(device: &wgpu::Device, backend: wgpu::Backend) -> Self { +        let layers = match backend { +            // On the GL backend we start with 2 layers, to help wgpu figure +            // out that this texture is `GL_TEXTURE_2D_ARRAY` rather than `GL_TEXTURE_2D` +            // https://github.com/gfx-rs/wgpu/blob/004e3efe84a320d9331371ed31fa50baa2414911/wgpu-hal/src/gles/mod.rs#L371 +            wgpu::Backend::Gl => vec![Layer::Empty, Layer::Empty], +            _ => vec![Layer::Empty], +        }; +          let extent = wgpu::Extent3d {              width: SIZE,              height: SIZE, -            depth_or_array_layers: 1, +            depth_or_array_layers: layers.len() as u32,          };          let texture = device.create_texture(&wgpu::TextureDescriptor { @@ -55,7 +63,7 @@ impl Atlas {          Atlas {              texture,              texture_view, -            layers: vec![Layer::Empty], +            layers,          }      } diff --git a/wgpu/src/window/compositor.rs b/wgpu/src/window/compositor.rs index f32ed3ac..7ac017d9 100644 --- a/wgpu/src/window/compositor.rs +++ b/wgpu/src/window/compositor.rs @@ -146,7 +146,13 @@ impl Compositor {      /// Creates a new rendering [`Backend`] for this [`Compositor`].      pub fn create_backend(&self) -> Backend { -        Backend::new(&self.device, &self.queue, self.settings, self.format) +        Backend::new( +            &self.adapter, +            &self.device, +            &self.queue, +            self.settings, +            self.format, +        )      }  }  | 
