summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-02-19 08:18:51 +0100
committerLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-02-19 08:18:51 +0100
commit04df889cacfc4dfe93c2640b75f65eaafa060dba (patch)
treea59fd2d8c360a3a7b81d079e733b715e4a49db0d
parent4272090d36caf2937c170d3b28d1be1acc94a440 (diff)
downloadiced-04df889cacfc4dfe93c2640b75f65eaafa060dba.tar.gz
iced-04df889cacfc4dfe93c2640b75f65eaafa060dba.tar.bz2
iced-04df889cacfc4dfe93c2640b75f65eaafa060dba.zip
Use two layers for `image::atlas` only on `Gl` backend
-rw-r--r--examples/integration/src/main.rs32
-rw-r--r--wgpu/src/backend.rs8
-rw-r--r--wgpu/src/image.rs8
-rw-r--r--wgpu/src/image/atlas.rs14
-rw-r--r--wgpu/src/window/compositor.rs8
5 files changed, 46 insertions, 24 deletions
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 0919f6df..ea36e06d 100644
--- a/wgpu/src/image/atlas.rs
+++ b/wgpu/src/image/atlas.rs
@@ -23,11 +23,15 @@ pub struct Atlas {
}
impl Atlas {
- pub fn new(device: &wgpu::Device) -> Self {
- // 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
- let layers = vec![Layer::Empty, Layer::Empty];
+ 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,
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,
+ )
}
}