diff options
| author | Vaxry <vaxry@vaxry.net> | 2023-11-25 17:45:08 +0000 |
|---|---|---|
| committer | Vaxry <vaxry@vaxry.net> | 2023-11-25 17:45:08 +0000 |
| commit | 6f733292bf2dae2adf1e7524546e140a93824033 (patch) | |
| tree | 83e60a7e2569f56f50b2cb672b9c22c98fb32e4b /src/render/Renderer.cpp | |
| parent | 3fe6162af1904f15fc5526c179c06a48265bdbff (diff) | |
renderer: nvidia checks and use glFinish on nvidia
fixes #3952 #3946
Diffstat (limited to 'src/render/Renderer.cpp')
| -rw-r--r-- | src/render/Renderer.cpp | 49 |
1 files changed, 48 insertions, 1 deletions
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 <algorithm> +extern "C" { +#include <xf86drm.h> +} + 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 |
