diff options
| author | 2019-01-06 02:07:20 -0300 | |
|---|---|---|
| committer | 2019-01-06 16:49:24 -0300 | |
| commit | 5933b3ea967341eb8e891b8141015c6ecd815830 (patch) | |
| tree | 3749573712dda6907dfcaa3039cc1c5fb496e59b /src | |
| parent | gl_rasterizer: Use DSA for vertex array objects (diff) | |
| download | yuzu-5933b3ea967341eb8e891b8141015c6ecd815830.tar.gz yuzu-5933b3ea967341eb8e891b8141015c6ecd815830.tar.xz yuzu-5933b3ea967341eb8e891b8141015c6ecd815830.zip | |
gl_stream_buffer: Use DSA for buffer management
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_buffer_cache.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_stream_buffer.cpp | 26 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_stream_buffer.h | 3 |
3 files changed, 14 insertions, 17 deletions
diff --git a/src/video_core/renderer_opengl/gl_buffer_cache.cpp b/src/video_core/renderer_opengl/gl_buffer_cache.cpp index 46a6c0308..bd2b30e77 100644 --- a/src/video_core/renderer_opengl/gl_buffer_cache.cpp +++ b/src/video_core/renderer_opengl/gl_buffer_cache.cpp | |||
| @@ -14,7 +14,7 @@ | |||
| 14 | namespace OpenGL { | 14 | namespace OpenGL { |
| 15 | 15 | ||
| 16 | OGLBufferCache::OGLBufferCache(RasterizerOpenGL& rasterizer, std::size_t size) | 16 | OGLBufferCache::OGLBufferCache(RasterizerOpenGL& rasterizer, std::size_t size) |
| 17 | : RasterizerCache{rasterizer}, stream_buffer(GL_ARRAY_BUFFER, size) {} | 17 | : RasterizerCache{rasterizer}, stream_buffer(size, true) {} |
| 18 | 18 | ||
| 19 | GLintptr OGLBufferCache::UploadMemory(Tegra::GPUVAddr gpu_addr, std::size_t size, | 19 | GLintptr OGLBufferCache::UploadMemory(Tegra::GPUVAddr gpu_addr, std::size_t size, |
| 20 | std::size_t alignment, bool cache) { | 20 | std::size_t alignment, bool cache) { |
diff --git a/src/video_core/renderer_opengl/gl_stream_buffer.cpp b/src/video_core/renderer_opengl/gl_stream_buffer.cpp index b97b895a4..d0b14b3f6 100644 --- a/src/video_core/renderer_opengl/gl_stream_buffer.cpp +++ b/src/video_core/renderer_opengl/gl_stream_buffer.cpp | |||
| @@ -15,13 +15,12 @@ MICROPROFILE_DEFINE(OpenGL_StreamBuffer, "OpenGL", "Stream Buffer Orphaning", | |||
| 15 | 15 | ||
| 16 | namespace OpenGL { | 16 | namespace OpenGL { |
| 17 | 17 | ||
| 18 | OGLStreamBuffer::OGLStreamBuffer(GLenum target, GLsizeiptr size, bool prefer_coherent) | 18 | OGLStreamBuffer::OGLStreamBuffer(GLsizeiptr size, bool vertex_data_usage, bool prefer_coherent) |
| 19 | : gl_target(target), buffer_size(size) { | 19 | : buffer_size(size) { |
| 20 | gl_buffer.Create(); | 20 | gl_buffer.Create(); |
| 21 | glBindBuffer(gl_target, gl_buffer.handle); | ||
| 22 | 21 | ||
| 23 | GLsizeiptr allocate_size = size; | 22 | GLsizeiptr allocate_size = size; |
| 24 | if (target == GL_ARRAY_BUFFER) { | 23 | if (vertex_data_usage) { |
| 25 | // On AMD GPU there is a strange crash in indexed drawing. The crash happens when the buffer | 24 | // On AMD GPU there is a strange crash in indexed drawing. The crash happens when the buffer |
| 26 | // read position is near the end and is an out-of-bound access to the vertex buffer. This is | 25 | // read position is near the end and is an out-of-bound access to the vertex buffer. This is |
| 27 | // probably a bug in the driver and is related to the usage of vec3<byte> attributes in the | 26 | // probably a bug in the driver and is related to the usage of vec3<byte> attributes in the |
| @@ -35,18 +34,17 @@ OGLStreamBuffer::OGLStreamBuffer(GLenum target, GLsizeiptr size, bool prefer_coh | |||
| 35 | coherent = prefer_coherent; | 34 | coherent = prefer_coherent; |
| 36 | const GLbitfield flags = | 35 | const GLbitfield flags = |
| 37 | GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | (coherent ? GL_MAP_COHERENT_BIT : 0); | 36 | GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | (coherent ? GL_MAP_COHERENT_BIT : 0); |
| 38 | glBufferStorage(gl_target, allocate_size, nullptr, flags); | 37 | glNamedBufferStorage(gl_buffer.handle, allocate_size, nullptr, flags); |
| 39 | mapped_ptr = static_cast<u8*>(glMapBufferRange( | 38 | mapped_ptr = static_cast<u8*>(glMapNamedBufferRange( |
| 40 | gl_target, 0, buffer_size, flags | (coherent ? 0 : GL_MAP_FLUSH_EXPLICIT_BIT))); | 39 | gl_buffer.handle, 0, buffer_size, flags | (coherent ? 0 : GL_MAP_FLUSH_EXPLICIT_BIT))); |
| 41 | } else { | 40 | } else { |
| 42 | glBufferData(gl_target, allocate_size, nullptr, GL_STREAM_DRAW); | 41 | glNamedBufferData(gl_buffer.handle, allocate_size, nullptr, GL_STREAM_DRAW); |
| 43 | } | 42 | } |
| 44 | } | 43 | } |
| 45 | 44 | ||
| 46 | OGLStreamBuffer::~OGLStreamBuffer() { | 45 | OGLStreamBuffer::~OGLStreamBuffer() { |
| 47 | if (persistent) { | 46 | if (persistent) { |
| 48 | glBindBuffer(gl_target, gl_buffer.handle); | 47 | glUnmapNamedBuffer(gl_buffer.handle); |
| 49 | glUnmapBuffer(gl_target); | ||
| 50 | } | 48 | } |
| 51 | gl_buffer.Release(); | 49 | gl_buffer.Release(); |
| 52 | } | 50 | } |
| @@ -74,7 +72,7 @@ std::tuple<u8*, GLintptr, bool> OGLStreamBuffer::Map(GLsizeiptr size, GLintptr a | |||
| 74 | invalidate = true; | 72 | invalidate = true; |
| 75 | 73 | ||
| 76 | if (persistent) { | 74 | if (persistent) { |
| 77 | glUnmapBuffer(gl_target); | 75 | glUnmapNamedBuffer(gl_buffer.handle); |
| 78 | } | 76 | } |
| 79 | } | 77 | } |
| 80 | 78 | ||
| @@ -84,7 +82,7 @@ std::tuple<u8*, GLintptr, bool> OGLStreamBuffer::Map(GLsizeiptr size, GLintptr a | |||
| 84 | (coherent ? GL_MAP_COHERENT_BIT : GL_MAP_FLUSH_EXPLICIT_BIT) | | 82 | (coherent ? GL_MAP_COHERENT_BIT : GL_MAP_FLUSH_EXPLICIT_BIT) | |
| 85 | (invalidate ? GL_MAP_INVALIDATE_BUFFER_BIT : GL_MAP_UNSYNCHRONIZED_BIT); | 83 | (invalidate ? GL_MAP_INVALIDATE_BUFFER_BIT : GL_MAP_UNSYNCHRONIZED_BIT); |
| 86 | mapped_ptr = static_cast<u8*>( | 84 | mapped_ptr = static_cast<u8*>( |
| 87 | glMapBufferRange(gl_target, buffer_pos, buffer_size - buffer_pos, flags)); | 85 | glMapNamedBufferRange(gl_buffer.handle, buffer_pos, buffer_size - buffer_pos, flags)); |
| 88 | mapped_offset = buffer_pos; | 86 | mapped_offset = buffer_pos; |
| 89 | } | 87 | } |
| 90 | 88 | ||
| @@ -95,11 +93,11 @@ void OGLStreamBuffer::Unmap(GLsizeiptr size) { | |||
| 95 | ASSERT(size <= mapped_size); | 93 | ASSERT(size <= mapped_size); |
| 96 | 94 | ||
| 97 | if (!coherent && size > 0) { | 95 | if (!coherent && size > 0) { |
| 98 | glFlushMappedBufferRange(gl_target, buffer_pos - mapped_offset, size); | 96 | glFlushMappedNamedBufferRange(gl_buffer.handle, buffer_pos - mapped_offset, size); |
| 99 | } | 97 | } |
| 100 | 98 | ||
| 101 | if (!persistent) { | 99 | if (!persistent) { |
| 102 | glUnmapBuffer(gl_target); | 100 | glUnmapNamedBuffer(gl_buffer.handle); |
| 103 | } | 101 | } |
| 104 | 102 | ||
| 105 | buffer_pos += size; | 103 | 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 ae7961bd7..3d18ecb4d 100644 --- a/src/video_core/renderer_opengl/gl_stream_buffer.h +++ b/src/video_core/renderer_opengl/gl_stream_buffer.h | |||
| @@ -13,7 +13,7 @@ namespace OpenGL { | |||
| 13 | 13 | ||
| 14 | class OGLStreamBuffer : private NonCopyable { | 14 | class OGLStreamBuffer : private NonCopyable { |
| 15 | public: | 15 | public: |
| 16 | explicit OGLStreamBuffer(GLenum target, GLsizeiptr size, bool prefer_coherent = false); | 16 | explicit OGLStreamBuffer(GLsizeiptr size, bool vertex_data_usage, bool prefer_coherent = false); |
| 17 | ~OGLStreamBuffer(); | 17 | ~OGLStreamBuffer(); |
| 18 | 18 | ||
| 19 | GLuint GetHandle() const; | 19 | GLuint GetHandle() const; |
| @@ -33,7 +33,6 @@ public: | |||
| 33 | 33 | ||
| 34 | private: | 34 | private: |
| 35 | OGLBuffer gl_buffer; | 35 | OGLBuffer gl_buffer; |
| 36 | GLenum gl_target; | ||
| 37 | 36 | ||
| 38 | bool coherent = false; | 37 | bool coherent = false; |
| 39 | bool persistent = false; | 38 | bool persistent = false; |