From c7b2a21fcb58d8ddd7f2e22050ad15a6ad3ceb5d Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 12 Aug 2024 04:03:34 +0300 Subject: [PATCH] Fix OpenGL behavior under wayland-egl --- rpcs3/CMakeLists.txt | 1 + rpcs3/Emu/RSX/GL/OpenGL.cpp | 12 ++++++++++++ rpcs3/rpcs3qt/gl_gs_frame.cpp | 2 ++ 3 files changed, 15 insertions(+) diff --git a/rpcs3/CMakeLists.txt b/rpcs3/CMakeLists.txt index 226a126f26..88cb6e29f1 100644 --- a/rpcs3/CMakeLists.txt +++ b/rpcs3/CMakeLists.txt @@ -30,6 +30,7 @@ if(UNIX AND NOT APPLE) find_package(Wayland) if(WAYLAND_FOUND) add_definitions(-DHAVE_WAYLAND) + set(ADDITIONAL_LIBS ${ADDITIONAL_LIBS} "EGL") endif() endif() diff --git a/rpcs3/Emu/RSX/GL/OpenGL.cpp b/rpcs3/Emu/RSX/GL/OpenGL.cpp index 4bee65fdc7..78241f557a 100644 --- a/rpcs3/Emu/RSX/GL/OpenGL.cpp +++ b/rpcs3/Emu/RSX/GL/OpenGL.cpp @@ -1,6 +1,10 @@ #include "stdafx.h" #include "OpenGL.h" +#if defined(HAVE_WAYLAND) +#include +#endif + #ifdef _WIN32 extern "C" @@ -54,6 +58,14 @@ void gl::set_swapinterval(int interval) } } +#ifdef HAVE_WAYLAND + if (auto egl_display = eglGetCurrentDisplay(); egl_display != EGL_NO_DISPLAY) + { + eglSwapInterval(egl_display, interval); + return; + } +#endif + //No existing drawable or missing swap extension, EGL? rsx_log.error("Failed to set swap interval"); #else diff --git a/rpcs3/rpcs3qt/gl_gs_frame.cpp b/rpcs3/rpcs3qt/gl_gs_frame.cpp index 01cc153b76..1e3f6f8fc4 100644 --- a/rpcs3/rpcs3qt/gl_gs_frame.cpp +++ b/rpcs3/rpcs3qt/gl_gs_frame.cpp @@ -18,12 +18,14 @@ gl_gs_frame::gl_gs_frame(QScreen* screen, const QRect& geometry, const QIcon& ap m_format.setAlphaBufferSize(0); m_format.setDepthBufferSize(0); m_format.setSwapBehavior(QSurfaceFormat::SwapBehavior::DoubleBuffer); + m_format.setSwapInterval(0); if (g_cfg.video.debug_output) { m_format.setOption(QSurfaceFormat::FormatOption::DebugContext); } setFormat(m_format); create(); + show(); } draw_context_t gl_gs_frame::make_context()