17#include <KWayland/Client/surface.h>
20#include <drm_fourcc.h>
21#include <wayland-client-protocol.h>
29 : m_waylandOutput(output)
43 auto s = m_waylandOutput->
surface();
44 s->attachBuffer(buffer);
46 s->setScale(std::ceil(m_waylandOutput->
scale()));
49 m_swapchain->release(m_back);
59 const QSize nativeSize(m_waylandOutput->
modeSize());
60 if (!m_swapchain || m_swapchain->size() != nativeSize) {
61 m_swapchain = std::make_unique<QPainterSwapchain>(m_backend->
graphicsBufferAllocator(), nativeSize, DRM_FORMAT_XRGB8888);
64 m_back = m_swapchain->acquire();
69 m_renderStart = std::chrono::steady_clock::now();
78 m_renderTime = std::chrono::steady_clock::now() - m_renderStart;
79 m_damageJournal.
add(damagedRegion);
100 const auto tmp =
size().expandedTo(QSize(64, 64));
101 const QSize bufferSize(std::ceil(tmp.width()), std::ceil(tmp.height()));
102 if (!m_swapchain || m_swapchain->size() != bufferSize) {
103 m_swapchain = std::make_unique<QPainterSwapchain>(m_backend->
graphicsBufferAllocator(), bufferSize, DRM_FORMAT_ARGB8888);
106 m_back = m_swapchain->acquire();
111 m_renderStart = std::chrono::steady_clock::now();
120 m_renderTime = std::chrono::steady_clock::now() - m_renderStart;
125 m_swapchain->release(m_back);
141 for (
auto *output : waylandOutputs) {
142 createOutput(output);
146 m_outputs.erase(waylandOutput);
154void WaylandQPainterBackend::createOutput(
Output *waylandOutput)
156 m_outputs[waylandOutput] = Layers{
157 .primaryLayer = std::make_unique<WaylandQPainterPrimaryLayer>(
static_cast<WaylandOutput *
>(waylandOutput),
this),
158 .cursorLayer = std::make_unique<WaylandQPainterCursorLayer>(
static_cast<WaylandOutput *
>(waylandOutput),
this),
164 return m_allocator.get();
169 m_outputs[output].primaryLayer->present();
175 return m_outputs[output].primaryLayer.get();
180 return m_outputs[output].cursorLayer.get();
186#include "moc_wayland_qpainter_backend.cpp"
void add(const QRegion ®ion)
QRegion accumulate(int bufferAge, const QRegion &fallback=QRegion()) const
QRegion lastDamage() const
void outputAdded(Output *output)
void outputRemoved(Output *output)
Class encapsulating all Wayland data structures needed by the Egl backend.
QList< WaylandOutput * > waylandOutputs() const
wl_buffer * importBuffer(GraphicsBuffer *graphicsBuffer)
void update(wl_buffer *buffer, qreal scale, const QPoint &hotspot)
WaylandCursor * cursor() const
WaylandBackend * backend() const
KWayland::Client::Surface * surface() const
OutputLayer * primaryLayer(Output *output) override
WaylandQPainterBackend(WaylandBackend *b)
GraphicsBufferAllocator * graphicsBufferAllocator() const override
~WaylandQPainterBackend() override
OutputLayer * cursorLayer(Output *output) override
void present(Output *output, const std::shared_ptr< OutputFrame > &frame) override
std::chrono::nanoseconds queryRenderTime() const override
~WaylandQPainterCursorLayer() 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
QRegion accumulateDamage(int bufferAge) const
WaylandQPainterPrimaryLayer(WaylandOutput *output, WaylandQPainterBackend *backend)
bool endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion) override
~WaylandQPainterPrimaryLayer() override
KWIN_EXPORT QRect infiniteRegion()
RenderTarget renderTarget