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()