KWin
Loading...
Searching...
No Matches
virtual_qpainter_backend.cpp
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: 2015 Martin Gräßlin <mgraesslin@kde.org>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
14#include "virtual_backend.h"
15#include "virtual_output.h"
16
17#include <drm_fourcc.h>
18
19namespace KWin
20{
21
23 : m_output(output)
24 , m_backend(backend)
25{
26}
27
31
32std::optional<OutputLayerBeginFrameInfo> VirtualQPainterLayer::beginFrame()
33{
34 const QSize nativeSize(m_output->modeSize());
35 if (!m_swapchain || m_swapchain->size() != nativeSize) {
36 m_swapchain = std::make_unique<QPainterSwapchain>(m_backend->graphicsBufferAllocator(), nativeSize, DRM_FORMAT_XRGB8888);
37 }
38
39 m_current = m_swapchain->acquire();
40 if (!m_current) {
41 return std::nullopt;
42 }
43
44 m_renderStart = std::chrono::steady_clock::now();
46 .renderTarget = RenderTarget(m_current->view()->image()),
47 .repaint = m_output->rect(),
48 };
49}
50
51bool VirtualQPainterLayer::endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion)
52{
53 m_renderTime = std::chrono::steady_clock::now() - m_renderStart;
54 return true;
55}
56
58{
59 return m_current->view()->image();
60}
61
62std::chrono::nanoseconds VirtualQPainterLayer::queryRenderTime() const
63{
64 return m_renderTime;
65}
66
68 : m_allocator(std::make_unique<ShmGraphicsBufferAllocator>())
69{
70 connect(backend, &VirtualBackend::outputAdded, this, &VirtualQPainterBackend::addOutput);
71 connect(backend, &VirtualBackend::outputRemoved, this, &VirtualQPainterBackend::removeOutput);
72
73 const auto outputs = backend->outputs();
74 for (Output *output : outputs) {
75 addOutput(output);
76 }
77}
78
80
81void VirtualQPainterBackend::addOutput(Output *output)
82{
83 m_outputs[output] = std::make_unique<VirtualQPainterLayer>(output, this);
84}
85
86void VirtualQPainterBackend::removeOutput(Output *output)
87{
88 m_outputs.erase(output);
89}
90
95
96void VirtualQPainterBackend::present(Output *output, const std::shared_ptr<OutputFrame> &frame)
97{
98 static_cast<VirtualOutput *>(output)->present(frame);
99}
100
102{
103 return m_outputs[output].get();
104}
105}
106
107#include "moc_virtual_qpainter_backend.cpp"
void outputAdded(Output *output)
void outputRemoved(Output *output)
QRect rect() const
Definition output.h:484
QSize modeSize() const
Definition output.cpp:480
Outputs outputs() const override
void present(Output *output, const std::shared_ptr< OutputFrame > &frame) override
GraphicsBufferAllocator * graphicsBufferAllocator() const override
VirtualQPainterBackend(VirtualBackend *backend)
VirtualQPainterLayer * primaryLayer(Output *output) override
std::chrono::nanoseconds queryRenderTime() const override
std::optional< OutputLayerBeginFrameInfo > beginFrame() override
bool endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion) override
VirtualQPainterLayer(Output *output, VirtualQPainterBackend *backend)