platformsupport/scenes/opengl: use the render node for dmabuf feedback

It gives applications better information about what render device to use, and also
works around issues in Xwayland and some broken drivers
wilder/Plasma/6.2
Xaver Hugl 2 years ago
parent d72f677271
commit b0f75a9040
  1. 18
      src/opengl/egldisplay.cpp
  2. 2
      src/opengl/egldisplay.h
  3. 6
      src/platformsupport/scenes/opengl/abstract_egl_backend.cpp

@ -7,6 +7,7 @@
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "egldisplay.h"
#include "core/drmdevice.h"
#include "core/graphicsbuffer.h"
#include "opengl/eglutils_p.h"
#include "opengl/glutils.h"
@ -73,11 +74,23 @@ std::unique_ptr<EglDisplay> EglDisplay::create(::EGLDisplay display, bool owning
return std::make_unique<EglDisplay>(display, extensions, owning);
}
static std::optional<dev_t> devIdForFileName(const QString &path)
{
auto device = DrmDevice::open(path);
if (device) {
return device->deviceId();
} else {
qCWarning(KWIN_OPENGL, "couldn't find dev node for drm device %s", qPrintable(path));
return std::nullopt;
}
}
EglDisplay::EglDisplay(::EGLDisplay display, const QList<QByteArray> &extensions, bool owning)
: m_handle(display)
, m_extensions(extensions)
, m_owning(owning)
, m_renderNode(determineRenderNode())
, m_renderDevNode(devIdForFileName(m_renderNode))
, m_supportsBufferAge(extensions.contains(QByteArrayLiteral("EGL_EXT_buffer_age")) && qgetenv("KWIN_USE_BUFFER_AGE") != "0")
, m_supportsNativeFence(extensions.contains(QByteArrayLiteral("EGL_ANDROID_native_fence_sync")))
{
@ -334,6 +347,11 @@ QString EglDisplay::determineRenderNode() const
return QString();
}
std::optional<dev_t> EglDisplay::renderDevNode() const
{
return m_renderDevNode;
}
EGLImageKHR EglDisplay::createImage(EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list) const
{
Q_ASSERT(m_functions.createImageKHR);

@ -40,6 +40,7 @@ public:
bool hasExtension(const QByteArray &name) const;
QString renderNode() const;
std::optional<dev_t> renderDevNode() const;
bool supportsBufferAge() const;
bool supportsNativeFence() const;
@ -65,6 +66,7 @@ private:
const QList<QByteArray> m_extensions;
const bool m_owning;
const QString m_renderNode;
const std::optional<dev_t> m_renderDevNode;
const bool m_supportsBufferAge;
const bool m_supportsNativeFence;

@ -174,17 +174,17 @@ void AbstractEglBackend::initWayland()
};
m_tranches.append({
.device = scanoutDevice->deviceId(),
.device = m_display->renderDevNode().value_or(scanoutDevice->deviceId()),
.flags = {},
.formatTable = filterFormats(10, false),
});
m_tranches.append({
.device = scanoutDevice->deviceId(),
.device = m_display->renderDevNode().value_or(scanoutDevice->deviceId()),
.flags = {},
.formatTable = filterFormats(8, false),
});
m_tranches.append({
.device = scanoutDevice->deviceId(),
.device = m_display->renderDevNode().value_or(scanoutDevice->deviceId()),
.flags = {},
.formatTable = includeShaderConversions(filterFormats({}, true)),
});

Loading…
Cancel
Save