11#include <config-kwin.h>
31#include <KLocalizedString>
32#if KWIN_BUILD_NOTIFICATIONS
33#include <KNotification>
49 static const int compositorLostMessageDelay = 2000;
64 FTraceLogger::create();
76 for (
Output *output : outputs) {
77 if (output->renderLoop() == loop) {
115 if (
auto *con = kwinApp()->x11Connection()) {
118 xcb_delete_property(con, kwinApp()->x11RootWindow(), atom);
131void Compositor::handleFrameRequested(
RenderLoop *renderLoop)
139 qCDebug(KWIN_CORE) <<
"Graphics reset occurred";
140#if KWIN_BUILD_NOTIFICATIONS
141 KNotification::event(QStringLiteral(
"graphicsreset"), i18n(
"Desktop effects were restarted due to a graphics reset"));
155 auto frame = std::make_shared<OutputFrame>(renderLoop);
160 QRegion surfaceDamage = primaryLayer->
repaints();
168 const bool wantsAdaptiveSync = activeWindow && activeWindow->
wantsAdaptiveSync();
177 bool directScanout =
false;
179 const auto sublayers = superLayer->
sublayers();
180 const bool scanoutPossible = std::none_of(sublayers.begin(), sublayers.end(), [](
RenderLayer *sublayer) {
181 return sublayer->isVisible();
184 directScanout = primaryLayer->
scanout(scanoutCandidate);
188 if (!directScanout) {
189 if (
auto beginInfo = primaryLayer->
beginFrame()) {
190 auto &[renderTarget, repaint] = beginInfo.value();
192 const QRegion bufferDamage = surfaceDamage.united(repaint).intersected(superLayer->
rect().toAlignedRect());
194 paintPass(superLayer, renderTarget, bufferDamage);
195 primaryLayer->
endFrame(bufferDamage, surfaceDamage);
208 const std::chrono::milliseconds frameTime =
223 const auto sublayers = layer->
sublayers();
231 if (
const QRegion repaints = layer->
repaints(); !repaints.isEmpty()) {
237 if (!repaints.isEmpty()) {
241 const auto sublayers = layer->
sublayers();
243 if (sublayer->isVisible()) {
252 const auto sublayers = layer->
sublayers();
254 if (sublayer->isVisible()) {
264 const auto sublayers = layer->
sublayers();
266 if (sublayer->isVisible()) {
267 paintPass(sublayer, renderTarget, region);
302#include "moc_compositor.cpp"
static Compositor * s_compositor
std::unique_ptr< RenderBackend > m_backend
virtual bool openGLCompositingIsBroken() const
void postPaintPass(RenderLayer *layer)
QTimer m_unusedSupportPropertyTimer
void removeSuperLayer(RenderLayer *layer)
virtual void composite(RenderLoop *renderLoop)
QList< xcb_atom_t > m_unusedSupportProperties
virtual void reinitialize()
void deleteUnusedSupportProperties()
void framePass(RenderLayer *layer, OutputFrame *frame)
virtual bool compositingPossible() const
QHash< RenderLoop *, RenderLayer * > m_superlayers
Compositor(QObject *parent=nullptr)
virtual void inhibit(Window *window)
void paintPass(RenderLayer *layer, const RenderTarget &renderTarget, const QRegion ®ion)
virtual void uninhibit(Window *window)
void prePaintPass(RenderLayer *layer, QRegion *damage)
Output * findOutput(RenderLoop *loop) const
void keepSupportProperty(xcb_atom_t atom)
virtual QString compositingNotPossibleReason() const
void addSuperLayer(RenderLayer *layer)
void removeSupportProperty(xcb_atom_t atom)
static Compositor * self()
void markAsRendered(std::chrono::milliseconds timestamp)
Cursor * currentCursor() const
PresentationModeHint presentationHint() const
VrrPolicy vrrPolicy() const
bool directScanoutInhibited() const
virtual RenderLoop * renderLoop() const =0
Capabilities capabilities() const
virtual bool endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion)=0
bool needsRepaint() const
virtual std::optional< OutputLayerBeginFrameInfo > beginFrame()=0
virtual bool scanout(SurfaceItem *surfaceItem)
virtual void paint(const RenderTarget &renderTarget, const QRegion ®ion)=0
virtual SurfaceItem * scanoutCandidate() const
virtual QRegion prePaint()
virtual void frame(OutputFrame *frame)
void setOutputLayer(OutputLayer *layer)
RenderLoop * loop() const
QList< RenderLayer * > sublayers() const
QPoint mapToGlobal(const QPoint &point) const
RenderLayerDelegate * delegate() const
bool needsRepaint() const
void frameRequested(RenderLoop *loop)
std::chrono::nanoseconds lastPresentationTimestamp() const
virtual ContentType contentType() const
SurfaceItem * surfaceItem() const
virtual bool isFullScreen() const
bool wantsAdaptiveSync() const
Window * activeWindow() const
QList< Output * > outputs() const
#define fTraceDuration(...)
WaylandServer * waylandServer()