From 1a6860f35c2a6c9c89dc91dfff30694534d7be32 Mon Sep 17 00:00:00 2001 From: Vitor K Date: Thu, 17 Aug 2023 17:16:51 -0300 Subject: [PATCH] opengl: disable ClearTexture on Intel drivers (#6879) --- src/video_core/renderer_opengl/gl_driver.cpp | 4 ++++ src/video_core/renderer_opengl/gl_driver.h | 2 ++ src/video_core/renderer_opengl/gl_texture_runtime.cpp | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/video_core/renderer_opengl/gl_driver.cpp b/src/video_core/renderer_opengl/gl_driver.cpp index c0b8c2fe4..d9778393a 100644 --- a/src/video_core/renderer_opengl/gl_driver.cpp +++ b/src/video_core/renderer_opengl/gl_driver.cpp @@ -188,6 +188,10 @@ void Driver::FindBugs() { if (vendor == Vendor::AMD || (vendor == Vendor::Intel && !is_linux)) { bugs |= DriverBug::BrokenTextureView; } + + if (vendor == Vendor::Intel && !is_linux) { + bugs |= DriverBug::BrokenClearTexture; + } } } // namespace OpenGL diff --git a/src/video_core/renderer_opengl/gl_driver.h b/src/video_core/renderer_opengl/gl_driver.h index 40044b181..1e1b5e246 100644 --- a/src/video_core/renderer_opengl/gl_driver.h +++ b/src/video_core/renderer_opengl/gl_driver.h @@ -38,6 +38,8 @@ enum class DriverBug { VertexArrayOutOfBound = 1 << 1, // On AMD and Intel drivers on Windows glTextureView produces incorrect results BrokenTextureView = 1 << 2, + // On Haswell and Broadwell Intel drivers glClearTexSubImage produces a black screen + BrokenClearTexture = 1 << 3, }; /** diff --git a/src/video_core/renderer_opengl/gl_texture_runtime.cpp b/src/video_core/renderer_opengl/gl_texture_runtime.cpp index 3fdb625f1..a45ecc570 100644 --- a/src/video_core/renderer_opengl/gl_texture_runtime.cpp +++ b/src/video_core/renderer_opengl/gl_texture_runtime.cpp @@ -189,7 +189,7 @@ bool TextureRuntime::Reinterpret(Surface& source, Surface& dest, bool TextureRuntime::ClearTextureWithoutFbo(Surface& surface, const VideoCore::TextureClear& clear) { - if (!driver.HasArbClearTexture()) { + if (!driver.HasArbClearTexture() || driver.HasBug(DriverBug::BrokenClearTexture)) { return false; } GLenum format{};