From 65d8c94afd825cbed454af449712d408decbef6b Mon Sep 17 00:00:00 2001 From: Nick Guletskii Date: Tue, 14 May 2024 12:57:18 +0300 Subject: [PATCH] Issue SetDrawColorBuffers before clearing buffers in GLES, use clear_buffer_f32_slice instead of clear (#5666) * Issue SetDrawColorBuffers commands before issuing ClearColor This is necessary for glClearBuffer calls to work correctly on some machines (e.g. AMD Renoir graphics running on Linux). Without this, glClearBuffer calls are ignored. * Use clear_buffer_f32_slice instead of gl.clear to suppress WebGL warnings This fixes the following WebGL warning: "WebGL warning: drawBuffers: `buffers[i]` must be NONE or COLOR_ATTACHMENTi." When using native OpenGL, it is acceptable to call glDrawBuffers with an array of buffers where i != COLOR_ATTACHMENTi. In WebGL, this is not allowed. * Run cargo fmt * Add changes for PR GH-5666 to the CHANGELOG --- CHANGELOG.md | 2 ++ wgpu-hal/src/gles/command.rs | 14 +++++++------- wgpu-hal/src/gles/queue.rs | 8 +------- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bcedcad750..bf024ca8f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -81,6 +81,8 @@ By @stefnotch in [#5410](https://github.com/gfx-rs/wgpu/pull/5410) #### GLES / OpenGL - Fix regression on OpenGL (EGL) where non-sRGB still used sRGB [#5642](https://github.com/gfx-rs/wgpu/pull/5642) +- Fix `ClearColorF`, `ClearColorU` and `ClearColorI` commands being issued before `SetDrawColorBuffers` [#5666](https://github.com/gfx-rs/wgpu/pull/5666) +- Replace `glClear` with `glClearBufferF` because `glDrawBuffers` requires that the ith buffer must be `COLOR_ATTACHMENTi` or `NONE` [#5666](https://github.com/gfx-rs/wgpu/pull/5666) ## v0.20.0 (2024-04-28) diff --git a/wgpu-hal/src/gles/command.rs b/wgpu-hal/src/gles/command.rs index 17c20aea16..63a9b5496e 100644 --- a/wgpu-hal/src/gles/command.rs +++ b/wgpu-hal/src/gles/command.rs @@ -608,6 +608,13 @@ impl crate::CommandEncoder for super::CommandEncoder { depth: 0.0..1.0, }); + if !rendering_to_external_framebuffer { + // set the draw buffers and states + self.cmd_buffer + .commands + .push(C::SetDrawColorBuffers(desc.color_attachments.len() as u8)); + } + // issue the clears for (i, cat) in desc .color_attachments @@ -638,13 +645,6 @@ impl crate::CommandEncoder for super::CommandEncoder { } } - if !rendering_to_external_framebuffer { - // set the draw buffers and states - self.cmd_buffer - .commands - .push(C::SetDrawColorBuffers(desc.color_attachments.len() as u8)); - } - if let Some(ref dsat) = desc.depth_stencil_attachment { let clear_depth = !dsat.depth_ops.contains(crate::AttachmentOps::LOAD); let clear_stencil = !dsat.stencil_ops.contains(crate::AttachmentOps::LOAD); diff --git a/wgpu-hal/src/gles/queue.rs b/wgpu-hal/src/gles/queue.rs index deb87af971..f6b55a449a 100644 --- a/wgpu-hal/src/gles/queue.rs +++ b/wgpu-hal/src/gles/queue.rs @@ -1075,13 +1075,7 @@ impl super::Queue { { unsafe { self.perform_shader_clear(gl, draw_buffer, *color) }; } else { - // Prefer `clear` as `clear_buffer` functions have issues on Sandy Bridge - // on Windows. - unsafe { - gl.draw_buffers(&[glow::COLOR_ATTACHMENT0 + draw_buffer]); - gl.clear_color(color[0], color[1], color[2], color[3]); - gl.clear(glow::COLOR_BUFFER_BIT); - } + unsafe { gl.clear_buffer_f32_slice(glow::COLOR, draw_buffer, color) }; } } C::ClearColorU(draw_buffer, ref color) => {