diff options
| author | 2020-05-11 16:18:53 -0300 | |
|---|---|---|
| committer | 2020-06-24 02:35:33 -0300 | |
| commit | da79ec9565f670bcf1f09fdf7d9ae0241d97a241 (patch) | |
| tree | 5d1134220dfc714bebf9b70c691d7176afb2152a /src | |
| parent | Merge pull request #4129 from Morph1984/texture-shadow-lod-workaround (diff) | |
| download | yuzu-da79ec9565f670bcf1f09fdf7d9ae0241d97a241.tar.gz yuzu-da79ec9565f670bcf1f09fdf7d9ae0241d97a241.tar.xz yuzu-da79ec9565f670bcf1f09fdf7d9ae0241d97a241.zip | |
gl_stream_buffer: Always use persistent memory maps
yuzu no longer supports platforms without persistent maps.
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_stream_buffer.cpp | 40 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_stream_buffer.h | 4 |
2 files changed, 14 insertions, 30 deletions
diff --git a/src/video_core/renderer_opengl/gl_stream_buffer.cpp b/src/video_core/renderer_opengl/gl_stream_buffer.cpp index 932a2f69e..9cf0f6b46 100644 --- a/src/video_core/renderer_opengl/gl_stream_buffer.cpp +++ b/src/video_core/renderer_opengl/gl_stream_buffer.cpp | |||
| @@ -14,8 +14,7 @@ MICROPROFILE_DEFINE(OpenGL_StreamBuffer, "OpenGL", "Stream Buffer Orphaning", | |||
| 14 | 14 | ||
| 15 | namespace OpenGL { | 15 | namespace OpenGL { |
| 16 | 16 | ||
| 17 | OGLStreamBuffer::OGLStreamBuffer(GLsizeiptr size, bool vertex_data_usage, bool prefer_coherent, | 17 | OGLStreamBuffer::OGLStreamBuffer(GLsizeiptr size, bool vertex_data_usage, bool prefer_coherent) |
| 18 | bool use_persistent) | ||
| 19 | : buffer_size(size) { | 18 | : buffer_size(size) { |
| 20 | gl_buffer.Create(); | 19 | gl_buffer.Create(); |
| 21 | 20 | ||
| @@ -29,23 +28,16 @@ OGLStreamBuffer::OGLStreamBuffer(GLsizeiptr size, bool vertex_data_usage, bool p | |||
| 29 | allocate_size *= 2; | 28 | allocate_size *= 2; |
| 30 | } | 29 | } |
| 31 | 30 | ||
| 32 | if (use_persistent) { | 31 | coherent = prefer_coherent; |
| 33 | persistent = true; | 32 | const GLbitfield flags = |
| 34 | coherent = prefer_coherent; | 33 | GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | (coherent ? GL_MAP_COHERENT_BIT : 0); |
| 35 | const GLbitfield flags = | 34 | glNamedBufferStorage(gl_buffer.handle, allocate_size, nullptr, flags); |
| 36 | GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | (coherent ? GL_MAP_COHERENT_BIT : 0); | 35 | mapped_ptr = static_cast<u8*>(glMapNamedBufferRange( |
| 37 | glNamedBufferStorage(gl_buffer.handle, allocate_size, nullptr, flags); | 36 | gl_buffer.handle, 0, buffer_size, flags | (coherent ? 0 : GL_MAP_FLUSH_EXPLICIT_BIT))); |
| 38 | mapped_ptr = static_cast<u8*>(glMapNamedBufferRange( | ||
| 39 | gl_buffer.handle, 0, buffer_size, flags | (coherent ? 0 : GL_MAP_FLUSH_EXPLICIT_BIT))); | ||
| 40 | } else { | ||
| 41 | glNamedBufferData(gl_buffer.handle, allocate_size, nullptr, GL_STREAM_DRAW); | ||
| 42 | } | ||
| 43 | } | 37 | } |
| 44 | 38 | ||
| 45 | OGLStreamBuffer::~OGLStreamBuffer() { | 39 | OGLStreamBuffer::~OGLStreamBuffer() { |
| 46 | if (persistent) { | 40 | glUnmapNamedBuffer(gl_buffer.handle); |
| 47 | glUnmapNamedBuffer(gl_buffer.handle); | ||
| 48 | } | ||
| 49 | gl_buffer.Release(); | 41 | gl_buffer.Release(); |
| 50 | } | 42 | } |
| 51 | 43 | ||
| @@ -63,16 +55,14 @@ std::tuple<u8*, GLintptr, bool> OGLStreamBuffer::Map(GLsizeiptr size, GLintptr a | |||
| 63 | buffer_pos = 0; | 55 | buffer_pos = 0; |
| 64 | invalidate = true; | 56 | invalidate = true; |
| 65 | 57 | ||
| 66 | if (persistent) { | 58 | glUnmapNamedBuffer(gl_buffer.handle); |
| 67 | glUnmapNamedBuffer(gl_buffer.handle); | ||
| 68 | } | ||
| 69 | } | 59 | } |
| 70 | 60 | ||
| 71 | if (invalidate || !persistent) { | 61 | if (invalidate) { |
| 72 | MICROPROFILE_SCOPE(OpenGL_StreamBuffer); | 62 | MICROPROFILE_SCOPE(OpenGL_StreamBuffer); |
| 73 | GLbitfield flags = GL_MAP_WRITE_BIT | (persistent ? GL_MAP_PERSISTENT_BIT : 0) | | 63 | const GLbitfield flags = GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | |
| 74 | (coherent ? GL_MAP_COHERENT_BIT : GL_MAP_FLUSH_EXPLICIT_BIT) | | 64 | GL_MAP_INVALIDATE_BUFFER_BIT | |
| 75 | (invalidate ? GL_MAP_INVALIDATE_BUFFER_BIT : GL_MAP_UNSYNCHRONIZED_BIT); | 65 | (coherent ? GL_MAP_COHERENT_BIT : GL_MAP_FLUSH_EXPLICIT_BIT); |
| 76 | mapped_ptr = static_cast<u8*>( | 66 | mapped_ptr = static_cast<u8*>( |
| 77 | glMapNamedBufferRange(gl_buffer.handle, buffer_pos, buffer_size - buffer_pos, flags)); | 67 | glMapNamedBufferRange(gl_buffer.handle, buffer_pos, buffer_size - buffer_pos, flags)); |
| 78 | mapped_offset = buffer_pos; | 68 | mapped_offset = buffer_pos; |
| @@ -88,10 +78,6 @@ void OGLStreamBuffer::Unmap(GLsizeiptr size) { | |||
| 88 | glFlushMappedNamedBufferRange(gl_buffer.handle, buffer_pos - mapped_offset, size); | 78 | glFlushMappedNamedBufferRange(gl_buffer.handle, buffer_pos - mapped_offset, size); |
| 89 | } | 79 | } |
| 90 | 80 | ||
| 91 | if (!persistent) { | ||
| 92 | glUnmapNamedBuffer(gl_buffer.handle); | ||
| 93 | } | ||
| 94 | |||
| 95 | buffer_pos += size; | 81 | buffer_pos += size; |
| 96 | } | 82 | } |
| 97 | 83 | ||
diff --git a/src/video_core/renderer_opengl/gl_stream_buffer.h b/src/video_core/renderer_opengl/gl_stream_buffer.h index 866da3594..65c3da93f 100644 --- a/src/video_core/renderer_opengl/gl_stream_buffer.h +++ b/src/video_core/renderer_opengl/gl_stream_buffer.h | |||
| @@ -13,8 +13,7 @@ namespace OpenGL { | |||
| 13 | 13 | ||
| 14 | class OGLStreamBuffer : private NonCopyable { | 14 | class OGLStreamBuffer : private NonCopyable { |
| 15 | public: | 15 | public: |
| 16 | explicit OGLStreamBuffer(GLsizeiptr size, bool vertex_data_usage, bool prefer_coherent = false, | 16 | explicit OGLStreamBuffer(GLsizeiptr size, bool vertex_data_usage, bool prefer_coherent = false); |
| 17 | bool use_persistent = true); | ||
| 18 | ~OGLStreamBuffer(); | 17 | ~OGLStreamBuffer(); |
| 19 | 18 | ||
| 20 | /* | 19 | /* |
| @@ -41,7 +40,6 @@ private: | |||
| 41 | OGLBuffer gl_buffer; | 40 | OGLBuffer gl_buffer; |
| 42 | 41 | ||
| 43 | bool coherent = false; | 42 | bool coherent = false; |
| 44 | bool persistent = false; | ||
| 45 | 43 | ||
| 46 | GLintptr buffer_pos = 0; | 44 | GLintptr buffer_pos = 0; |
| 47 | GLsizeiptr buffer_size = 0; | 45 | GLsizeiptr buffer_size = 0; |