summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2019-12-31 18:16:58 -0300
committerGravatar ReinUsesLisp2020-02-28 17:56:42 -0300
commita5bfc0d045cada34248d3de493889371d22ade7c (patch)
treece208055007860e9500862d22dc341ca5b153c60 /src
parentgl_state_tracker: Implement dirty flags for clip control (diff)
downloadyuzu-a5bfc0d045cada34248d3de493889371d22ade7c.tar.gz
yuzu-a5bfc0d045cada34248d3de493889371d22ade7c.tar.xz
yuzu-a5bfc0d045cada34248d3de493889371d22ade7c.zip
gl_state_tracker: Track state of index buffers
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h2
-rw-r--r--src/video_core/renderer_opengl/gl_state_tracker.h13
-rw-r--r--src/video_core/renderer_opengl/utils.cpp7
-rw-r--r--src/video_core/renderer_opengl/utils.h6
4 files changed, 23 insertions, 5 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h
index 11206f557..b24c6661b 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer.h
@@ -223,7 +223,7 @@ private:
223 static constexpr std::size_t STREAM_BUFFER_SIZE = 128 * 1024 * 1024; 223 static constexpr std::size_t STREAM_BUFFER_SIZE = 128 * 1024 * 1024;
224 OGLBufferCache buffer_cache; 224 OGLBufferCache buffer_cache;
225 225
226 VertexArrayPushBuffer vertex_array_pushbuffer; 226 VertexArrayPushBuffer vertex_array_pushbuffer{state_tracker};
227 BindBuffersRangePushBuffer bind_ubo_pushbuffer{GL_UNIFORM_BUFFER}; 227 BindBuffersRangePushBuffer bind_ubo_pushbuffer{GL_UNIFORM_BUFFER};
228 BindBuffersRangePushBuffer bind_ssbo_pushbuffer{GL_SHADER_STORAGE_BUFFER}; 228 BindBuffersRangePushBuffer bind_ssbo_pushbuffer{GL_SHADER_STORAGE_BUFFER};
229 229
diff --git a/src/video_core/renderer_opengl/gl_state_tracker.h b/src/video_core/renderer_opengl/gl_state_tracker.h
index 5269dadff..992b915fb 100644
--- a/src/video_core/renderer_opengl/gl_state_tracker.h
+++ b/src/video_core/renderer_opengl/gl_state_tracker.h
@@ -6,7 +6,10 @@
6 6
7#include <limits> 7#include <limits>
8 8
9#include <glad/glad.h>
10
9#include "common/common_types.h" 11#include "common/common_types.h"
12#include "core/core.h"
10#include "video_core/dirty_flags.h" 13#include "video_core/dirty_flags.h"
11#include "video_core/engines/maxwell_3d.h" 14#include "video_core/engines/maxwell_3d.h"
12 15
@@ -85,6 +88,14 @@ public:
85 88
86 void Initialize(); 89 void Initialize();
87 90
91 void BindIndexBuffer(GLuint new_index_buffer) {
92 if (index_buffer == new_index_buffer) {
93 return;
94 }
95 index_buffer = new_index_buffer;
96 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, new_index_buffer);
97 }
98
88 void NotifyScreenDrawVertexArray() { 99 void NotifyScreenDrawVertexArray() {
89 auto& flags = system.GPU().Maxwell3D().dirty.flags; 100 auto& flags = system.GPU().Maxwell3D().dirty.flags;
90 flags[OpenGL::Dirty::VertexFormats] = true; 101 flags[OpenGL::Dirty::VertexFormats] = true;
@@ -175,6 +186,8 @@ public:
175 186
176private: 187private:
177 Core::System& system; 188 Core::System& system;
189
190 GLuint index_buffer = 0;
178}; 191};
179 192
180} // namespace OpenGL 193} // namespace OpenGL
diff --git a/src/video_core/renderer_opengl/utils.cpp b/src/video_core/renderer_opengl/utils.cpp
index f2aaf06db..b751086fa 100644
--- a/src/video_core/renderer_opengl/utils.cpp
+++ b/src/video_core/renderer_opengl/utils.cpp
@@ -9,6 +9,7 @@
9#include <glad/glad.h> 9#include <glad/glad.h>
10 10
11#include "common/common_types.h" 11#include "common/common_types.h"
12#include "video_core/renderer_opengl/gl_state_tracker.h"
12#include "video_core/renderer_opengl/utils.h" 13#include "video_core/renderer_opengl/utils.h"
13 14
14namespace OpenGL { 15namespace OpenGL {
@@ -20,7 +21,8 @@ struct VertexArrayPushBuffer::Entry {
20 GLsizei stride{}; 21 GLsizei stride{};
21}; 22};
22 23
23VertexArrayPushBuffer::VertexArrayPushBuffer() = default; 24VertexArrayPushBuffer::VertexArrayPushBuffer(StateTracker& state_tracker)
25 : state_tracker{state_tracker} {}
24 26
25VertexArrayPushBuffer::~VertexArrayPushBuffer() = default; 27VertexArrayPushBuffer::~VertexArrayPushBuffer() = default;
26 28
@@ -40,10 +42,9 @@ void VertexArrayPushBuffer::SetVertexBuffer(GLuint binding_index, const GLuint*
40 42
41void VertexArrayPushBuffer::Bind() { 43void VertexArrayPushBuffer::Bind() {
42 if (index_buffer) { 44 if (index_buffer) {
43 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, *index_buffer); 45 state_tracker.BindIndexBuffer(*index_buffer);
44 } 46 }
45 47
46 // TODO(Rodrigo): Find a way to ARB_multi_bind this
47 for (const auto& entry : vertex_buffers) { 48 for (const auto& entry : vertex_buffers) {
48 glBindVertexBuffer(entry.binding_index, *entry.buffer, entry.offset, entry.stride); 49 glBindVertexBuffer(entry.binding_index, *entry.buffer, entry.offset, entry.stride);
49 } 50 }
diff --git a/src/video_core/renderer_opengl/utils.h b/src/video_core/renderer_opengl/utils.h
index e8612a9ec..47ee3177b 100644
--- a/src/video_core/renderer_opengl/utils.h
+++ b/src/video_core/renderer_opengl/utils.h
@@ -11,9 +11,11 @@
11 11
12namespace OpenGL { 12namespace OpenGL {
13 13
14class StateTracker;
15
14class VertexArrayPushBuffer final { 16class VertexArrayPushBuffer final {
15public: 17public:
16 explicit VertexArrayPushBuffer(); 18 explicit VertexArrayPushBuffer(StateTracker& state_tracker);
17 ~VertexArrayPushBuffer(); 19 ~VertexArrayPushBuffer();
18 20
19 void Setup(); 21 void Setup();
@@ -28,6 +30,8 @@ public:
28private: 30private:
29 struct Entry; 31 struct Entry;
30 32
33 StateTracker& state_tracker;
34
31 const GLuint* index_buffer{}; 35 const GLuint* index_buffer{};
32 std::vector<Entry> vertex_buffers; 36 std::vector<Entry> vertex_buffers;
33}; 37};