KWin
Loading...
Searching...
No Matches
drm_virtual_output.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: 2018 Roman Gilg <subdiff@gmail.com>
6 SPDX-FileCopyrightText: 2021 Xaver Hugl <xaver.hugl@gmail.com>
7
8 SPDX-License-Identifier: GPL-2.0-or-later
9*/
10#include "drm_virtual_output.h"
11
12#include "drm_backend.h"
13#include "drm_gpu.h"
14#include "drm_layer.h"
15#include "drm_render_backend.h"
17
18namespace KWin
19{
20
21DrmVirtualOutput::DrmVirtualOutput(const QString &name, DrmGpu *gpu, const QSize &size, qreal scale)
23 , m_vsyncMonitor(SoftwareVsyncMonitor::create())
24{
25 connect(m_vsyncMonitor.get(), &VsyncMonitor::vblankOccurred, this, &DrmVirtualOutput::vblank);
26
27 auto mode = std::make_shared<OutputMode>(size, 60000, OutputMode::Flag::Preferred);
28 m_renderLoop->setRefreshRate(mode->refreshRate());
29
31 .name = QStringLiteral("Virtual-") + name,
32 .physicalSize = size,
33 });
34
36 .scale = scale,
37 .modes = {mode},
38 .currentMode = mode,
39 });
40
42}
43
47
48bool DrmVirtualOutput::present(const std::shared_ptr<OutputFrame> &frame)
49{
50 m_frame = frame;
51 m_vsyncMonitor->arm();
52 m_pageFlipPending = true;
53 Q_EMIT outputChange(m_layer->currentDamage());
54 return true;
55}
56
57void DrmVirtualOutput::vblank(std::chrono::nanoseconds timestamp)
58{
59 if (m_pageFlipPending) {
61 }
62}
63
64void DrmVirtualOutput::setDpmsMode(DpmsMode mode)
65{
66 State next = m_state;
67 next.dpmsMode = mode;
68 setState(next);
69}
70
72{
73 return m_layer.get();
74}
75
77{
78 return nullptr;
79}
80
85
86}
87
88#include "moc_drm_virtual_output.cpp"
void pageFlipped(std::chrono::nanoseconds timestamp, PresentationMode mode)
std::shared_ptr< OutputFrame > m_frame
std::unique_ptr< RenderLoop > m_renderLoop
DrmRenderBackend * renderBackend() const
DrmBackend * platform() const
Definition drm_gpu.cpp:585
virtual std::shared_ptr< DrmOutputLayer > createLayer(DrmVirtualOutput *output)=0
DrmVirtualOutput(const QString &name, DrmGpu *gpu, const QSize &size, qreal scale)
bool present(const std::shared_ptr< OutputFrame > &frame) override
DrmOutputLayer * primaryLayer() const override
DrmOutputLayer * cursorLayer() const override
void outputChange(const QRegion &damagedRegion)
qreal scale() const
Definition output.cpp:455
void setInformation(const Information &information)
Definition output.cpp:556
void setState(const State &state)
Definition output.cpp:562
State m_state
Definition output.h:477
QString name
Definition output.h:136
void vblankOccurred(std::chrono::nanoseconds timestamp)
DpmsMode dpmsMode
Definition output.h:455