From 174e63e8d09117974280cb638123946278bfa6ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 16 Mar 2019 13:22:49 +0100 Subject: [PATCH] GL: new "intel-windows-broken-dsa-framebuffer-clear" workaround. I'm too lazy to write the commit messages now. --- doc/changelog.dox | 2 + .../GL/Implementation/FramebufferState.cpp | 38 +++++++++++++------ .../GL/Implementation/driverSpecific.cpp | 4 ++ 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/doc/changelog.dox b/doc/changelog.dox index dabd9130f..a3a37e6a6 100644 --- a/doc/changelog.dox +++ b/doc/changelog.dox @@ -87,6 +87,8 @@ See also: - @cpp "intel-windows-broken-dsa-layered-cubemap-array-framebuffer-attachment" @ce fixing @ref GL::Framebuffer::attachLayeredTexture() with @ref GL::CubeMapTextureArray + - @cpp "intel-windows-broken-dsa-framebuffer-clear" @ce + fixing @ref GL::Framebuffer::clearColor() - New `--magnum-gpu-validation` @ref GL-Context-command-line "command-line option" and a corresponding environment variable to conveniently enable @gl_extension{KHR,debug} debug output diff --git a/src/Magnum/GL/Implementation/FramebufferState.cpp b/src/Magnum/GL/Implementation/FramebufferState.cpp index 96ab2cce7..e268d0d12 100644 --- a/src/Magnum/GL/Implementation/FramebufferState.cpp +++ b/src/Magnum/GL/Implementation/FramebufferState.cpp @@ -65,11 +65,6 @@ FramebufferState::FramebufferState(Context& context, std::vector& e checkStatusImplementation = &AbstractFramebuffer::checkStatusImplementationDSA; - clearIImplementation = &AbstractFramebuffer::clearImplementationDSA; - clearUIImplementation = &AbstractFramebuffer::clearImplementationDSA; - clearFImplementation = &AbstractFramebuffer::clearImplementationDSA; - clearFIImplementation = &AbstractFramebuffer::clearImplementationDSA; - drawBuffersImplementation = &AbstractFramebuffer::drawBuffersImplementationDSA; drawBufferImplementation = &AbstractFramebuffer::drawBufferImplementationDSA; readBufferImplementation = &AbstractFramebuffer::readBufferImplementationDSA; @@ -94,13 +89,6 @@ FramebufferState::FramebufferState(Context& context, std::vector& e { checkStatusImplementation = &AbstractFramebuffer::checkStatusImplementationDefault; - #ifndef MAGNUM_TARGET_GLES2 - clearIImplementation = &AbstractFramebuffer::clearImplementationDefault; - clearUIImplementation = &AbstractFramebuffer::clearImplementationDefault; - clearFImplementation = &AbstractFramebuffer::clearImplementationDefault; - clearFIImplementation = &AbstractFramebuffer::clearImplementationDefault; - #endif - #ifndef MAGNUM_TARGET_GLES2 drawBuffersImplementation = &AbstractFramebuffer::drawBuffersImplementationDefault; #endif @@ -175,6 +163,32 @@ FramebufferState::FramebufferState(Context& context, std::vector& e } #endif + /* DSA/non-DSA implementation for framebuffer clearing. Yes, it's because + Intel Windows drivers are shit. */ + #ifndef MAGNUM_TARGET_GLES + if(context.isExtensionSupported() + #ifdef CORRADE_TARGET_WINDOWS + && (!(context.detectedDriver() & Context::DetectedDriver::IntelWindows) || + context.isDriverWorkaroundDisabled("intel-windows-broken-dsa-framebuffer-clear")) + #endif + ) { + /* Extension name added above */ + + clearIImplementation = &AbstractFramebuffer::clearImplementationDSA; + clearUIImplementation = &AbstractFramebuffer::clearImplementationDSA; + clearFImplementation = &AbstractFramebuffer::clearImplementationDSA; + clearFIImplementation = &AbstractFramebuffer::clearImplementationDSA; + } else + #endif + { + #ifndef MAGNUM_TARGET_GLES2 + clearIImplementation = &AbstractFramebuffer::clearImplementationDefault; + clearUIImplementation = &AbstractFramebuffer::clearImplementationDefault; + clearFImplementation = &AbstractFramebuffer::clearImplementationDefault; + clearFIImplementation = &AbstractFramebuffer::clearImplementationDefault; + #endif + } + /* Framebuffer texture attachment on ES3 */ #if defined(MAGNUM_TARGET_GLES) && !defined(MAGNUM_TARGET_WEBGL) && !defined(MAGNUM_TARGET_GLES2) if(context.isVersionSupported(Version::GLES320)) diff --git a/src/Magnum/GL/Implementation/driverSpecific.cpp b/src/Magnum/GL/Implementation/driverSpecific.cpp index ac5d97aa4..fdb8053a3 100644 --- a/src/Magnum/GL/Implementation/driverSpecific.cpp +++ b/src/Magnum/GL/Implementation/driverSpecific.cpp @@ -230,6 +230,10 @@ namespace { non-array cube map attachment works. Using the non-DSA code path as a workaround. */ "intel-windows-broken-dsa-layered-cubemap-array-framebuffer-attachment", + + /* DSA glClearNamedFramebuffer*() on Intel Windows drivers doesn't do + anything. Using the non-DSA code path as a workaournd. */ + "intel-windows-broken-dsa-framebuffer-clear", #endif #ifndef MAGNUM_TARGET_GLES