KWin
Loading...
Searching...
No Matches
wayland_qpainter_backend.h
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2019 Roman Gilg <subdiff@gmail.com>
6 SPDX-FileCopyrightText: 2013, 2015 Martin Gräßlin <mgraesslin@kde.org>
7
8 SPDX-License-Identifier: GPL-2.0-or-later
9*/
10#pragma once
11
12#include "core/outputlayer.h"
14#include "utils/damagejournal.h"
15
16#include <QImage>
17#include <QObject>
18#include <chrono>
19
20namespace KWin
21{
22class Output;
23class GraphicsBufferAllocator;
24class QPainterSwapchainSlot;
25class QPainterSwapchain;
26
27namespace Wayland
28{
29class WaylandBackend;
30class WaylandDisplay;
31class WaylandOutput;
32class WaylandQPainterBackend;
33
35{
36public:
39
40 std::optional<OutputLayerBeginFrameInfo> beginFrame() override;
41 bool endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion) override;
42 std::chrono::nanoseconds queryRenderTime() const override;
43
44 void present();
45
46 QRegion accumulateDamage(int bufferAge) const;
47
48private:
49 WaylandOutput *m_waylandOutput;
50 WaylandQPainterBackend *m_backend;
51 DamageJournal m_damageJournal;
52
53 std::unique_ptr<QPainterSwapchain> m_swapchain;
54 std::shared_ptr<QPainterSwapchainSlot> m_back;
55 std::chrono::steady_clock::time_point m_renderStart;
56 std::chrono::nanoseconds m_renderTime;
57
59};
60
62{
63 Q_OBJECT
64
65public:
68
69 std::optional<OutputLayerBeginFrameInfo> beginFrame() override;
70 bool endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion) override;
71 std::chrono::nanoseconds queryRenderTime() const override;
72
73private:
74 WaylandOutput *m_output;
75 WaylandQPainterBackend *m_backend;
76 std::unique_ptr<QPainterSwapchain> m_swapchain;
77 std::shared_ptr<QPainterSwapchainSlot> m_back;
78 std::chrono::steady_clock::time_point m_renderStart;
79 std::chrono::nanoseconds m_renderTime;
80};
81
83{
84 Q_OBJECT
85public:
87 ~WaylandQPainterBackend() override;
88
90
91 void present(Output *output, const std::shared_ptr<OutputFrame> &frame) override;
92 OutputLayer *primaryLayer(Output *output) override;
93 OutputLayer *cursorLayer(Output *output) override;
94
95private:
96 void createOutput(Output *waylandOutput);
97
98 struct Layers
99 {
100 std::unique_ptr<WaylandQPainterPrimaryLayer> primaryLayer;
101 std::unique_ptr<WaylandQPainterCursorLayer> cursorLayer;
102 };
103
104 WaylandBackend *m_backend;
105 std::unique_ptr<GraphicsBufferAllocator> m_allocator;
106 std::map<Output *, Layers> m_outputs;
107};
108
109} // namespace Wayland
110} // namespace KWin
Class encapsulating all Wayland data structures needed by the Egl backend.
OutputLayer * primaryLayer(Output *output) override
GraphicsBufferAllocator * graphicsBufferAllocator() const override
OutputLayer * cursorLayer(Output *output) override
void present(Output *output, const std::shared_ptr< OutputFrame > &frame) override
std::chrono::nanoseconds queryRenderTime() const override
bool endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion) override
std::optional< OutputLayerBeginFrameInfo > beginFrame() override
WaylandQPainterCursorLayer(WaylandOutput *output, WaylandQPainterBackend *backend)
std::optional< OutputLayerBeginFrameInfo > beginFrame() override
std::chrono::nanoseconds queryRenderTime() const override
WaylandQPainterPrimaryLayer(WaylandOutput *output, WaylandQPainterBackend *backend)
bool endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion) override