summaryrefslogtreecommitdiff
path: root/src/render
diff options
context:
space:
mode:
authorVaxry <vaxry@vaxry.net>2023-11-25 17:45:08 +0000
committerVaxry <vaxry@vaxry.net>2023-11-25 17:45:08 +0000
commit6f733292bf2dae2adf1e7524546e140a93824033 (patch)
tree83e60a7e2569f56f50b2cb672b9c22c98fb32e4b /src/render
parent3fe6162af1904f15fc5526c179c06a48265bdbff (diff)
renderer: nvidia checks and use glFinish on nvidia
fixes #3952 #3946
Diffstat (limited to 'src/render')
-rw-r--r--src/render/Renderer.cpp49
-rw-r--r--src/render/Renderer.hpp3
2 files changed, 51 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
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<Vector2D> 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<std::unique_ptr<CRenderbuffer>> m_vRenderbuffers;