Warning, file /plasma/kwin/autotests/drm/mock_drm.h was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002     KWin - the KDE window manager
0003     This file is part of the KDE project.
0004 
0005     SPDX-FileCopyrightText: 2022 Xaver Hugl <xaver.hugl@gmail.com>
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 #pragma once
0010 
0011 #include <xf86drm.h>
0012 #include <xf86drmMode.h>
0013 
0014 #include <QList>
0015 #include <QMap>
0016 #include <QRect>
0017 #include <memory>
0018 #include <mutex>
0019 #include <vector>
0020 
0021 class MockGpu;
0022 class MockFb;
0023 class MockCrtc;
0024 class MockEncoder;
0025 class MockObject;
0026 class MockPlane;
0027 
0028 class MockProperty {
0029 public:
0030     MockProperty(MockObject *obj, QString name, uint64_t initialValue, uint32_t flags, QList<QByteArray> enums = {});
0031     ~MockProperty() = default;
0032 
0033     MockObject *obj;
0034     uint32_t id;
0035     uint32_t flags;
0036     QString name;
0037     uint64_t value;
0038     QList<QByteArray> enums;
0039 };
0040 
0041 class MockPropertyBlob {
0042 public:
0043     MockPropertyBlob(MockGpu *gpu, const void *data, size_t size);
0044     ~MockPropertyBlob();
0045 
0046     MockGpu *gpu;
0047     uint32_t id;
0048     void *data;
0049     size_t size;
0050 };
0051 
0052 class MockObject {
0053 public:
0054     MockObject(MockGpu *gpu);
0055     virtual ~MockObject();
0056 
0057     uint64_t getProp(const QString &propName) const;
0058     void setProp(const QString &propName, uint64_t value);
0059 
0060     uint32_t getPropId(const QString &propName) const;
0061 
0062     uint32_t id;
0063     QList<MockProperty> props;
0064     MockGpu *gpu;
0065 };
0066 
0067 class MockConnector : public MockObject {
0068 public:
0069     MockConnector(MockGpu *gpu, bool nonDesktop = false);
0070     MockConnector(const MockConnector &obj) = default;
0071     ~MockConnector() = default;
0072 
0073     void addMode(uint32_t width, uint32_t height, float refreshRate, bool preferred = false);
0074 
0075     drmModeConnection connection;
0076     uint32_t type;
0077     std::shared_ptr<MockEncoder> encoder;
0078     QList<drmModeModeInfo> modes;
0079 };
0080 
0081 class MockEncoder : public MockObject {
0082 public:
0083     MockEncoder(MockGpu *gpu, uint32_t possible_crtcs);
0084     MockEncoder(const MockEncoder &obj) = default;
0085     ~MockEncoder() = default;
0086 
0087     MockCrtc *crtc = nullptr;
0088     uint32_t possible_crtcs;
0089     uint32_t possible_clones = 0;
0090 };
0091 
0092 class MockCrtc : public MockObject {
0093 public:
0094     MockCrtc(MockGpu *gpu, const std::shared_ptr<MockPlane> &legacyPlane, int pipeIndex, int gamma_size = 255);
0095     MockCrtc(const MockCrtc &obj) = default;
0096     ~MockCrtc() = default;
0097 
0098     int pipeIndex;
0099     int gamma_size;
0100     drmModeModeInfo mode;
0101     bool modeValid = true;
0102     MockFb *currentFb = nullptr;
0103     MockFb *nextFb = nullptr;
0104     QRect cursorRect;
0105     std::shared_ptr<MockPlane> legacyPlane;
0106 };
0107 
0108 enum class PlaneType {
0109     Primary = 0,
0110     Overlay,
0111     Cursor
0112 };
0113 
0114 class MockPlane : public MockObject {
0115 public:
0116     MockPlane(MockGpu *gpu, PlaneType type, int crtcIndex);
0117     MockPlane(const MockPlane &obj) = default;
0118     ~MockPlane() = default;
0119 
0120     MockFb *currentFb = nullptr;
0121     MockFb *nextFb = nullptr;
0122     int possibleCrtcs;
0123     PlaneType type;
0124 };
0125 
0126 class MockFb {
0127 public:
0128     MockFb(MockGpu *gpu, uint32_t width, uint32_t height);
0129     ~MockFb();
0130 
0131     uint32_t id;
0132     uint32_t width, height;
0133     MockGpu *gpu;
0134 };
0135 
0136 struct Prop {
0137     uint32_t obj;
0138     uint32_t prop;
0139     uint64_t value;
0140 };
0141 
0142 struct _drmModeAtomicReq {
0143     bool legacyEmulation = false;
0144     QList<Prop> props;
0145 };
0146 
0147 #define MOCKDRM_DEVICE_CAP_ATOMIC 0xFF
0148 
0149 class MockGpu {
0150 public:
0151     MockGpu(int fd, const QString &devNode, int numCrtcs, int gammaSize = 255);
0152     ~MockGpu();
0153 
0154     MockConnector *findConnector(uint32_t id) const;
0155     MockCrtc *findCrtc(uint32_t id) const;
0156     MockPlane *findPlane(uint32_t id) const;
0157     MockPropertyBlob *getBlob(uint32_t id) const;
0158 
0159     void flipPage(uint32_t crtcId);
0160 
0161     int fd;
0162     QString devNode;
0163     QByteArray name = QByteArrayLiteral("mock");
0164     QMap<uint32_t, uint64_t> clientCaps;
0165     QMap<uint32_t, uint64_t> deviceCaps;
0166 
0167     uint32_t idCounter = 1;
0168     QList<MockObject *> objects;
0169 
0170     QList<std::shared_ptr<MockConnector>> connectors;
0171     QList<drmModeConnectorPtr> drmConnectors;
0172 
0173     QList<std::shared_ptr<MockEncoder>> encoders;
0174     QList<drmModeEncoderPtr> drmEncoders;
0175 
0176     QList<std::shared_ptr<MockCrtc>> crtcs;
0177     QList<drmModeCrtcPtr> drmCrtcs;
0178 
0179     QList<std::shared_ptr<MockPlane>> planes;
0180     QList<drmModePlanePtr> drmPlanes;
0181 
0182     QList<MockFb *> fbs;
0183     std::vector<std::unique_ptr<MockPropertyBlob>> propertyBlobs;
0184 
0185     QList<drmModeResPtr> resPtrs;
0186     QList<drmModePropertyPtr> drmProps;
0187     QList<drmModePropertyBlobPtr> drmPropertyBlobs;
0188     QList<drmModeObjectPropertiesPtr> drmObjectProperties;
0189     QList<drmModePlaneResPtr> drmPlaneRes;
0190     std::mutex m_mutex;
0191 };
0192 
0193 
0194