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{};