From 87552a92cca18b28d1bfad34479dd481bcb2996c Mon Sep 17 00:00:00 2001 From: Connor Fitzgerald Date: Sat, 2 Jul 2022 21:40:15 -0400 Subject: [PATCH] Fix GL_EXT_color_buffer_float detection on desktop --- wgpu-hal/src/gles/adapter.rs | 36 +++++++++++++++++++++++++++++------- wgpu-hal/src/gles/mod.rs | 5 ++++- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/wgpu-hal/src/gles/adapter.rs b/wgpu-hal/src/gles/adapter.rs index 19e8c2b5b7..14beea6dac 100644 --- a/wgpu-hal/src/gles/adapter.rs +++ b/wgpu-hal/src/gles/adapter.rs @@ -300,8 +300,6 @@ impl super::Adapter { !(cfg!(target_arch = "wasm32") || is_angle), ); - let is_ext_color_buffer_float_supported = extensions.contains("EXT_color_buffer_float"); - let mut features = wgt::Features::empty() | wgt::Features::TEXTURE_ADAPTER_SPECIFIC_FORMAT_FEATURES | wgt::Features::CLEAR_TEXTURE @@ -380,6 +378,17 @@ impl super::Adapter { super::PrivateCapabilities::GET_BUFFER_SUB_DATA, cfg!(target_arch = "wasm32"), ); + let color_buffer_float = extensions.contains("GL_EXT_color_buffer_float") + || extensions.contains("EXT_color_buffer_float"); + let color_buffer_half_float = extensions.contains("GL_EXT_color_buffer_half_float"); + private_caps.set( + super::PrivateCapabilities::COLOR_BUFFER_HALF_FLOAT, + color_buffer_half_float || color_buffer_float, + ); + private_caps.set( + super::PrivateCapabilities::COLOR_BUFFER_FLOAT, + color_buffer_float, + ); let max_texture_size = gl.get_parameter_i32(glow::MAX_TEXTURE_SIZE) as u32; let max_texture_3d_size = gl.get_parameter_i32(glow::MAX_3D_TEXTURE_SIZE) as u32; @@ -513,7 +522,6 @@ impl super::Adapter { workarounds, shading_language_version, max_texture_size, - is_ext_color_buffer_float_supported, }), }, info: Self::make_info(vendor, renderer), @@ -634,7 +642,21 @@ impl crate::Adapter for super::Adapter { let filterable_renderable = filterable | renderable | Tfc::COLOR_ATTACHMENT_BLEND; let storage = Tfc::STORAGE | Tfc::STORAGE_READ_WRITE; - let float_renderable = if self.shared.is_ext_color_buffer_float_supported { + let half_float_renderable = if self + .shared + .private_caps + .contains(super::PrivateCapabilities::COLOR_BUFFER_HALF_FLOAT) + { + Tfc::COLOR_ATTACHMENT | Tfc::COLOR_ATTACHMENT_BLEND + } else { + Tfc::empty() + }; + + let float_renderable = if self + .shared + .private_caps + .contains(super::PrivateCapabilities::COLOR_BUFFER_FLOAT) + { Tfc::COLOR_ATTACHMENT | Tfc::COLOR_ATTACHMENT_BLEND } else { Tfc::empty() @@ -649,7 +671,7 @@ impl crate::Adapter for super::Adapter { Tf::R16Sint => renderable, Tf::R16Unorm => empty, Tf::R16Snorm => empty, - Tf::R16Float => filterable | float_renderable, + Tf::R16Float => filterable | half_float_renderable, Tf::Rg8Unorm => filterable_renderable, Tf::Rg8Snorm => filterable, Tf::Rg8Uint => renderable, @@ -661,7 +683,7 @@ impl crate::Adapter for super::Adapter { Tf::Rg16Sint => renderable, Tf::Rg16Unorm => empty, Tf::Rg16Snorm => empty, - Tf::Rg16Float => filterable | float_renderable, + Tf::Rg16Float => filterable | half_float_renderable, Tf::Rgba8Unorm | Tf::Rgba8UnormSrgb => filterable_renderable | storage, Tf::Bgra8Unorm | Tf::Bgra8UnormSrgb => filterable_renderable, Tf::Rgba8Snorm => filterable, @@ -676,7 +698,7 @@ impl crate::Adapter for super::Adapter { Tf::Rgba16Sint => renderable | storage, Tf::Rgba16Unorm => empty, Tf::Rgba16Snorm => empty, - Tf::Rgba16Float => filterable | storage | float_renderable, + Tf::Rgba16Float => filterable | storage | half_float_renderable, Tf::Rgba32Uint => renderable | storage, Tf::Rgba32Sint => renderable | storage, Tf::Rgba32Float => unfilterable | storage | float_renderable, diff --git a/wgpu-hal/src/gles/mod.rs b/wgpu-hal/src/gles/mod.rs index ec0d39fc19..69c6168c48 100644 --- a/wgpu-hal/src/gles/mod.rs +++ b/wgpu-hal/src/gles/mod.rs @@ -138,6 +138,10 @@ bitflags::bitflags! { const CAN_DISABLE_DRAW_BUFFER = 1 << 6; /// Supports `glGetBufferSubData` const GET_BUFFER_SUB_DATA = 1 << 7; + /// Supports `f16` color buffers + const COLOR_BUFFER_HALF_FLOAT = 1 << 8; + /// Supports `f11/f10` and `f32` color buffers + const COLOR_BUFFER_FLOAT = 1 << 9; } } @@ -184,7 +188,6 @@ struct AdapterShared { workarounds: Workarounds, shading_language_version: naga::back::glsl::Version, max_texture_size: u32, - is_ext_color_buffer_float_supported: bool, } pub struct Adapter {