KWin
Loading...
Searching...
No Matches
drm_commit.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: 2023 Xaver Hugl <xaver.hugl@gmail.com>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9#pragma once
10
11#include <memory>
12#include <xf86drmMode.h>
13
14#include <QHash>
15#include <chrono>
16#include <unordered_map>
17#include <unordered_set>
18
19#include "core/renderloop.h"
20#include "drm_pointer.h"
21#include "drm_property.h"
22
23namespace KWin
24{
25
26class DrmBlob;
27class DrmConnector;
28class DrmConnectorMode;
29class DrmCrtc;
30class DrmFramebuffer;
31class DrmGpu;
32class DrmPlane;
33class DrmProperty;
34class DrmPipeline;
35
37{
38public:
39 virtual ~DrmCommit();
40
41 DrmGpu *gpu() const;
42 virtual void pageFlipped(std::chrono::nanoseconds timestamp) const = 0;
43
44protected:
46
47 DrmGpu *const m_gpu;
48};
49
51{
52public:
53 DrmAtomicCommit(const QList<DrmPipeline *> &pipelines);
54 DrmAtomicCommit(const DrmAtomicCommit &copy) = default;
55
56 void addProperty(const DrmProperty &prop, uint64_t value);
57 template<typename T>
58 void addEnum(const DrmEnumProperty<T> &prop, T enumValue)
59 {
60 addProperty(prop, prop.valueForEnum(enumValue));
61 }
62 void addBlob(const DrmProperty &prop, const std::shared_ptr<DrmBlob> &blob);
63 void addBuffer(DrmPlane *plane, const std::shared_ptr<DrmFramebuffer> &buffer);
64 void setVrr(DrmCrtc *crtc, bool vrr);
66
67 bool test();
68 bool testAllowModeset();
69 bool commit();
70 bool commitModeset();
71
72 void pageFlipped(std::chrono::nanoseconds timestamp) const override;
73
74 bool areBuffersReadable() const;
75 void setDeadline(std::chrono::steady_clock::time_point deadline);
76 std::optional<bool> isVrr() const;
77 const std::unordered_set<DrmPlane *> &modifiedPlanes() const;
78
79 void merge(DrmAtomicCommit *onTop);
80
81 void setCursorOnly(bool cursor);
82 bool isCursorOnly() const;
83
84private:
85 bool doCommit(uint32_t flags);
86
87 const QList<DrmPipeline *> m_pipelines;
88 std::unordered_map<const DrmProperty *, std::shared_ptr<DrmBlob>> m_blobs;
89 std::unordered_map<DrmPlane *, std::shared_ptr<DrmFramebuffer>> m_buffers;
90 std::unordered_set<DrmPlane *> m_planes;
91 std::optional<bool> m_vrr;
92 std::unordered_map<uint32_t /* object */, std::unordered_map<uint32_t /* property */, uint64_t /* value */>> m_properties;
93 bool m_cursorOnly = false;
94 bool m_modeset = false;
96};
97
99{
100public:
101 DrmLegacyCommit(DrmPipeline *pipeline, const std::shared_ptr<DrmFramebuffer> &buffer);
102
103 bool doModeset(DrmConnector *connector, DrmConnectorMode *mode);
104 bool doPageflip(PresentationMode mode);
105 void pageFlipped(std::chrono::nanoseconds timestamp) const override;
106
107private:
108 DrmPipeline *const m_pipeline;
109 const std::shared_ptr<DrmFramebuffer> m_buffer;
110 bool m_modeset = false;
112};
113
114}
void addEnum(const DrmEnumProperty< T > &prop, T enumValue)
Definition drm_commit.h:58
void setPresentationMode(PresentationMode mode)
const std::unordered_set< DrmPlane * > & modifiedPlanes() const
void addProperty(const DrmProperty &prop, uint64_t value)
void merge(DrmAtomicCommit *onTop)
DrmAtomicCommit(const DrmAtomicCommit &copy)=default
void setVrr(DrmCrtc *crtc, bool vrr)
DrmAtomicCommit(const QList< DrmPipeline * > &pipelines)
bool areBuffersReadable() const
void addBuffer(DrmPlane *plane, const std::shared_ptr< DrmFramebuffer > &buffer)
void addBlob(const DrmProperty &prop, const std::shared_ptr< DrmBlob > &blob)
void setDeadline(std::chrono::steady_clock::time_point deadline)
bool isCursorOnly() const
void setCursorOnly(bool cursor)
std::optional< bool > isVrr() const
void pageFlipped(std::chrono::nanoseconds timestamp) const override
virtual ~DrmCommit()
DrmGpu *const m_gpu
Definition drm_commit.h:47
virtual void pageFlipped(std::chrono::nanoseconds timestamp) const =0
DrmGpu * gpu() const
DrmCommit(DrmGpu *gpu)
uint64_t valueForEnum(Enum enumValue) const
DrmLegacyCommit(DrmPipeline *pipeline, const std::shared_ptr< DrmFramebuffer > &buffer)
void pageFlipped(std::chrono::nanoseconds timestamp) const override
bool doPageflip(PresentationMode mode)
bool doModeset(DrmConnector *connector, DrmConnectorMode *mode)
PresentationMode
Definition globals.h:276