summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2020-05-11 16:18:53 -0300
committerGravatar ReinUsesLisp2020-06-24 02:35:33 -0300
commitda79ec9565f670bcf1f09fdf7d9ae0241d97a241 (patch)
tree5d1134220dfc714bebf9b70c691d7176afb2152a /src
parentMerge pull request #4129 from Morph1984/texture-shadow-lod-workaround (diff)
downloadyuzu-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.cpp40
-rw-r--r--src/video_core/renderer_opengl/gl_stream_buffer.h4
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
15namespace OpenGL { 15namespace OpenGL {
16 16
17OGLStreamBuffer::OGLStreamBuffer(GLsizeiptr size, bool vertex_data_usage, bool prefer_coherent, 17OGLStreamBuffer::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
45OGLStreamBuffer::~OGLStreamBuffer() { 39OGLStreamBuffer::~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
14class OGLStreamBuffer : private NonCopyable { 14class OGLStreamBuffer : private NonCopyable {
15public: 15public:
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;