OGL/Streambuffer: Use coherent mapping by default.
Coherent mappings have a lower overhead and less GL codes. So enables coherent mapping by default for all drivers. Both Qualcomm and ARM performs very bad with explicit flushing, so this change helps them as well. AFAIK there was one GPU generation which was slower on coherent mapping: nvidia tesla So Geforce 200 and 300 series should be tested with this PR before merging. As this was last tested many years ago, this issue might have been fixed as well. Those GPUs are close to 10 years old and not supported any more by nvidia.
This commit is contained in:
parent
dfb1dbad47
commit
fdfd8b19d6
|
@ -216,7 +216,7 @@ public:
|
||||||
class BufferStorage : public StreamBuffer
|
class BufferStorage : public StreamBuffer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
BufferStorage(u32 type, u32 size, bool _coherent = false)
|
BufferStorage(u32 type, u32 size, bool _coherent = true)
|
||||||
: StreamBuffer(type, size), coherent(_coherent)
|
: StreamBuffer(type, size), coherent(_coherent)
|
||||||
{
|
{
|
||||||
CreateFences();
|
CreateFences();
|
||||||
|
@ -368,13 +368,12 @@ std::unique_ptr<StreamBuffer> StreamBuffer::Create(u32 type, u32 size)
|
||||||
return std::make_unique<PinnedMemory>(type, size);
|
return std::make_unique<PinnedMemory>(type, size);
|
||||||
|
|
||||||
// buffer storage works well in most situations
|
// buffer storage works well in most situations
|
||||||
bool coherent = DriverDetails::HasBug(DriverDetails::BUG_BROKEN_EXPLICIT_FLUSH);
|
|
||||||
if (g_ogl_config.bSupportsGLBufferStorage &&
|
if (g_ogl_config.bSupportsGLBufferStorage &&
|
||||||
!(DriverDetails::HasBug(DriverDetails::BUG_BROKEN_BUFFER_STORAGE) &&
|
!(DriverDetails::HasBug(DriverDetails::BUG_BROKEN_BUFFER_STORAGE) &&
|
||||||
type == GL_ARRAY_BUFFER) &&
|
type == GL_ARRAY_BUFFER) &&
|
||||||
!(DriverDetails::HasBug(DriverDetails::BUG_INTEL_BROKEN_BUFFER_STORAGE) &&
|
!(DriverDetails::HasBug(DriverDetails::BUG_INTEL_BROKEN_BUFFER_STORAGE) &&
|
||||||
type == GL_ELEMENT_ARRAY_BUFFER))
|
type == GL_ELEMENT_ARRAY_BUFFER))
|
||||||
return std::make_unique<BufferStorage>(type, size, coherent);
|
return std::make_unique<BufferStorage>(type, size);
|
||||||
|
|
||||||
// don't fall back to MapAnd* for Nvidia drivers
|
// don't fall back to MapAnd* for Nvidia drivers
|
||||||
if (DriverDetails::HasBug(DriverDetails::BUG_BROKEN_UNSYNC_MAPPING))
|
if (DriverDetails::HasBug(DriverDetails::BUG_BROKEN_UNSYNC_MAPPING))
|
||||||
|
|
|
@ -52,8 +52,6 @@ static BugInfo m_known_bugs[] = {
|
||||||
BUG_BROKEN_BUFFER_STREAM, -1.0, -1.0, true},
|
BUG_BROKEN_BUFFER_STREAM, -1.0, -1.0, true},
|
||||||
{API_OPENGL, OS_ALL, VENDOR_QUALCOMM, DRIVER_QUALCOMM, Family::UNKNOWN,
|
{API_OPENGL, OS_ALL, VENDOR_QUALCOMM, DRIVER_QUALCOMM, Family::UNKNOWN,
|
||||||
BUG_BROKEN_NEGATED_BOOLEAN, -1.0, -1.0, true},
|
BUG_BROKEN_NEGATED_BOOLEAN, -1.0, -1.0, true},
|
||||||
{API_OPENGL, OS_ALL, VENDOR_QUALCOMM, DRIVER_QUALCOMM, Family::UNKNOWN,
|
|
||||||
BUG_BROKEN_EXPLICIT_FLUSH, -1.0, -1.0, true},
|
|
||||||
{API_OPENGL, OS_ALL, VENDOR_ARM, DRIVER_ARM, Family::UNKNOWN, BUG_BROKEN_BUFFER_STREAM, -1.0,
|
{API_OPENGL, OS_ALL, VENDOR_ARM, DRIVER_ARM, Family::UNKNOWN, BUG_BROKEN_BUFFER_STREAM, -1.0,
|
||||||
-1.0, true},
|
-1.0, true},
|
||||||
{API_OPENGL, OS_ALL, VENDOR_ARM, DRIVER_ARM, Family::UNKNOWN, BUG_BROKEN_VSYNC, -1.0, -1.0,
|
{API_OPENGL, OS_ALL, VENDOR_ARM, DRIVER_ARM, Family::UNKNOWN, BUG_BROKEN_VSYNC, -1.0, -1.0,
|
||||||
|
|
|
@ -200,15 +200,6 @@ enum Bug
|
||||||
// Causes misrenderings on a large amount of things that draw lines.
|
// Causes misrenderings on a large amount of things that draw lines.
|
||||||
BUG_BROKEN_GEOMETRY_SHADERS,
|
BUG_BROKEN_GEOMETRY_SHADERS,
|
||||||
|
|
||||||
// Bug: Explicit flush is very slow on Qualcomm
|
|
||||||
// Started Version: -1
|
|
||||||
// Ended Version: -1
|
|
||||||
// Our ARB_buffer_storage code uses explicit flush to avoid coherent mapping.
|
|
||||||
// Qualcomm seems to have lots of overhead on explicit flushing, but the coherent mapping path is
|
|
||||||
// fine.
|
|
||||||
// So let's use coherent mapping there.
|
|
||||||
BUG_BROKEN_EXPLICIT_FLUSH,
|
|
||||||
|
|
||||||
// Bug: glGetBufferSubData for bounding box reads is slow on AMD drivers
|
// Bug: glGetBufferSubData for bounding box reads is slow on AMD drivers
|
||||||
// Started Version: -1
|
// Started Version: -1
|
||||||
// Ended Version: -1
|
// Ended Version: -1
|
||||||
|
|
Loading…
Reference in New Issue