diff --git a/CHANGELOG.md b/CHANGELOG.md index e753cb8f2f..6d47f9966f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -75,6 +75,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 258dee76e5..6414ee5213 100644 --- a/wgpu-hal/src/gles/command.rs +++ b/wgpu-hal/src/gles/command.rs @@ -604,6 +604,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 @@ -634,13 +641,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 7c728d3978..9a9e4bef99 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) => {