File indexing completed on 2025-03-16 11:20:03
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 <QMap> 0015 #include <QRect> 0016 #include <QVector> 0017 #include <memory> 0018 #include <vector> 0019 0020 class MockGpu; 0021 class MockFb; 0022 class MockCrtc; 0023 class MockEncoder; 0024 class MockObject; 0025 class MockDumbBuffer; 0026 class MockPlane; 0027 0028 class MockProperty { 0029 public: 0030 MockProperty(MockObject *obj, QString name, uint64_t initialValue, uint32_t flags, QVector<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 QVector<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 QVector<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 QVector<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 MockDumbBuffer *cursorBo = nullptr; 0106 std::shared_ptr<MockPlane> legacyPlane; 0107 }; 0108 0109 enum class PlaneType { 0110 Primary, 0111 Overlay, 0112 Cursor 0113 }; 0114 0115 class MockPlane : public MockObject { 0116 public: 0117 MockPlane(MockGpu *gpu, PlaneType type, int crtcIndex); 0118 MockPlane(const MockPlane &obj) = default; 0119 ~MockPlane() = default; 0120 0121 MockFb *currentFb = nullptr; 0122 MockFb *nextFb = nullptr; 0123 int possibleCrtcs; 0124 PlaneType type; 0125 }; 0126 0127 class MockFb { 0128 public: 0129 MockFb(MockGpu *gpu, uint32_t width, uint32_t height); 0130 ~MockFb(); 0131 0132 uint32_t id; 0133 uint32_t width, height; 0134 MockGpu *gpu; 0135 }; 0136 0137 class MockDumbBuffer { 0138 public: 0139 MockDumbBuffer(MockGpu *gpu, uint32_t width, uint32_t height, uint32_t bpp); 0140 0141 uint32_t handle; 0142 uint32_t pitch; 0143 std::vector<std::byte> data; 0144 MockGpu *gpu; 0145 }; 0146 0147 struct Prop { 0148 uint32_t obj; 0149 uint32_t prop; 0150 uint64_t value; 0151 }; 0152 0153 struct _drmModeAtomicReq { 0154 bool legacyEmulation = false; 0155 QVector<Prop> props; 0156 }; 0157 0158 #define MOCKDRM_DEVICE_CAP_ATOMIC 0xFF 0159 0160 class MockGpu { 0161 public: 0162 MockGpu(int fd, int numCrtcs, int gammaSize = 255); 0163 ~MockGpu(); 0164 0165 MockConnector *findConnector(uint32_t id) const; 0166 MockCrtc *findCrtc(uint32_t id) const; 0167 MockPlane *findPlane(uint32_t id) const; 0168 MockPropertyBlob *getBlob(uint32_t id) const; 0169 0170 void flipPage(uint32_t crtcId); 0171 0172 int fd; 0173 QByteArray name = QByteArrayLiteral("mock"); 0174 QMap<uint32_t, uint64_t> clientCaps; 0175 QMap<uint32_t, uint64_t> deviceCaps; 0176 0177 uint32_t idCounter = 1; 0178 QVector<MockObject*> objects; 0179 0180 QVector<std::shared_ptr<MockConnector>> connectors; 0181 QVector<drmModeConnectorPtr> drmConnectors; 0182 0183 QVector<std::shared_ptr<MockEncoder>> encoders; 0184 QVector<drmModeEncoderPtr> drmEncoders; 0185 0186 QVector<std::shared_ptr<MockCrtc>> crtcs; 0187 QVector<drmModeCrtcPtr> drmCrtcs; 0188 0189 QVector<std::shared_ptr<MockPlane>> planes; 0190 QVector<drmModePlanePtr> drmPlanes; 0191 0192 QVector<MockFb*> fbs; 0193 QVector<std::shared_ptr<MockDumbBuffer>> dumbBuffers; 0194 std::vector<std::unique_ptr<MockPropertyBlob>> propertyBlobs; 0195 0196 QVector<drmModeResPtr> resPtrs; 0197 QVector<drmModePropertyPtr> drmProps; 0198 QVector<drmModePropertyBlobPtr> drmPropertyBlobs; 0199 QVector<drmModeObjectPropertiesPtr> drmObjectProperties; 0200 QVector<drmModePlaneResPtr> drmPlaneRes; 0201 }; 0202 0203 0204