File indexing completed on 2025-02-09 06:36:08
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