File indexing completed on 2024-05-05 17:35:39

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