gl_stream_buffer: Use DSA for buffer management
This commit is contained in:
		| @@ -14,7 +14,7 @@ | |||||||
| namespace OpenGL { | namespace OpenGL { | ||||||
|  |  | ||||||
| OGLBufferCache::OGLBufferCache(RasterizerOpenGL& rasterizer, std::size_t size) | OGLBufferCache::OGLBufferCache(RasterizerOpenGL& rasterizer, std::size_t size) | ||||||
|     : RasterizerCache{rasterizer}, stream_buffer(GL_ARRAY_BUFFER, size) {} |     : RasterizerCache{rasterizer}, stream_buffer(size, true) {} | ||||||
|  |  | ||||||
| GLintptr OGLBufferCache::UploadMemory(Tegra::GPUVAddr gpu_addr, std::size_t size, | GLintptr OGLBufferCache::UploadMemory(Tegra::GPUVAddr gpu_addr, std::size_t size, | ||||||
|                                       std::size_t alignment, bool cache) { |                                       std::size_t alignment, bool cache) { | ||||||
|   | |||||||
| @@ -15,13 +15,12 @@ MICROPROFILE_DEFINE(OpenGL_StreamBuffer, "OpenGL", "Stream Buffer Orphaning", | |||||||
|  |  | ||||||
| namespace OpenGL { | namespace OpenGL { | ||||||
|  |  | ||||||
| OGLStreamBuffer::OGLStreamBuffer(GLenum target, GLsizeiptr size, bool prefer_coherent) | OGLStreamBuffer::OGLStreamBuffer(GLsizeiptr size, bool vertex_data_usage, bool prefer_coherent) | ||||||
|     : gl_target(target), buffer_size(size) { |     : buffer_size(size) { | ||||||
|     gl_buffer.Create(); |     gl_buffer.Create(); | ||||||
|     glBindBuffer(gl_target, gl_buffer.handle); |  | ||||||
|  |  | ||||||
|     GLsizeiptr allocate_size = size; |     GLsizeiptr allocate_size = size; | ||||||
|     if (target == GL_ARRAY_BUFFER) { |     if (vertex_data_usage) { | ||||||
|         // On AMD GPU there is a strange crash in indexed drawing. The crash happens when the buffer |         // On AMD GPU there is a strange crash in indexed drawing. The crash happens when the buffer | ||||||
|         // read position is near the end and is an out-of-bound access to the vertex buffer. This is |         // read position is near the end and is an out-of-bound access to the vertex buffer. This is | ||||||
|         // probably a bug in the driver and is related to the usage of vec3<byte> attributes in the |         // 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 | |||||||
|         coherent = prefer_coherent; |         coherent = prefer_coherent; | ||||||
|         const GLbitfield flags = |         const GLbitfield flags = | ||||||
|             GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | (coherent ? GL_MAP_COHERENT_BIT : 0); |             GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | (coherent ? GL_MAP_COHERENT_BIT : 0); | ||||||
|         glBufferStorage(gl_target, allocate_size, nullptr, flags); |         glNamedBufferStorage(gl_buffer.handle, allocate_size, nullptr, flags); | ||||||
|         mapped_ptr = static_cast<u8*>(glMapBufferRange( |         mapped_ptr = static_cast<u8*>(glMapNamedBufferRange( | ||||||
|             gl_target, 0, buffer_size, flags | (coherent ? 0 : GL_MAP_FLUSH_EXPLICIT_BIT))); |             gl_buffer.handle, 0, buffer_size, flags | (coherent ? 0 : GL_MAP_FLUSH_EXPLICIT_BIT))); | ||||||
|     } else { |     } else { | ||||||
|         glBufferData(gl_target, allocate_size, nullptr, GL_STREAM_DRAW); |         glNamedBufferData(gl_buffer.handle, allocate_size, nullptr, GL_STREAM_DRAW); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| OGLStreamBuffer::~OGLStreamBuffer() { | OGLStreamBuffer::~OGLStreamBuffer() { | ||||||
|     if (persistent) { |     if (persistent) { | ||||||
|         glBindBuffer(gl_target, gl_buffer.handle); |         glUnmapNamedBuffer(gl_buffer.handle); | ||||||
|         glUnmapBuffer(gl_target); |  | ||||||
|     } |     } | ||||||
|     gl_buffer.Release(); |     gl_buffer.Release(); | ||||||
| } | } | ||||||
| @@ -74,7 +72,7 @@ std::tuple<u8*, GLintptr, bool> OGLStreamBuffer::Map(GLsizeiptr size, GLintptr a | |||||||
|         invalidate = true; |         invalidate = true; | ||||||
|  |  | ||||||
|         if (persistent) { |         if (persistent) { | ||||||
|             glUnmapBuffer(gl_target); |             glUnmapNamedBuffer(gl_buffer.handle); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -84,7 +82,7 @@ std::tuple<u8*, GLintptr, bool> OGLStreamBuffer::Map(GLsizeiptr size, GLintptr a | |||||||
|                            (coherent ? GL_MAP_COHERENT_BIT : GL_MAP_FLUSH_EXPLICIT_BIT) | |                            (coherent ? GL_MAP_COHERENT_BIT : GL_MAP_FLUSH_EXPLICIT_BIT) | | ||||||
|                            (invalidate ? GL_MAP_INVALIDATE_BUFFER_BIT : GL_MAP_UNSYNCHRONIZED_BIT); |                            (invalidate ? GL_MAP_INVALIDATE_BUFFER_BIT : GL_MAP_UNSYNCHRONIZED_BIT); | ||||||
|         mapped_ptr = static_cast<u8*>( |         mapped_ptr = static_cast<u8*>( | ||||||
|             glMapBufferRange(gl_target, buffer_pos, buffer_size - buffer_pos, flags)); |             glMapNamedBufferRange(gl_buffer.handle, buffer_pos, buffer_size - buffer_pos, flags)); | ||||||
|         mapped_offset = buffer_pos; |         mapped_offset = buffer_pos; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -95,11 +93,11 @@ void OGLStreamBuffer::Unmap(GLsizeiptr size) { | |||||||
|     ASSERT(size <= mapped_size); |     ASSERT(size <= mapped_size); | ||||||
|  |  | ||||||
|     if (!coherent && size > 0) { |     if (!coherent && size > 0) { | ||||||
|         glFlushMappedBufferRange(gl_target, buffer_pos - mapped_offset, size); |         glFlushMappedNamedBufferRange(gl_buffer.handle, buffer_pos - mapped_offset, size); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (!persistent) { |     if (!persistent) { | ||||||
|         glUnmapBuffer(gl_target); |         glUnmapNamedBuffer(gl_buffer.handle); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     buffer_pos += size; |     buffer_pos += size; | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ namespace OpenGL { | |||||||
|  |  | ||||||
| class OGLStreamBuffer : private NonCopyable { | class OGLStreamBuffer : private NonCopyable { | ||||||
| public: | public: | ||||||
|     explicit OGLStreamBuffer(GLenum target, GLsizeiptr size, bool prefer_coherent = false); |     explicit OGLStreamBuffer(GLsizeiptr size, bool vertex_data_usage, bool prefer_coherent = false); | ||||||
|     ~OGLStreamBuffer(); |     ~OGLStreamBuffer(); | ||||||
|  |  | ||||||
|     GLuint GetHandle() const; |     GLuint GetHandle() const; | ||||||
| @@ -33,7 +33,6 @@ public: | |||||||
|  |  | ||||||
| private: | private: | ||||||
|     OGLBuffer gl_buffer; |     OGLBuffer gl_buffer; | ||||||
|     GLenum gl_target; |  | ||||||
|  |  | ||||||
|     bool coherent = false; |     bool coherent = false; | ||||||
|     bool persistent = false; |     bool persistent = false; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 ReinUsesLisp
					ReinUsesLisp