Add a pure virtual method to Platform to describe the supported compositors

Summary:
So far KWin does not know which Compositors the platform actually
supports. This results in KWin happily trying to use the OpenGL
compositor on fbdev or the QPainter compositor on hwcomposer although
that is obviously going to fail as the platform doesn't support this.

By adding a pure virtual method all Platforms can define what they
support. In a later step the Compositor can use this to create an
appropriate scene and also perform proper fallback handling in case the
scene creation fails.

Test Plan: Compiles

Reviewers: #kwin, #plasma

Subscribers: plasma-devel, kwin

Tags: #kwin

Differential Revision: https://phabricator.kde.org/D8316
icc-effect-5.14.5
Martin Flöser 2017-10-15 22:24:49 +02:00
parent aed7ff64c4
commit 09489a4c2b
11 changed files with 59 additions and 0 deletions

View File

@ -376,6 +376,12 @@ public:
* Default implementation creates an EffectsHandlerImp;
**/
virtual void createEffectsHandler(Compositor *compositor, Scene *scene);
/**
* The CompositingTypes supported by the Platform.
* The first item should be the most preferred one.
* @since 5.11
**/
virtual QVector<CompositingType> supportedCompositors() const = 0;
public Q_SLOTS:
void pointerMotion(const QPointF &position, quint32 time);

View File

@ -738,4 +738,13 @@ void DrmBackend::outputDpmsChanged()
setOutputsEnabled(enabled);
}
QVector<CompositingType> DrmBackend::supportedCompositors() const
{
#if HAVE_GBM
return QVector<CompositingType>{OpenGLCompositing, QPainterCompositing};
#else
return QVector<CompositingType>{QPainterCompositing};
#endif
}
}

View File

@ -118,6 +118,8 @@ public:
return m_gbmDevice;
}
QVector<CompositingType> supportedCompositors() const override;
public Q_SLOTS:
void turnOutputsOn();

View File

@ -78,6 +78,10 @@ public:
return m_bgr;
}
QVector<CompositingType> supportedCompositors() const override {
return QVector<CompositingType>{QPainterCompositing};
}
private:
void openFrameBuffer();
bool queryScreenInfo();

View File

@ -82,6 +82,10 @@ public:
return m_outputBlank;
}
QVector<CompositingType> supportedCompositors() const override {
return QVector<CompositingType>{OpenGLCompositing};
}
Q_SIGNALS:
void outputBlankChanged();

View File

@ -85,6 +85,10 @@ public:
m_gbmDevice = device;
}
QVector<CompositingType> supportedCompositors() const override {
return QVector<CompositingType>{OpenGLCompositing, QPainterCompositing};
}
Q_SIGNALS:
void sizeChanged();
void outputGeometriesChanged(const QVector<QRect> &geometries);

View File

@ -653,6 +653,16 @@ void WaylandBackend::updateWindowTitle()
}
}
QVector<CompositingType> WaylandBackend::supportedCompositors() const
{
#if HAVE_WAYLAND_EGL
return QVector<CompositingType>{OpenGLCompositing, QPainterCompositing};
#else
return QVector<CompositingType>{QPainterCompositing};
#endif
}
}
} // KWin

View File

@ -148,6 +148,8 @@ public:
void togglePointerConfinement();
QVector<CompositingType> supportedCompositors() const override;
Q_SIGNALS:
void shellSurfaceSizeChanged(const QSize &size);
void systemCompositorDied();

View File

@ -410,4 +410,17 @@ void X11StandalonePlatform::createEffectsHandler(Compositor *compositor, Scene *
new EffectsHandlerImplX11(compositor, scene);
}
QVector<CompositingType> X11StandalonePlatform::supportedCompositors() const
{
QVector<CompositingType> compositors;
#if HAVE_EPOXY_GLX
compositors << OpenGLCompositing;
#endif
#ifdef KWIN_HAVE_XRENDER_COMPOSITING
compositors << XRenderCompositing;
#endif
compositors << NoCompositing;
return compositors;
}
}

View File

@ -65,6 +65,7 @@ public:
void invertScreen() override;
void createEffectsHandler(Compositor *compositor, Scene *scene) override;
QVector<CompositingType> supportedCompositors() const override;
protected:
void doHideCursor() override;

View File

@ -69,6 +69,10 @@ public:
QPainterBackend* createQPainterBackend() override;
void warpPointer(const QPointF &globalPos) override;
QVector<CompositingType> supportedCompositors() const override {
return QVector<CompositingType>{OpenGLCompositing, QPainterCompositing};
}
Q_SIGNALS:
void sizeChanged();