diff options
| author | degasus <wickmarkus@web.de> | 2016-05-11 21:35:08 +0200 |
|---|---|---|
| committer | degasus <wickmarkus@web.de> | 2016-05-11 23:55:28 +0200 |
| commit | bca0e06a95e35e0841fd92cea97613c3ee8ba73d (patch) | |
| tree | cc8065005ed2a0ddbd27f54e06444ed666934bd5 /Source/Core/VideoBackends | |
| parent | 7517d126c874bf0d22f142d842fb9c9611e6298a (diff) | |
OGL: Use coherent mapping on Qualcomm devices.
Diffstat (limited to 'Source/Core/VideoBackends')
| -rw-r--r-- | Source/Core/VideoBackends/OGL/StreamBuffer.cpp | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/Source/Core/VideoBackends/OGL/StreamBuffer.cpp b/Source/Core/VideoBackends/OGL/StreamBuffer.cpp index 5268423d72..b616720ae2 100644 --- a/Source/Core/VideoBackends/OGL/StreamBuffer.cpp +++ b/Source/Core/VideoBackends/OGL/StreamBuffer.cpp @@ -210,7 +210,7 @@ public: class BufferStorage : public StreamBuffer { public: - BufferStorage(u32 type, u32 size) : StreamBuffer(type, size) + BufferStorage(u32 type, u32 size, bool _coherent = false) : StreamBuffer(type, size), coherent(_coherent) { CreateFences(); glBindBuffer(m_buffertype, m_buffer); @@ -219,9 +219,9 @@ public: // COHERENT_BIT is set so we don't have to use a MemoryBarrier on write // CLIENT_STORAGE_BIT is set since we access the buffer more frequently on the client side then server side glBufferStorage(m_buffertype, m_size, nullptr, - GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT); + GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | (coherent ? GL_MAP_COHERENT_BIT : 0)); m_pointer = (u8*)glMapBufferRange(m_buffertype, 0, m_size, - GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_FLUSH_EXPLICIT_BIT); + GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | (coherent ? GL_MAP_COHERENT_BIT : GL_MAP_FLUSH_EXPLICIT_BIT)); } ~BufferStorage() @@ -239,11 +239,13 @@ public: void Unmap(u32 used_size) override { - glFlushMappedBufferRange(m_buffertype, m_iterator, used_size); + if (!coherent) + glFlushMappedBufferRange(m_buffertype, m_iterator, used_size); m_iterator += used_size; } u8* m_pointer; + const bool coherent; }; /* --- AMD only --- @@ -377,10 +379,11 @@ std::unique_ptr<StreamBuffer> StreamBuffer::Create(u32 type, u32 size) return std::make_unique<PinnedMemory>(type, size); // buffer storage works well in most situations + bool coherent = DriverDetails::HasBug(DriverDetails::BUG_BROKENEXPLICITFLUSH); if (g_ogl_config.bSupportsGLBufferStorage && !(DriverDetails::HasBug(DriverDetails::BUG_BROKENBUFFERSTORAGE) && type == GL_ARRAY_BUFFER) && !(DriverDetails::HasBug(DriverDetails::BUG_INTELBROKENBUFFERSTORAGE) && type == GL_ELEMENT_ARRAY_BUFFER)) - return std::make_unique<BufferStorage>(type, size); + return std::make_unique<BufferStorage>(type, size, coherent); // don't fall back to MapAnd* for Nvidia drivers if (DriverDetails::HasBug(DriverDetails::BUG_BROKENUNSYNCMAPPING)) |
