diff --git a/Source/Core/VideoBackends/OGL/StreamBuffer.cpp b/Source/Core/VideoBackends/OGL/StreamBuffer.cpp index 366aa42965..eb7fc0a619 100644 --- a/Source/Core/VideoBackends/OGL/StreamBuffer.cpp +++ b/Source/Core/VideoBackends/OGL/StreamBuffer.cpp @@ -376,7 +376,12 @@ std::unique_ptr<StreamBuffer> StreamBuffer::Create(u32 type, u32 size) // don't fall back to MapAnd* for Nvidia drivers if (DriverDetails::HasBug(DriverDetails::BUG_BROKEN_UNSYNC_MAPPING)) - return std::make_unique<BufferSubData>(type, size); + { + if (DriverDetails::HasBug(DriverDetails::BUG_BROKEN_BUFFER_STREAM)) + return std::make_unique<BufferData>(type, size); + else + return std::make_unique<BufferSubData>(type, size); + } // mapping fallback if (g_ogl_config.bSupportsGLSync) diff --git a/Source/Core/VideoCommon/DriverDetails.cpp b/Source/Core/VideoCommon/DriverDetails.cpp index 2885aea7e9..d280a6a9b4 100644 --- a/Source/Core/VideoCommon/DriverDetails.cpp +++ b/Source/Core/VideoCommon/DriverDetails.cpp @@ -82,6 +82,8 @@ static BugInfo m_known_bugs[] = { BUG_BROKEN_UNSYNC_MAPPING, -1.0, -1.0, true}, {API_OPENGL, OS_LINUX, VENDOR_NVIDIA, DRIVER_NVIDIA, Family::UNKNOWN, BUG_BROKEN_UNSYNC_MAPPING, -1.0, -1.0, true}, + {API_OPENGL, OS_ALL, VENDOR_ARM, DRIVER_ARM, Family::UNKNOWN, BUG_BROKEN_UNSYNC_MAPPING, -1.0, + -1.0, true}, {API_OPENGL, OS_WINDOWS, VENDOR_INTEL, DRIVER_INTEL, Family::UNKNOWN, BUG_INTEL_BROKEN_BUFFER_STORAGE, 101810.3907, 101810.3960, true}, {API_OPENGL, OS_ALL, VENDOR_ATI, DRIVER_ATI, Family::UNKNOWN, BUG_SLOW_GETBUFFERSUBDATA, -1.0, diff --git a/Source/Core/VideoCommon/DriverDetails.h b/Source/Core/VideoCommon/DriverDetails.h index 53f0c68739..df06a77d92 100644 --- a/Source/Core/VideoCommon/DriverDetails.h +++ b/Source/Core/VideoCommon/DriverDetails.h @@ -125,13 +125,17 @@ enum Bug // Intel HD 4000 series isn't affected by the bug BUG_PRIMITIVE_RESTART, // Bug: unsync mapping doesn't work fine - // Affected devices: Nvidia driver + // Affected devices: Nvidia driver, ARM Mali // Started Version: -1 // Ended Version: -1 // The Nvidia driver (both Windows + Linux) doesn't like unsync mapping performance wise. // Because of their threaded behavior, they seem not to handle unsync mapping complete unsync, // in fact, they serialize the driver which adds a much bigger overhead. // Workaround: Use BufferSubData + // The Mali behavior is even worse: They just ignore the unsychronized flag and stall the GPU. + // Workaround: As they were even too lazy to implement asynchronous buffer updates, + // BufferSubData stalls as well, so we have to use the slowest possible path: + // Alloc one buffer per draw call with BufferData. // TODO: some Windows AMD driver/GPU combination seems also affected // but as they all support pinned memory, it doesn't matter BUG_BROKEN_UNSYNC_MAPPING,