KWin
Loading...
Searching...
No Matches
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
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9#include "virtual_output.h"
10#include "virtual_backend.h"
11
12#include "compositor.h"
13#include "core/outputlayer.h"
14#include "core/renderbackend.h"
15#include "core/renderloop.h"
17
18namespace KWin
19{
20
22 : Output(parent)
23 , m_backend(parent)
24 , m_renderLoop(std::make_unique<RenderLoop>(this))
25 , m_vsyncMonitor(SoftwareVsyncMonitor::create())
26{
27 connect(m_vsyncMonitor.get(), &VsyncMonitor::vblankOccurred, this, &VirtualOutput::vblank);
28
29 static int identifier = -1;
30 m_identifier = ++identifier;
32 .name = QStringLiteral("Virtual-%1").arg(identifier),
33 .internal = internal,
34 });
35}
36
40
42{
43 return m_renderLoop.get();
44}
45
46void VirtualOutput::present(const std::shared_ptr<OutputFrame> &frame)
47{
48 m_frame = frame;
49 m_vsyncMonitor->arm();
50}
51
52void VirtualOutput::init(const QPoint &logicalPosition, const QSize &pixelSize, qreal scale)
53{
54 const int refreshRate = 60000; // TODO: Make the refresh rate configurable.
55 m_renderLoop->setRefreshRate(refreshRate);
56 m_vsyncMonitor->setRefreshRate(refreshRate);
57
58 auto mode = std::make_shared<OutputMode>(pixelSize, m_vsyncMonitor->refreshRate());
59
61 .position = logicalPosition,
62 .scale = scale,
63 .modes = {mode},
64 .currentMode = mode,
65 });
66}
67
69{
70 State next = m_state;
71 next.enabled = enabled;
72 setState(next);
73}
74
75void VirtualOutput::vblank(std::chrono::nanoseconds timestamp)
76{
77 const auto primaryLayer = Compositor::self()->backend()->primaryLayer(this);
78 m_frame->presented(std::chrono::nanoseconds(1'000'000'000'000 / refreshRate()), timestamp, primaryLayer->queryRenderTime(), PresentationMode::VSync);
79 m_frame.reset();
80}
81
82}
83
84#include "moc_virtual_output.cpp"
RenderBackend * backend() const
Definition compositor.h:68
static Compositor * self()
qreal scale() const
Definition output.cpp:455
uint32_t refreshRate() const
Definition output.cpp:475
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
QSize pixelSize() const
Definition output.cpp:485
virtual OutputLayer * primaryLayer(Output *output)=0
VirtualOutput(VirtualBackend *parent, bool internal)
void updateEnabled(bool enabled)
void present(const std::shared_ptr< OutputFrame > &frame)
RenderLoop * renderLoop() const override
void init(const QPoint &logicalPosition, const QSize &pixelSize, qreal scale)
void vblankOccurred(std::chrono::nanoseconds timestamp)