diff options
author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2020-02-19 18:40:37 +0100 |
---|---|---|
committer | Fernando Sahmkow <fsahmkow27@gmail.com> | 2020-04-22 17:36:16 +0200 |
commit | b7bc3c25496849661846f2fe42f591f2a81fbc87 (patch) | |
tree | 5c65f286d0ac58dfd46a42325a71548f20522f71 /src/video_core/renderer_opengl | |
parent | BufferCache: Refactor async managing. (diff) | |
download | yuzu-b7bc3c25496849661846f2fe42f591f2a81fbc87.tar yuzu-b7bc3c25496849661846f2fe42f591f2a81fbc87.tar.gz yuzu-b7bc3c25496849661846f2fe42f591f2a81fbc87.tar.bz2 yuzu-b7bc3c25496849661846f2fe42f591f2a81fbc87.tar.lz yuzu-b7bc3c25496849661846f2fe42f591f2a81fbc87.tar.xz yuzu-b7bc3c25496849661846f2fe42f591f2a81fbc87.tar.zst yuzu-b7bc3c25496849661846f2fe42f591f2a81fbc87.zip |
Diffstat (limited to 'src/video_core/renderer_opengl')
-rw-r--r-- | src/video_core/renderer_opengl/gl_fence_manager.cpp | 24 | ||||
-rw-r--r-- | src/video_core/renderer_opengl/gl_fence_manager.h | 6 | ||||
-rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 13 | ||||
-rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.h | 3 |
4 files changed, 37 insertions, 9 deletions
diff --git a/src/video_core/renderer_opengl/gl_fence_manager.cpp b/src/video_core/renderer_opengl/gl_fence_manager.cpp index 69dd3211b..579c03a1e 100644 --- a/src/video_core/renderer_opengl/gl_fence_manager.cpp +++ b/src/video_core/renderer_opengl/gl_fence_manager.cpp @@ -8,17 +8,26 @@ namespace OpenGL { -GLInnerFence::GLInnerFence(GPUVAddr address, u32 payload) - : VideoCommon::FenceBase(address, payload), sync_object{} {} +GLInnerFence::GLInnerFence(u32 payload, bool is_stubbed) + : VideoCommon::FenceBase(payload, is_stubbed), sync_object{} {} + +GLInnerFence::GLInnerFence(GPUVAddr address, u32 payload, bool is_stubbed) + : VideoCommon::FenceBase(address, payload, is_stubbed), sync_object{} {} GLInnerFence::~GLInnerFence() = default; void GLInnerFence::Queue() { + if (is_stubbed) { + return; + } ASSERT(sync_object.handle == 0); sync_object.Create(); } bool GLInnerFence::IsSignaled() const { + if (is_stubbed) { + return true; + } ASSERT(sync_object.handle != 0); GLsizei length; GLint sync_status; @@ -27,6 +36,9 @@ bool GLInnerFence::IsSignaled() const { } void GLInnerFence::Wait() { + if (is_stubbed) { + return; + } ASSERT(sync_object.handle != 0); while (glClientWaitSync(sync_object.handle, 0, 1000) == GL_TIMEOUT_EXPIRED) ; @@ -36,8 +48,12 @@ FenceManagerOpenGL::FenceManagerOpenGL(Core::System& system, VideoCore::Rasteriz TextureCacheOpenGL& texture_cache, OGLBufferCache& buffer_cache) : GenericFenceManager(system, rasterizer, texture_cache, buffer_cache) {} -Fence FenceManagerOpenGL::CreateFence(GPUVAddr addr, u32 value) { - return std::make_shared<GLInnerFence>(addr, value); +Fence FenceManagerOpenGL::CreateFence(u32 value, bool is_stubbed) { + return std::make_shared<GLInnerFence>(value, is_stubbed); +} + +Fence FenceManagerOpenGL::CreateFence(GPUVAddr addr, u32 value, bool is_stubbed) { + return std::make_shared<GLInnerFence>(addr, value, is_stubbed); } void FenceManagerOpenGL::QueueFence(Fence& fence) { diff --git a/src/video_core/renderer_opengl/gl_fence_manager.h b/src/video_core/renderer_opengl/gl_fence_manager.h index b48d5eaa0..ba48d2f84 100644 --- a/src/video_core/renderer_opengl/gl_fence_manager.h +++ b/src/video_core/renderer_opengl/gl_fence_manager.h @@ -17,7 +17,8 @@ namespace OpenGL { class GLInnerFence : public VideoCommon::FenceBase { public: - GLInnerFence(GPUVAddr address, u32 payload); + GLInnerFence(u32 payload, bool is_stubbed); + GLInnerFence(GPUVAddr address, u32 payload, bool is_stubbed); ~GLInnerFence(); void Queue(); @@ -39,7 +40,8 @@ public: TextureCacheOpenGL& texture_cache, OGLBufferCache& buffer_cache); protected: - Fence CreateFence(GPUVAddr addr, u32 value) override; + Fence CreateFence(u32 value, bool is_stubbed) override; + Fence CreateFence(GPUVAddr addr, u32 value, bool is_stubbed) override; void QueueFence(Fence& fence) override; bool IsFenceSignaled(Fence& fence) override; void WaitFence(Fence& fence) override; diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 88914828c..e52e5961f 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -683,14 +683,23 @@ void RasterizerOpenGL::SyncGuestHost() { buffer_cache.SyncGuestHost(); } -void RasterizerOpenGL::SignalFence(GPUVAddr addr, u32 value) { +void RasterizerOpenGL::SignalSemaphore(GPUVAddr addr, u32 value) { auto& gpu{system.GPU()}; if (!gpu.IsAsync()) { auto& memory_manager{gpu.MemoryManager()}; memory_manager.Write<u32>(addr, value); return; } - fence_manager.SignalFence(addr, value); + fence_manager.SignalSemaphore(addr, value); +} + +void RasterizerOpenGL::SignalSyncPoint(u32 value) { + auto& gpu{system.GPU()}; + if (!gpu.IsAsync()) { + gpu.IncrementSyncPoint(value); + return; + } + fence_manager.SignalSyncPoint(value); } void RasterizerOpenGL::ReleaseFences() { diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h index 5c0f88e6f..15e9ff7d7 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.h +++ b/src/video_core/renderer_opengl/gl_rasterizer.h @@ -71,7 +71,8 @@ public: void InvalidateRegion(VAddr addr, u64 size) override; void OnCPUWrite(VAddr addr, u64 size) override; void SyncGuestHost() override; - void SignalFence(GPUVAddr addr, u32 value) override; + void SignalSemaphore(GPUVAddr addr, u32 value) override; + void SignalSyncPoint(u32 value) override; void ReleaseFences() override; void FlushAndInvalidateRegion(VAddr addr, u64 size) override; void FlushCommands() override; |