22#include <drm_fourcc.h>
31 , m_backend(drmBackend)
42 const auto outputs = m_backend->
outputs();
43 for (
const auto output : outputs) {
44 if (
auto drmOutput =
dynamic_cast<DrmOutput *
>(output)) {
45 drmOutput->pipeline()->setLayers(
nullptr,
nullptr);
53bool EglGbmBackend::initializeEgl()
61 display = createEglDisplay(m_backend->
primaryGpu());
70EglDisplay *EglGbmBackend::createEglDisplay(DrmGpu *gpu)
const
76 for (
const QByteArray &extension : {QByteArrayLiteral(
"EGL_EXT_platform_base"), QByteArrayLiteral(
"EGL_KHR_platform_gbm")}) {
78 qCWarning(KWIN_DRM) << extension <<
"client extension is not supported by the platform";
89 if (!initializeEgl()) {
94 if (!initRenderingContext()) {
95 setFailed(
"Could not initialize rendering context");
102bool EglGbmBackend::initRenderingContext()
114 display = createEglDisplay(
gpu);
126 display = createEglDisplay(
gpu);
131 auto &context = m_contexts[display];
132 if (
const auto c = context.lock()) {
135 const auto ret = std::shared_ptr<EglContext>(
EglContext::create(display, EGL_NO_CONFIG_KHR, EGL_NO_CONTEXT));
142 return std::make_unique<BasicEGLSurfaceTextureWayland>(
this, pixmap);
168 if (
const auto virtualLayer =
dynamic_cast<VirtualEglGbmLayer *
>(drmOutput->primaryLayer())) {
171 const auto layer =
static_cast<EglGbmLayer *
>(drmOutput->primaryLayer());
172 return std::make_pair(layer->texture(), layer->colorDescription());
177 static bool ok =
false;
178 static const int preferred = qEnvironmentVariableIntValue(
"KWIN_DRM_PREFER_COLOR_DEPTH", &ok);
179 return !ok || preferred == 30;
184 return std::make_shared<EglGbmLayer>(
this, pipeline);
189 return std::make_shared<EglGbmCursorLayer>(
this, pipeline);
194 return std::make_shared<VirtualEglGbmLayer>(
this, output);
204#include "moc_drm_egl_backend.cpp"
void initClientExtensions()
bool makeCurrent() override
bool hasClientExtension(const QByteArray &ext) const
EglDisplay * eglDisplayObject() const
void setEglDisplay(EglDisplay *display)
bool createContext(EGLConfig config)
std::shared_ptr< EglContext > m_context
static const ColorDescription sRGB
Outputs outputs() const override
void setRenderBackend(DrmRenderBackend *backend)
void gpuRemoved(DrmGpu *gpu)
DrmGpu * primaryGpu() const
void setEglDisplay(std::unique_ptr< EglDisplay > &&display)
EglDisplay * eglDisplay() const
GraphicsBufferAllocator * graphicsBufferAllocator() const
gbm_device * gbmDevice() const
static std::unique_ptr< EglContext > create(EglDisplay *display, EGLConfig config, ::EGLContext sharedContext)
static std::unique_ptr< EglDisplay > create(::EGLDisplay display, bool owning=true)
EglGbmBackend(DrmBackend *drmBackend)
std::shared_ptr< DrmOutputLayer > createLayer(DrmVirtualOutput *output) override
EglDisplay * displayForGpu(DrmGpu *gpu)
std::pair< std::shared_ptr< KWin::GLTexture >, ColorDescription > textureForOutput(Output *requestedOutput) const override
OutputLayer * primaryLayer(Output *output) override
std::unique_ptr< SurfaceTexture > createSurfaceTextureWayland(SurfacePixmap *pixmap) override
bool prefer10bpc() const override
std::shared_ptr< DrmPipelineLayer > createPrimaryLayer(DrmPipeline *pipeline) override
std::shared_ptr< EglContext > contextForGpu(DrmGpu *gpu)
OutputLayer * cursorLayer(Output *output) override
GraphicsBufferAllocator * graphicsBufferAllocator() const override
std::shared_ptr< DrmPipelineLayer > createCursorLayer(DrmPipeline *pipeline) override
void present(Output *output, const std::shared_ptr< OutputFrame > &frame) override
~EglGbmBackend() override
void setFailed(const QString &reason)
Sets the backend initialization to failed.