summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2020-06-18 21:53:47 -0300
committerGravatar ReinUsesLisp2020-06-24 02:36:14 -0300
commit39c97f1b652898dbd0e5e6d028de2ba4b9fa94a0 (patch)
treef0083d6353ffbac6621ba8a67fd751300429192e /src
parentgl_rasterizer: Use NV_vertex_buffer_unified_memory for vertex buffer robustness (diff)
downloadyuzu-39c97f1b652898dbd0e5e6d028de2ba4b9fa94a0.tar.gz
yuzu-39c97f1b652898dbd0e5e6d028de2ba4b9fa94a0.tar.xz
yuzu-39c97f1b652898dbd0e5e6d028de2ba4b9fa94a0.zip
gl_stream_buffer: Use InvalidateBufferData instead unmap and map
Making the stream buffer resident increases GPU usage significantly on some games. This seems to be addressed invalidating the stream buffer with InvalidateBufferData instead of using a Unmap + Map (with invalidation flags).
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_stream_buffer.cpp19
-rw-r--r--src/video_core/renderer_opengl/gl_stream_buffer.h1
2 files changed, 5 insertions, 15 deletions
diff --git a/src/video_core/renderer_opengl/gl_stream_buffer.cpp b/src/video_core/renderer_opengl/gl_stream_buffer.cpp
index 164df4feb..3655ff629 100644
--- a/src/video_core/renderer_opengl/gl_stream_buffer.cpp
+++ b/src/video_core/renderer_opengl/gl_stream_buffer.cpp
@@ -57,30 +57,21 @@ std::tuple<u8*, GLintptr, bool> OGLStreamBuffer::Map(GLsizeiptr size, GLintptr a
57 57
58 bool invalidate = false; 58 bool invalidate = false;
59 if (buffer_pos + size > buffer_size) { 59 if (buffer_pos + size > buffer_size) {
60 MICROPROFILE_SCOPE(OpenGL_StreamBuffer);
61 glInvalidateBufferData(gl_buffer.handle);
62
60 buffer_pos = 0; 63 buffer_pos = 0;
61 invalidate = true; 64 invalidate = true;
62
63 glUnmapNamedBuffer(gl_buffer.handle);
64 }
65
66 if (invalidate) {
67 static const GLbitfield flags = GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT |
68 GL_MAP_INVALIDATE_BUFFER_BIT | GL_MAP_FLUSH_EXPLICIT_BIT;
69
70 MICROPROFILE_SCOPE(OpenGL_StreamBuffer);
71 mapped_ptr = static_cast<u8*>(
72 glMapNamedBufferRange(gl_buffer.handle, buffer_pos, buffer_size - buffer_pos, flags));
73 mapped_offset = buffer_pos;
74 } 65 }
75 66
76 return std::make_tuple(mapped_ptr + buffer_pos - mapped_offset, buffer_pos, invalidate); 67 return std::make_tuple(mapped_ptr + buffer_pos, buffer_pos, invalidate);
77} 68}
78 69
79void OGLStreamBuffer::Unmap(GLsizeiptr size) { 70void OGLStreamBuffer::Unmap(GLsizeiptr size) {
80 ASSERT(size <= mapped_size); 71 ASSERT(size <= mapped_size);
81 72
82 if (size > 0) { 73 if (size > 0) {
83 glFlushMappedNamedBufferRange(gl_buffer.handle, buffer_pos - mapped_offset, size); 74 glFlushMappedNamedBufferRange(gl_buffer.handle, buffer_pos, size);
84 } 75 }
85 76
86 buffer_pos += size; 77 buffer_pos += size;
diff --git a/src/video_core/renderer_opengl/gl_stream_buffer.h b/src/video_core/renderer_opengl/gl_stream_buffer.h
index e67a82980..307a67113 100644
--- a/src/video_core/renderer_opengl/gl_stream_buffer.h
+++ b/src/video_core/renderer_opengl/gl_stream_buffer.h
@@ -48,7 +48,6 @@ private:
48 GLuint64EXT gpu_address = 0; 48 GLuint64EXT gpu_address = 0;
49 GLintptr buffer_pos = 0; 49 GLintptr buffer_pos = 0;
50 GLsizeiptr buffer_size = 0; 50 GLsizeiptr buffer_size = 0;
51 GLintptr mapped_offset = 0;
52 GLsizeiptr mapped_size = 0; 51 GLsizeiptr mapped_size = 0;
53 u8* mapped_ptr = nullptr; 52 u8* mapped_ptr = nullptr;
54}; 53};