diff options
| author | 2020-06-14 00:29:16 -0400 | |
|---|---|---|
| committer | 2020-06-14 00:29:16 -0400 | |
| commit | 92021a344cc2562496a41e2fc4e4090e49e1c6fb (patch) | |
| tree | 02ddce73a3c77c9f6ba72b7ebb36b62de4c0583b /src | |
| parent | Merge pull request #4049 from ReinUsesLisp/separate-samplers (diff) | |
| parent | gl_rasterizer: Mark vertex buffers as dirty after buffer cache invalidation (diff) | |
| download | yuzu-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.h | 16 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 11 |
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(); |