From 6f733292bf2dae2adf1e7524546e140a93824033 Mon Sep 17 00:00:00 2001 From: Vaxry Date: Sat, 25 Nov 2023 17:45:08 +0000 Subject: [PATCH] renderer: nvidia checks and use glFinish on nvidia fixes #3952 #3946 --- CMakeLists.txt | 1 - src/render/Renderer.cpp | 49 ++++++++++++++++++++++++++++++++++++++++- src/render/Renderer.hpp | 3 +++ 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3f62a65e..6f52c554 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -99,7 +99,6 @@ set(CMAKE_ENABLE_EXPORTS TRUE) message(STATUS "Checking deps...") find_package(Threads REQUIRED) - find_package(PkgConfig REQUIRED) find_package(OpenGL REQUIRED) pkg_check_modules(deps REQUIRED IMPORTED_TARGET wayland-server wayland-client wayland-cursor wayland-protocols cairo libdrm xkbcommon libinput pango pangocairo pixman-1) # we do not check for wlroots, as we provide it ourselves diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index bc71978b..273bc1ca 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -4,11 +4,51 @@ #include "../helpers/Region.hpp" #include +extern "C" { +#include +} + CHyprRenderer::CHyprRenderer() { const auto ENV = getenv("WLR_DRM_NO_ATOMIC"); if (ENV && std::string(ENV) == "1") m_bTearingEnvSatisfied = true; + + if (g_pCompositor->m_sWLRSession) { + wlr_device* dev; + wl_list_for_each(dev, &g_pCompositor->m_sWLRSession->devices, link) { + const auto DRMV = drmGetVersion(dev->fd); + + std::string name = std::string{DRMV->name, DRMV->name_len}; + std::transform(name.begin(), name.end(), name.begin(), tolower); + + if (name.contains("nvidia")) + m_bNvidia = true; + + Debug::log(LOG, "DRM driver information: {} v{}.{}.{} from {} description {}", name, DRMV->version_major, DRMV->version_minor, DRMV->version_patchlevel, + std::string{DRMV->date, DRMV->date_len}, std::string{DRMV->desc, DRMV->desc_len}); + + drmFreeVersion(DRMV); + } + } else { + Debug::log(LOG, "m_sWLRSession is null, omitting full DRM node checks"); + + const auto DRMV = drmGetVersion(g_pCompositor->m_iDRMFD); + + std::string name = std::string{DRMV->name, DRMV->name_len}; + std::transform(name.begin(), name.end(), name.begin(), tolower); + + if (name.contains("nvidia")) + m_bNvidia = true; + + Debug::log(LOG, "Primary DRM driver information: {} v{}.{}.{} from {} description {}", name, DRMV->version_major, DRMV->version_minor, DRMV->version_patchlevel, + std::string{DRMV->date, DRMV->date_len}, std::string{DRMV->desc, DRMV->desc_len}); + + drmFreeVersion(DRMV); + } + + if (m_bNvidia) + Debug::log(WARN, "NVIDIA detected, please remember to follow nvidia instructions on the wiki"); } void renderSurface(struct wlr_surface* surface, int x, int y, void* data) { @@ -2284,7 +2324,10 @@ void CHyprRenderer::endRender() { return; } - glFlush(); + if (isNvidia()) + glFinish(); + else + glFlush(); if (m_eRenderMode == RENDER_MODE_NORMAL) wlr_output_state_set_buffer(&PMONITOR->output->pending, m_pCurrentWlrBuffer); @@ -2304,4 +2347,8 @@ void CHyprRenderer::onRenderbufferDestroy(CRenderbuffer* rb) { CRenderbuffer* CHyprRenderer::getCurrentRBO() { return m_pCurrentRenderbuffer; +} + +bool CHyprRenderer::isNvidia() { + return m_bNvidia; } \ No newline at end of file diff --git a/src/render/Renderer.hpp b/src/render/Renderer.hpp index 6b4f0561..1107d993 100644 --- a/src/render/Renderer.hpp +++ b/src/render/Renderer.hpp @@ -69,6 +69,7 @@ class CHyprRenderer { void renderSoftwareCursors(CMonitor* pMonitor, const CRegion& damage, std::optional overridePos = {}); void onRenderbufferDestroy(CRenderbuffer* rb); CRenderbuffer* getCurrentRBO(); + bool isNvidia(); bool beginRender(CMonitor* pMonitor, CRegion& damage, eRenderMode mode = RENDER_MODE_NORMAL, wlr_buffer* withBuffer = nullptr); void endRender(); @@ -121,6 +122,8 @@ class CHyprRenderer { eRenderMode m_eRenderMode = RENDER_MODE_NORMAL; int m_iLastBufferAge = 0; + bool m_bNvidia = false; + CRenderbuffer* getOrCreateRenderbuffer(wlr_buffer* buffer, uint32_t fmt); std::vector> m_vRenderbuffers;