Merge pull request #2259 from PolyMeilex/wgpu-image-workaround-wgpu-gl-heuristics

[wgpu.image] Workaround WGPU OpenGL heuristics
This commit is contained in:
Héctor Ramón 2024-02-19 08:35:21 +01:00 committed by GitHub
commit 121d220532
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 52 additions and 22 deletions

View file

@ -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) - 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) - 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... Many thanks to...
- @akshayr-mecha - @akshayr-mecha
@ -156,6 +159,7 @@ Many thanks to...
- @nicksenger - @nicksenger
- @Nisatru - @Nisatru
- @nyurik - @nyurik
- @PolyMeilex
- @Remmirad - @Remmirad
- @ripytide - @ripytide
- @snaggen - @snaggen

View file

@ -87,7 +87,7 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {
}); });
let surface = instance.create_surface(window.clone())?; let surface = instance.create_surface(window.clone())?;
let (format, (device, queue)) = let (format, adapter, device, queue) =
futures::futures::executor::block_on(async { futures::futures::executor::block_on(async {
let adapter = wgpu::util::initialize_adapter_from_env_or_default( let adapter = wgpu::util::initialize_adapter_from_env_or_default(
&instance, &instance,
@ -107,6 +107,19 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {
let capabilities = surface.get_capabilities(&adapter); 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 capabilities
.formats .formats
@ -115,18 +128,9 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {
.find(wgpu::TextureFormat::is_srgb) .find(wgpu::TextureFormat::is_srgb)
.or_else(|| capabilities.formats.first().copied()) .or_else(|| capabilities.formats.first().copied())
.expect("Get preferred format"), .expect("Get preferred format"),
adapter adapter,
.request_device( device,
&wgpu::DeviceDescriptor { queue,
label: None,
required_features: adapter_features
& wgpu::Features::default(),
required_limits: needed_limits,
},
None,
)
.await
.expect("Request device"),
) )
}); });
@ -153,7 +157,7 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {
// Initialize iced // Initialize iced
let mut debug = Debug::new(); let mut debug = Debug::new();
let mut renderer = Renderer::new( let mut renderer = Renderer::new(
Backend::new(&device, &queue, Settings::default(), format), Backend::new(&adapter, &device, &queue, Settings::default(), format),
Font::default(), Font::default(),
Pixels(16.0), Pixels(16.0),
); );

View file

@ -27,7 +27,6 @@ pub struct Backend {
text_pipeline: text::Pipeline, text_pipeline: text::Pipeline,
triangle_pipeline: triangle::Pipeline, triangle_pipeline: triangle::Pipeline,
pipeline_storage: pipeline::Storage, pipeline_storage: pipeline::Storage,
#[cfg(any(feature = "image", feature = "svg"))] #[cfg(any(feature = "image", feature = "svg"))]
image_pipeline: image::Pipeline, image_pipeline: image::Pipeline,
} }
@ -35,6 +34,7 @@ pub struct Backend {
impl Backend { impl Backend {
/// Creates a new [`Backend`]. /// Creates a new [`Backend`].
pub fn new( pub fn new(
_adapter: &wgpu::Adapter,
device: &wgpu::Device, device: &wgpu::Device,
queue: &wgpu::Queue, queue: &wgpu::Queue,
settings: Settings, settings: Settings,
@ -46,7 +46,11 @@ impl Backend {
triangle::Pipeline::new(device, format, settings.antialiasing); triangle::Pipeline::new(device, format, settings.antialiasing);
#[cfg(any(feature = "image", feature = "svg"))] #[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 { Self {
quad_pipeline, quad_pipeline,

View file

@ -176,7 +176,11 @@ impl Data {
} }
impl Pipeline { 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 { let nearest_sampler = device.create_sampler(&wgpu::SamplerDescriptor {
address_mode_u: wgpu::AddressMode::ClampToEdge, address_mode_u: wgpu::AddressMode::ClampToEdge,
address_mode_v: wgpu::AddressMode::ClampToEdge, address_mode_v: wgpu::AddressMode::ClampToEdge,
@ -318,7 +322,7 @@ impl Pipeline {
multiview: None, multiview: None,
}); });
let texture_atlas = Atlas::new(device); let texture_atlas = Atlas::new(device, backend);
let texture = device.create_bind_group(&wgpu::BindGroupDescriptor { let texture = device.create_bind_group(&wgpu::BindGroupDescriptor {
label: Some("iced_wgpu::image texture atlas bind group"), label: Some("iced_wgpu::image texture atlas bind group"),

View file

@ -23,11 +23,19 @@ pub struct Atlas {
} }
impl 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 { let extent = wgpu::Extent3d {
width: SIZE, width: SIZE,
height: SIZE, height: SIZE,
depth_or_array_layers: 1, depth_or_array_layers: layers.len() as u32,
}; };
let texture = device.create_texture(&wgpu::TextureDescriptor { let texture = device.create_texture(&wgpu::TextureDescriptor {
@ -55,7 +63,7 @@ impl Atlas {
Atlas { Atlas {
texture, texture,
texture_view, texture_view,
layers: vec![Layer::Empty], layers,
} }
} }

View file

@ -146,7 +146,13 @@ impl Compositor {
/// Creates a new rendering [`Backend`] for this [`Compositor`]. /// Creates a new rendering [`Backend`] for this [`Compositor`].
pub fn create_backend(&self) -> Backend { 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,
)
} }
} }