gl_state_tracker: Track state of index buffers
This commit is contained in:
		
							parent
							
								
									a42a6e1a2c
								
							
						
					
					
						commit
						a5bfc0d045
					
				@ -223,7 +223,7 @@ private:
 | 
				
			|||||||
    static constexpr std::size_t STREAM_BUFFER_SIZE = 128 * 1024 * 1024;
 | 
					    static constexpr std::size_t STREAM_BUFFER_SIZE = 128 * 1024 * 1024;
 | 
				
			||||||
    OGLBufferCache buffer_cache;
 | 
					    OGLBufferCache buffer_cache;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    VertexArrayPushBuffer vertex_array_pushbuffer;
 | 
					    VertexArrayPushBuffer vertex_array_pushbuffer{state_tracker};
 | 
				
			||||||
    BindBuffersRangePushBuffer bind_ubo_pushbuffer{GL_UNIFORM_BUFFER};
 | 
					    BindBuffersRangePushBuffer bind_ubo_pushbuffer{GL_UNIFORM_BUFFER};
 | 
				
			||||||
    BindBuffersRangePushBuffer bind_ssbo_pushbuffer{GL_SHADER_STORAGE_BUFFER};
 | 
					    BindBuffersRangePushBuffer bind_ssbo_pushbuffer{GL_SHADER_STORAGE_BUFFER};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -6,7 +6,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <limits>
 | 
					#include <limits>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <glad/glad.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "common/common_types.h"
 | 
					#include "common/common_types.h"
 | 
				
			||||||
 | 
					#include "core/core.h"
 | 
				
			||||||
#include "video_core/dirty_flags.h"
 | 
					#include "video_core/dirty_flags.h"
 | 
				
			||||||
#include "video_core/engines/maxwell_3d.h"
 | 
					#include "video_core/engines/maxwell_3d.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -85,6 +88,14 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    void Initialize();
 | 
					    void Initialize();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void BindIndexBuffer(GLuint new_index_buffer) {
 | 
				
			||||||
 | 
					        if (index_buffer == new_index_buffer) {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        index_buffer = new_index_buffer;
 | 
				
			||||||
 | 
					        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, new_index_buffer);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void NotifyScreenDrawVertexArray() {
 | 
					    void NotifyScreenDrawVertexArray() {
 | 
				
			||||||
        auto& flags = system.GPU().Maxwell3D().dirty.flags;
 | 
					        auto& flags = system.GPU().Maxwell3D().dirty.flags;
 | 
				
			||||||
        flags[OpenGL::Dirty::VertexFormats] = true;
 | 
					        flags[OpenGL::Dirty::VertexFormats] = true;
 | 
				
			||||||
@ -175,6 +186,8 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
    Core::System& system;
 | 
					    Core::System& system;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    GLuint index_buffer = 0;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace OpenGL
 | 
					} // namespace OpenGL
 | 
				
			||||||
 | 
				
			|||||||
@ -9,6 +9,7 @@
 | 
				
			|||||||
#include <glad/glad.h>
 | 
					#include <glad/glad.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "common/common_types.h"
 | 
					#include "common/common_types.h"
 | 
				
			||||||
 | 
					#include "video_core/renderer_opengl/gl_state_tracker.h"
 | 
				
			||||||
#include "video_core/renderer_opengl/utils.h"
 | 
					#include "video_core/renderer_opengl/utils.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenGL {
 | 
					namespace OpenGL {
 | 
				
			||||||
@ -20,7 +21,8 @@ struct VertexArrayPushBuffer::Entry {
 | 
				
			|||||||
    GLsizei stride{};
 | 
					    GLsizei stride{};
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VertexArrayPushBuffer::VertexArrayPushBuffer() = default;
 | 
					VertexArrayPushBuffer::VertexArrayPushBuffer(StateTracker& state_tracker)
 | 
				
			||||||
 | 
					    : state_tracker{state_tracker} {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VertexArrayPushBuffer::~VertexArrayPushBuffer() = default;
 | 
					VertexArrayPushBuffer::~VertexArrayPushBuffer() = default;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -40,10 +42,9 @@ void VertexArrayPushBuffer::SetVertexBuffer(GLuint binding_index, const GLuint*
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void VertexArrayPushBuffer::Bind() {
 | 
					void VertexArrayPushBuffer::Bind() {
 | 
				
			||||||
    if (index_buffer) {
 | 
					    if (index_buffer) {
 | 
				
			||||||
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, *index_buffer);
 | 
					        state_tracker.BindIndexBuffer(*index_buffer);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // TODO(Rodrigo): Find a way to ARB_multi_bind this
 | 
					 | 
				
			||||||
    for (const auto& entry : vertex_buffers) {
 | 
					    for (const auto& entry : vertex_buffers) {
 | 
				
			||||||
        glBindVertexBuffer(entry.binding_index, *entry.buffer, entry.offset, entry.stride);
 | 
					        glBindVertexBuffer(entry.binding_index, *entry.buffer, entry.offset, entry.stride);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -11,9 +11,11 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace OpenGL {
 | 
					namespace OpenGL {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class StateTracker;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class VertexArrayPushBuffer final {
 | 
					class VertexArrayPushBuffer final {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    explicit VertexArrayPushBuffer();
 | 
					    explicit VertexArrayPushBuffer(StateTracker& state_tracker);
 | 
				
			||||||
    ~VertexArrayPushBuffer();
 | 
					    ~VertexArrayPushBuffer();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void Setup();
 | 
					    void Setup();
 | 
				
			||||||
@ -28,6 +30,8 @@ public:
 | 
				
			|||||||
private:
 | 
					private:
 | 
				
			||||||
    struct Entry;
 | 
					    struct Entry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    StateTracker& state_tracker;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const GLuint* index_buffer{};
 | 
					    const GLuint* index_buffer{};
 | 
				
			||||||
    std::vector<Entry> vertex_buffers;
 | 
					    std::vector<Entry> vertex_buffers;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user