Merge pull request #2919 from bungoboingo/hack/fix-gl-cubemap-detection

[Fix] GL backend interpreting atlas texture as cube map vs 2d tex array when atlas layer depth == 6
This commit is contained in:
Héctor 2025-05-04 22:56:03 +02:00 • committed by GitHub
commit e6da449c92
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -19,6 +19,7 @@ use std::sync::Arc;
#[derive(Debug)] #[derive(Debug)]
pub struct Atlas { pub struct Atlas {
backend: wgpu::Backend,
texture: wgpu::Texture, texture: wgpu::Texture,
texture_view: wgpu::TextureView, texture_view: wgpu::TextureView,
texture_bind_group: wgpu::BindGroup, texture_bind_group: wgpu::BindGroup,
@ -79,6 +80,7 @@ impl Atlas {
}); });
Atlas { Atlas {
backend,
texture, texture,
texture_view, texture_view,
texture_bind_group, texture_bind_group,
@ -376,12 +378,22 @@ impl Atlas {
return; return;
} }
// On the GL backend if layers.len() == 6 we need to help wgpu figure out that this texture
// is still a `GL_TEXTURE_2D_ARRAY` rather than `GL_TEXTURE_CUBE_MAP`. This will over-allocate
// some unused memory on GL, but it's better than not being able to grow the atlas past a depth
// of 6!
// https://github.com/gfx-rs/wgpu/blob/004e3efe84a320d9331371ed31fa50baa2414911/wgpu-hal/src/gles/mod.rs#L371
let depth_or_array_layers = match self.backend {
wgpu::Backend::Gl if self.layers.len() == 6 => 7,
_ => self.layers.len() as u32,
};
let new_texture = device.create_texture(&wgpu::TextureDescriptor { let new_texture = device.create_texture(&wgpu::TextureDescriptor {
label: Some("iced_wgpu::image texture atlas"), label: Some("iced_wgpu::image texture atlas"),
size: wgpu::Extent3d { size: wgpu::Extent3d {
width: SIZE, width: SIZE,
height: SIZE, height: SIZE,
depth_or_array_layers: self.layers.len() as u32, depth_or_array_layers,
}, },
mip_level_count: 1, mip_level_count: 1,
sample_count: 1, sample_count: 1,