kwin/src/backends/drm/drm_object_plane.h
Xaver Hugl 7283c98f27 platforms/drm: disable unused resources on modesets
When we switch CRTCs it can happen that a CRTC would stay enabled yet has
no connectors anymore. In this case the kernel may reject our atomic commit,
which would cause the modeset to fail. To counteract that, properly disable
unused drm objects
2021-11-09 22:15:31 +01:00

99 lines
2.2 KiB
C++

/*
KWin - the KDE window manager
This file is part of the KDE project.
SPDX-FileCopyrightText: 2016 Roman Gilg <subdiff@gmail.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#pragma once
#include "drm_object.h"
#include <qobjectdefs.h>
#include <QSharedPointer>
#include <QMap>
namespace KWin
{
class DrmBuffer;
class DrmCrtc;
class DrmPlane : public DrmObject
{
Q_GADGET
public:
DrmPlane(DrmGpu *gpu, uint32_t planeId);
enum class PropertyIndex : uint32_t {
Type = 0,
SrcX,
SrcY,
SrcW,
SrcH,
CrtcX,
CrtcY,
CrtcW,
CrtcH,
FbId,
CrtcId,
Rotation,
In_Formats,
Count
};
Q_ENUM(PropertyIndex)
enum class TypeIndex : uint32_t {
Overlay = 0,
Primary,
Cursor,
Count
};
Q_ENUM(TypeIndex)
enum class Transformation : uint32_t {
Rotate0 = 1 << 0,
Rotate90 = 1 << 1,
Rotate180 = 1 << 2,
Rotate270 = 1 << 3,
ReflectX = 1 << 4,
ReflectY = 1 << 5
};
Q_ENUM(Transformation)
Q_DECLARE_FLAGS(Transformations, Transformation);
bool init() override;
bool needsModeset() const override;
void disable() override;
TypeIndex type();
bool isCrtcSupported(int pipeIndex) const;
QMap<uint32_t, QVector<uint64_t>> formats() const;
QSharedPointer<DrmBuffer> current() const;
QSharedPointer<DrmBuffer> next() const;
void setCurrent(const QSharedPointer<DrmBuffer> &b);
void setNext(const QSharedPointer<DrmBuffer> &b);
void flipBuffer();
void setBuffer(DrmBuffer *buffer);
void set(const QPoint &srcPos, const QSize &srcSize, const QPoint &dstPos, const QSize &dstSize);
bool setTransformation(Transformations t);
Transformations transformation();
Transformations supportedTransformations() const;
private:
QSharedPointer<DrmBuffer> m_current;
QSharedPointer<DrmBuffer> m_next;
QMap<uint32_t, QVector<uint64_t>> m_supportedFormats;
uint32_t m_possibleCrtcs;
Transformations m_supportedTransformations = Transformation::Rotate0;
};
}
Q_DECLARE_OPERATORS_FOR_FLAGS(KWin::DrmPlane::Transformations)