summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2020-06-14 00:29:16 -0400
committerGravatar GitHub2020-06-14 00:29:16 -0400
commit92021a344cc2562496a41e2fc4e4090e49e1c6fb (patch)
tree02ddce73a3c77c9f6ba72b7ebb36b62de4c0583b /src
parentMerge pull request #4049 from ReinUsesLisp/separate-samplers (diff)
parentgl_rasterizer: Mark vertex buffers as dirty after buffer cache invalidation (diff)
downloadyuzu-92021a344cc2562496a41e2fc4e4090e49e1c6fb.tar.gz
yuzu-92021a344cc2562496a41e2fc4e4090e49e1c6fb.tar.xz
yuzu-92021a344cc2562496a41e2fc4e4090e49e1c6fb.zip
Merge pull request #4064 from ReinUsesLisp/invalidate-buffers
gl_rasterizer: Mark vertex buffers as dirty after buffer cache invalidation
Diffstat (limited to 'src')
-rw-r--r--src/video_core/buffer_cache/buffer_cache.h16
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp11
2 files changed, 19 insertions, 8 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h
index b88fce2cd..77ae34339 100644
--- a/src/video_core/buffer_cache/buffer_cache.h
+++ b/src/video_core/buffer_cache/buffer_cache.h
@@ -110,19 +110,23 @@ public:
110 }); 110 });
111 } 111 }
112 112
113 void Map(std::size_t max_size) { 113 /// Prepares the buffer cache for data uploading
114 /// @param max_size Maximum number of bytes that will be uploaded
115 /// @return True when a stream buffer invalidation was required, false otherwise
116 bool Map(std::size_t max_size) {
114 std::lock_guard lock{mutex}; 117 std::lock_guard lock{mutex};
115 118
119 bool invalidated;
116 std::tie(buffer_ptr, buffer_offset_base, invalidated) = stream_buffer->Map(max_size, 4); 120 std::tie(buffer_ptr, buffer_offset_base, invalidated) = stream_buffer->Map(max_size, 4);
117 buffer_offset = buffer_offset_base; 121 buffer_offset = buffer_offset_base;
122
123 return invalidated;
118 } 124 }
119 125
120 /// Finishes the upload stream, returns true on bindings invalidation. 126 /// Finishes the upload stream
121 bool Unmap() { 127 void Unmap() {
122 std::lock_guard lock{mutex}; 128 std::lock_guard lock{mutex};
123
124 stream_buffer->Unmap(buffer_offset - buffer_offset_base); 129 stream_buffer->Unmap(buffer_offset - buffer_offset_base);
125 return std::exchange(invalidated, false);
126 } 130 }
127 131
128 void TickFrame() { 132 void TickFrame() {
@@ -576,8 +580,6 @@ private:
576 std::unique_ptr<StreamBuffer> stream_buffer; 580 std::unique_ptr<StreamBuffer> stream_buffer;
577 BufferType stream_buffer_handle{}; 581 BufferType stream_buffer_handle{};
578 582
579 bool invalidated = false;
580
581 u8* buffer_ptr = nullptr; 583 u8* buffer_ptr = nullptr;
582 u64 buffer_offset = 0; 584 u64 buffer_offset = 0;
583 u64 buffer_offset_base = 0; 585 u64 buffer_offset_base = 0;
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index 121af9718..2d6c11320 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -617,7 +617,16 @@ void RasterizerOpenGL::Draw(bool is_indexed, bool is_instanced) {
617 (Maxwell::MaxConstBufferSize + device.GetUniformBufferAlignment()); 617 (Maxwell::MaxConstBufferSize + device.GetUniformBufferAlignment());
618 618
619 // Prepare the vertex array. 619 // Prepare the vertex array.
620 buffer_cache.Map(buffer_size); 620 const bool invalidated = buffer_cache.Map(buffer_size);
621
622 if (invalidated) {
623 // When the stream buffer has been invalidated, we have to consider vertex buffers as dirty
624 auto& dirty = gpu.dirty.flags;
625 dirty[Dirty::VertexBuffers] = true;
626 for (int index = Dirty::VertexBuffer0; index <= Dirty::VertexBuffer31; ++index) {
627 dirty[index] = true;
628 }
629 }
621 630
622 // Prepare vertex array format. 631 // Prepare vertex array format.
623 SetupVertexFormat(); 632 SetupVertexFormat();