diff options
| author | 2020-04-28 02:14:11 -0300 | |
|---|---|---|
| committer | 2020-04-28 02:18:12 -0300 | |
| commit | fe931ac9761a813c8e7d195cf99bf68ff324839c (patch) | |
| tree | 7a1b2a9c2a85ee0e93a19953f03b50530d085c5f /src/video_core/renderer_opengl | |
| parent | Merge pull request #3766 from ReinUsesLisp/renderpass-cache-key (diff) | |
| download | yuzu-fe931ac9761a813c8e7d195cf99bf68ff324839c.tar.gz yuzu-fe931ac9761a813c8e7d195cf99bf68ff324839c.tar.xz yuzu-fe931ac9761a813c8e7d195cf99bf68ff324839c.zip | |
{maxwell_3d,buffer_cache}: Implement memory barriers using 3D registers
Drop MemoryBarrier from the buffer cache and use Maxwell3D's register
WaitForIdle.
To implement this on OpenGL we just call glMemoryBarrier with the
necessary bits.
Vulkan lacks this synchronization primitive, so we set an event and
immediately wait for it. This is not a pretty solution, but it's what
Vulkan can do without submitting the current command buffer to the queue
(which ends up being more expensive on the CPU).
Diffstat (limited to 'src/video_core/renderer_opengl')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_buffer_cache.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_buffer_cache.h | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 11 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.h | 1 |
4 files changed, 12 insertions, 6 deletions
diff --git a/src/video_core/renderer_opengl/gl_buffer_cache.cpp b/src/video_core/renderer_opengl/gl_buffer_cache.cpp index 4efce0de7..d2cab50bd 100644 --- a/src/video_core/renderer_opengl/gl_buffer_cache.cpp +++ b/src/video_core/renderer_opengl/gl_buffer_cache.cpp | |||
| @@ -51,10 +51,6 @@ Buffer OGLBufferCache::CreateBlock(VAddr cpu_addr, std::size_t size) { | |||
| 51 | return std::make_shared<CachedBufferBlock>(cpu_addr, size); | 51 | return std::make_shared<CachedBufferBlock>(cpu_addr, size); |
| 52 | } | 52 | } |
| 53 | 53 | ||
| 54 | void OGLBufferCache::WriteBarrier() { | ||
| 55 | glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT); | ||
| 56 | } | ||
| 57 | |||
| 58 | GLuint OGLBufferCache::ToHandle(const Buffer& buffer) { | 54 | GLuint OGLBufferCache::ToHandle(const Buffer& buffer) { |
| 59 | return buffer->GetHandle(); | 55 | return buffer->GetHandle(); |
| 60 | } | 56 | } |
diff --git a/src/video_core/renderer_opengl/gl_buffer_cache.h b/src/video_core/renderer_opengl/gl_buffer_cache.h index a74817857..a9e86cfc7 100644 --- a/src/video_core/renderer_opengl/gl_buffer_cache.h +++ b/src/video_core/renderer_opengl/gl_buffer_cache.h | |||
| @@ -59,8 +59,6 @@ protected: | |||
| 59 | 59 | ||
| 60 | GLuint ToHandle(const Buffer& buffer) override; | 60 | GLuint ToHandle(const Buffer& buffer) override; |
| 61 | 61 | ||
| 62 | void WriteBarrier() override; | ||
| 63 | |||
| 64 | void UploadBlockData(const Buffer& buffer, std::size_t offset, std::size_t size, | 62 | void UploadBlockData(const Buffer& buffer, std::size_t offset, std::size_t size, |
| 65 | const u8* data) override; | 63 | const u8* data) override; |
| 66 | 64 | ||
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 6fe155bcc..0d07d2422 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -725,6 +725,17 @@ void RasterizerOpenGL::FlushAndInvalidateRegion(VAddr addr, u64 size) { | |||
| 725 | InvalidateRegion(addr, size); | 725 | InvalidateRegion(addr, size); |
| 726 | } | 726 | } |
| 727 | 727 | ||
| 728 | void RasterizerOpenGL::WaitForIdle() { | ||
| 729 | // Place a barrier on everything that is not framebuffer related. | ||
| 730 | // This is related to another flag that is not currently implemented. | ||
| 731 | glMemoryBarrier(GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT | GL_ELEMENT_ARRAY_BARRIER_BIT | | ||
| 732 | GL_UNIFORM_BARRIER_BIT | GL_TEXTURE_FETCH_BARRIER_BIT | | ||
| 733 | GL_SHADER_IMAGE_ACCESS_BARRIER_BIT | GL_COMMAND_BARRIER_BIT | | ||
| 734 | GL_PIXEL_BUFFER_BARRIER_BIT | GL_TEXTURE_UPDATE_BARRIER_BIT | | ||
| 735 | GL_BUFFER_UPDATE_BARRIER_BIT | GL_TRANSFORM_FEEDBACK_BARRIER_BIT | | ||
| 736 | GL_SHADER_STORAGE_BARRIER_BIT | GL_QUERY_BUFFER_BARRIER_BIT); | ||
| 737 | } | ||
| 738 | |||
| 728 | void RasterizerOpenGL::FlushCommands() { | 739 | void RasterizerOpenGL::FlushCommands() { |
| 729 | // Only flush when we have commands queued to OpenGL. | 740 | // Only flush when we have commands queued to OpenGL. |
| 730 | if (num_queued_commands == 0) { | 741 | if (num_queued_commands == 0) { |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h index ebd2173eb..a95bc7be2 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.h +++ b/src/video_core/renderer_opengl/gl_rasterizer.h | |||
| @@ -75,6 +75,7 @@ public: | |||
| 75 | void SignalSyncPoint(u32 value) override; | 75 | void SignalSyncPoint(u32 value) override; |
| 76 | void ReleaseFences() override; | 76 | void ReleaseFences() override; |
| 77 | void FlushAndInvalidateRegion(VAddr addr, u64 size) override; | 77 | void FlushAndInvalidateRegion(VAddr addr, u64 size) override; |
| 78 | void WaitForIdle() override; | ||
| 78 | void FlushCommands() override; | 79 | void FlushCommands() override; |
| 79 | void TickFrame() override; | 80 | void TickFrame() override; |
| 80 | bool AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Regs::Surface& src, | 81 | bool AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Regs::Surface& src, |