gl_stream_buffer: Use DSA for buffer management
This commit is contained in:
		
							parent
							
								
									35c095898b
								
							
						
					
					
						commit
						5933b3ea96
					
				@ -14,7 +14,7 @@
 | 
			
		||||
namespace OpenGL {
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
                                      std::size_t alignment, bool cache) {
 | 
			
		||||
 | 
			
		||||
@ -15,13 +15,12 @@ MICROPROFILE_DEFINE(OpenGL_StreamBuffer, "OpenGL", "Stream Buffer Orphaning",
 | 
			
		||||
 | 
			
		||||
namespace OpenGL {
 | 
			
		||||
 | 
			
		||||
OGLStreamBuffer::OGLStreamBuffer(GLenum target, GLsizeiptr size, bool prefer_coherent)
 | 
			
		||||
    : gl_target(target), buffer_size(size) {
 | 
			
		||||
OGLStreamBuffer::OGLStreamBuffer(GLsizeiptr size, bool vertex_data_usage, bool prefer_coherent)
 | 
			
		||||
    : buffer_size(size) {
 | 
			
		||||
    gl_buffer.Create();
 | 
			
		||||
    glBindBuffer(gl_target, gl_buffer.handle);
 | 
			
		||||
 | 
			
		||||
    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
 | 
			
		||||
        // 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
 | 
			
		||||
@ -35,18 +34,17 @@ OGLStreamBuffer::OGLStreamBuffer(GLenum target, GLsizeiptr size, bool prefer_coh
 | 
			
		||||
        coherent = prefer_coherent;
 | 
			
		||||
        const GLbitfield flags =
 | 
			
		||||
            GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | (coherent ? GL_MAP_COHERENT_BIT : 0);
 | 
			
		||||
        glBufferStorage(gl_target, allocate_size, nullptr, flags);
 | 
			
		||||
        mapped_ptr = static_cast<u8*>(glMapBufferRange(
 | 
			
		||||
            gl_target, 0, buffer_size, flags | (coherent ? 0 : GL_MAP_FLUSH_EXPLICIT_BIT)));
 | 
			
		||||
        glNamedBufferStorage(gl_buffer.handle, allocate_size, nullptr, flags);
 | 
			
		||||
        mapped_ptr = static_cast<u8*>(glMapNamedBufferRange(
 | 
			
		||||
            gl_buffer.handle, 0, buffer_size, flags | (coherent ? 0 : GL_MAP_FLUSH_EXPLICIT_BIT)));
 | 
			
		||||
    } else {
 | 
			
		||||
        glBufferData(gl_target, allocate_size, nullptr, GL_STREAM_DRAW);
 | 
			
		||||
        glNamedBufferData(gl_buffer.handle, allocate_size, nullptr, GL_STREAM_DRAW);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
OGLStreamBuffer::~OGLStreamBuffer() {
 | 
			
		||||
    if (persistent) {
 | 
			
		||||
        glBindBuffer(gl_target, gl_buffer.handle);
 | 
			
		||||
        glUnmapBuffer(gl_target);
 | 
			
		||||
        glUnmapNamedBuffer(gl_buffer.handle);
 | 
			
		||||
    }
 | 
			
		||||
    gl_buffer.Release();
 | 
			
		||||
}
 | 
			
		||||
@ -74,7 +72,7 @@ std::tuple<u8*, GLintptr, bool> OGLStreamBuffer::Map(GLsizeiptr size, GLintptr a
 | 
			
		||||
        invalidate = true;
 | 
			
		||||
 | 
			
		||||
        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) |
 | 
			
		||||
                           (invalidate ? GL_MAP_INVALIDATE_BUFFER_BIT : GL_MAP_UNSYNCHRONIZED_BIT);
 | 
			
		||||
        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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -95,11 +93,11 @@ void OGLStreamBuffer::Unmap(GLsizeiptr size) {
 | 
			
		||||
    ASSERT(size <= mapped_size);
 | 
			
		||||
 | 
			
		||||
    if (!coherent && size > 0) {
 | 
			
		||||
        glFlushMappedBufferRange(gl_target, buffer_pos - mapped_offset, size);
 | 
			
		||||
        glFlushMappedNamedBufferRange(gl_buffer.handle, buffer_pos - mapped_offset, size);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!persistent) {
 | 
			
		||||
        glUnmapBuffer(gl_target);
 | 
			
		||||
        glUnmapNamedBuffer(gl_buffer.handle);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    buffer_pos += size;
 | 
			
		||||
 | 
			
		||||
@ -13,7 +13,7 @@ namespace OpenGL {
 | 
			
		||||
 | 
			
		||||
class OGLStreamBuffer : private NonCopyable {
 | 
			
		||||
public:
 | 
			
		||||
    explicit OGLStreamBuffer(GLenum target, GLsizeiptr size, bool prefer_coherent = false);
 | 
			
		||||
    explicit OGLStreamBuffer(GLsizeiptr size, bool vertex_data_usage, bool prefer_coherent = false);
 | 
			
		||||
    ~OGLStreamBuffer();
 | 
			
		||||
 | 
			
		||||
    GLuint GetHandle() const;
 | 
			
		||||
@ -33,7 +33,6 @@ public:
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    OGLBuffer gl_buffer;
 | 
			
		||||
    GLenum gl_target;
 | 
			
		||||
 | 
			
		||||
    bool coherent = false;
 | 
			
		||||
    bool persistent = false;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user