From 3857d091329f8c881b7d4a2e0c07a1bdca58da3d Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Sat, 6 Jan 2018 00:42:16 -0400 Subject: [PATCH] Don't use persistently mapped buffers on Intel Ivy Bridge GPUs on Windows. glClientWaitSync can hang with those drivers, apparently. --- src/modules/graphics/opengl/OpenGL.cpp | 9 +++++++++ src/modules/graphics/opengl/OpenGL.h | 7 +++++++ src/modules/graphics/opengl/StreamBuffer.cpp | 19 +++++++++++-------- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/modules/graphics/opengl/OpenGL.cpp b/src/modules/graphics/opengl/OpenGL.cpp index 781188e72..edded2370 100644 --- a/src/modules/graphics/opengl/OpenGL.cpp +++ b/src/modules/graphics/opengl/OpenGL.cpp @@ -147,6 +147,15 @@ bool OpenGL::initContext() } #endif +#ifdef LOVE_WINDOWS + if (getVendor() == VENDOR_INTEL && gl.isCoreProfile()) + { + const char *device = (const char *) glGetString(GL_RENDERER); + if (strstr(device, "HD Graphics 4000") || strstr(device, "HD Graphics 2500")) + bugs.clientWaitSyncStalls = true; + } +#endif + contextInitialized = true; return true; diff --git a/src/modules/graphics/opengl/OpenGL.h b/src/modules/graphics/opengl/OpenGL.h index 8d3019b54..1551e2c9b 100644 --- a/src/modules/graphics/opengl/OpenGL.h +++ b/src/modules/graphics/opengl/OpenGL.h @@ -152,6 +152,13 @@ public: **/ bool generateMipmapsRequiresTexture2DEnable; + /** + * Report: Intel HD 4000 on Windows hangs during glClientWaitSync. + * I found this when googling the issue: + * https://github.com/mjn33/planetgen/commit/235e23873a22e219fffdd9ede706c1051aa0f107 + **/ + bool clientWaitSyncStalls; + /** * Other bugs which have workarounds that don't use conditional code at * the moment: diff --git a/src/modules/graphics/opengl/StreamBuffer.cpp b/src/modules/graphics/opengl/StreamBuffer.cpp index ad3ae13a6..4a3a8e7e3 100644 --- a/src/modules/graphics/opengl/StreamBuffer.cpp +++ b/src/modules/graphics/opengl/StreamBuffer.cpp @@ -538,14 +538,17 @@ love::graphics::StreamBuffer *CreateStreamBuffer(BufferType mode, size_t size) { if (gl.isCoreProfile()) { - // AMD's pinned memory seems to be faster than persistent mapping, on - // AMD GPUs. - if (GLAD_AMD_pinned_memory) - return new StreamBufferPinnedMemory(mode, size); - else if (GLAD_VERSION_4_4 || GLAD_ARB_buffer_storage) - return new StreamBufferPersistentMapSync(mode, size); - else - return new StreamBufferSubDataOrphan(mode, size); + if (!gl.bugs.clientWaitSyncStalls) + { + // AMD's pinned memory seems to be faster than persistent mapping, + // on AMD GPUs. + if (GLAD_AMD_pinned_memory) + return new StreamBufferPinnedMemory(mode, size); + else if (GLAD_VERSION_4_4 || GLAD_ARB_buffer_storage) + return new StreamBufferPersistentMapSync(mode, size); + } + + return new StreamBufferSubDataOrphan(mode, size); } else return new StreamBufferClientMemory(mode, size);