hal/gles: fix setting filtering on integer textures (#2222)

This commit is contained in:
Dzmitry Malyshau 2021-11-28 23:04:43 -05:00 committed by GitHub
parent cda893fe73
commit 62b036b55b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -557,82 +557,34 @@ impl crate::Device<super::Api> for super::Device {
super::TextureInner::Renderbuffer { raw }
} else {
let raw = gl.create_texture().unwrap();
//HACK: detect a cube map
let cube_count = if desc.size.width == desc.size.height
&& desc.size.depth_or_array_layers % 6 == 0
{
Some(desc.size.depth_or_array_layers / 6)
} else {
None
};
let target = match desc.dimension {
let (target, is_3d) = match desc.dimension {
wgt::TextureDimension::D1 | wgt::TextureDimension::D2 => {
if desc.sample_count > 1 {
let target = glow::TEXTURE_2D;
gl.bind_texture(target, Some(raw));
gl.tex_storage_2d_multisample(
target,
desc.sample_count as i32,
format_desc.internal,
desc.size.width as i32,
desc.size.height as i32,
true,
);
target
} else if desc.size.depth_or_array_layers > 1 && cube_count != Some(1) {
let target = match cube_count {
Some(_) => glow::TEXTURE_CUBE_MAP_ARRAY,
None => glow::TEXTURE_2D_ARRAY,
if desc.size.depth_or_array_layers > 1 {
//HACK: detect a cube map
let cube_count = if desc.size.width == desc.size.height
&& desc.size.depth_or_array_layers % 6 == 0
{
Some(desc.size.depth_or_array_layers / 6)
} else {
None
};
gl.bind_texture(target, Some(raw));
gl.tex_storage_3d(
target,
desc.mip_level_count as i32,
format_desc.internal,
desc.size.width as i32,
desc.size.height as i32,
desc.size.depth_or_array_layers as i32,
);
target
match cube_count {
None => (glow::TEXTURE_2D_ARRAY, true),
Some(1) => (glow::TEXTURE_CUBE_MAP, false),
Some(_) => (glow::TEXTURE_CUBE_MAP_ARRAY, true),
}
} else {
let target = match cube_count {
Some(_) => glow::TEXTURE_CUBE_MAP,
None => glow::TEXTURE_2D,
};
gl.bind_texture(target, Some(raw));
gl.tex_storage_2d(
target,
desc.mip_level_count as i32,
format_desc.internal,
desc.size.width as i32,
desc.size.height as i32,
);
target
(glow::TEXTURE_2D, false)
}
}
wgt::TextureDimension::D3 => {
copy_size.depth = desc.size.depth_or_array_layers;
let target = glow::TEXTURE_3D;
gl.bind_texture(target, Some(raw));
gl.tex_storage_3d(
target,
desc.mip_level_count as i32,
format_desc.internal,
desc.size.width as i32,
desc.size.height as i32,
desc.size.depth_or_array_layers as i32,
);
target
(glow::TEXTURE_3D, true)
}
};
#[cfg(not(target_arch = "wasm32"))]
if let Some(label) = desc.label {
if gl.supports_debug() {
gl.object_label(glow::TEXTURE, mem::transmute(raw), Some(label));
}
}
gl.bind_texture(target, Some(raw));
//Note: this has to be done before defining the storage!
match desc.format.describe().sample_type {
wgt::TextureSampleType::Float { filterable: false }
| wgt::TextureSampleType::Uint
@ -645,6 +597,41 @@ impl crate::Device<super::Api> for super::Device {
| wgt::TextureSampleType::Depth => {}
}
if is_3d {
gl.tex_storage_3d(
target,
desc.mip_level_count as i32,
format_desc.internal,
desc.size.width as i32,
desc.size.height as i32,
desc.size.depth_or_array_layers as i32,
);
} else if desc.sample_count > 1 {
gl.tex_storage_2d_multisample(
target,
desc.sample_count as i32,
format_desc.internal,
desc.size.width as i32,
desc.size.height as i32,
true,
);
} else {
gl.tex_storage_2d(
target,
desc.mip_level_count as i32,
format_desc.internal,
desc.size.width as i32,
desc.size.height as i32,
);
}
#[cfg(not(target_arch = "wasm32"))]
if let Some(label) = desc.label {
if gl.supports_debug() {
gl.object_label(glow::TEXTURE, mem::transmute(raw), Some(label));
}
}
gl.bind_texture(target, None);
super::TextureInner::Texture { raw, target }
};