diff --git a/autotests/CMakeLists.txt b/autotests/CMakeLists.txt --- a/autotests/CMakeLists.txt +++ b/autotests/CMakeLists.txt @@ -6,6 +6,9 @@ if (HAVE_INPUT) add_subdirectory(libinput) endif() +if (HAVE_DRM) + add_subdirectory(drm) +endif() add_subdirectory(tabbox) ######################################################## diff --git a/autotests/drm/CMakeLists.txt b/autotests/drm/CMakeLists.txt new file mode 100644 --- /dev/null +++ b/autotests/drm/CMakeLists.txt @@ -0,0 +1,26 @@ +include_directories(${Libdrm_INCLUDE_DIRS}) + +set(mockDRM_SRCS + mock_drm.cpp + ../../plugins/platforms/drm/drm_buffer.cpp + ../../plugins/platforms/drm/drm_object.cpp + ../../plugins/platforms/drm/drm_object_connector.cpp + ../../plugins/platforms/drm/drm_object_plane.cpp + ../../plugins/platforms/drm/logging.cpp +) + +add_library(mockDrm STATIC ${mockDRM_SRCS}) +target_link_libraries(mockDrm Qt5::Gui) +ecm_mark_as_test(mockDrm) + +function(drmTest) + set(oneValueArgs NAME) + set(multiValueArgs SRCS ) + cmake_parse_arguments(ARGS "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + add_executable(${ARGS_NAME} ${ARGS_SRCS}) + target_link_libraries(${ARGS_NAME} mockDrm Qt5::Test) + add_test(kwin-drm-${ARGS_NAME} ${ARGS_NAME}) + ecm_mark_as_test(${ARGS_NAME}) +endfunction() + +drmTest(NAME objecttest SRCS objecttest.cpp) diff --git a/plugins/platforms/drm/drm_object_connector.h b/autotests/drm/mock_drm.h copy from plugins/platforms/drm/drm_object_connector.h copy to autotests/drm/mock_drm.h --- a/plugins/platforms/drm/drm_object_connector.h +++ b/autotests/drm/mock_drm.h @@ -2,7 +2,7 @@ KWin - the KDE window manager This file is part of the KDE project. -Copyright (C) 2016 Roman Gilg +Copyright (C) 2017 Martin Flöser This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,41 +17,16 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . *********************************************************************/ -#ifndef KWIN_DRM_OBJECT_CONNECTOR_H -#define KWIN_DRM_OBJECT_CONNECTOR_H +#pragma once +#include +#include +#include -#include "drm_object.h" +#include -namespace KWin +namespace MockDrm { -class DrmConnector : public DrmObject -{ -public: - DrmConnector(uint32_t connector_id, DrmBackend *backend); - - virtual ~DrmConnector(); - - bool atomicInit(); - - enum class PropertyIndex { - CrtcId = 0, - Count - }; - - QVector encoders() { - return m_encoders; - } - - bool initProps(); - bool isConnected(); - - -private: - QVector m_encoders; -}; +void addDrmModeProperties(int fd, const QVector<_drmModeProperty> &properties); } - -#endif - diff --git a/autotests/drm/mock_drm.cpp b/autotests/drm/mock_drm.cpp new file mode 100644 --- /dev/null +++ b/autotests/drm/mock_drm.cpp @@ -0,0 +1,78 @@ +/******************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright (C) 2017 Martin Flöser + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ +#include "mock_drm.h" + +#include +#include + +static QMap> s_drmProperties{}; + +namespace MockDrm +{ + +void addDrmModeProperties(int fd, const QVector<_drmModeProperty> &properties) +{ + s_drmProperties.insert(fd, properties); +} + +} + +int drmModeAtomicAddProperty(drmModeAtomicReqPtr req, uint32_t object_id, uint32_t property_id, uint64_t value) +{ + Q_UNUSED(req) + Q_UNUSED(object_id) + Q_UNUSED(property_id) + Q_UNUSED(value) + return 0; +} + +drmModePropertyPtr drmModeGetProperty(int fd, uint32_t propertyId) +{ + auto it = s_drmProperties.find(fd); + if (it == s_drmProperties.end()) { + return nullptr; + } + auto it2 = std::find_if(it->constBegin(), it->constEnd(), + [propertyId] (const auto &property) { + return property.prop_id == propertyId; + } + ); + if (it2 == it->constEnd()) { + return nullptr; + } + + auto *property = new _drmModeProperty; + property->prop_id = it2->prop_id; + property->flags = it2->flags; + strcpy(property->name, it2->name); + property->count_values = it2->count_values; + property->values = it2->values; + property->count_enums = it2->count_enums; + property->enums = it2->enums; + property->count_blobs = it2->count_blobs; + property->blob_ids = it2->blob_ids; + + return property; +} + +void drmModeFreeProperty(drmModePropertyPtr ptr) +{ + delete ptr; +} diff --git a/autotests/drm/objecttest.cpp b/autotests/drm/objecttest.cpp new file mode 100644 --- /dev/null +++ b/autotests/drm/objecttest.cpp @@ -0,0 +1,218 @@ +/******************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright (C) 2017 Martin Flöser + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ +#include "mock_drm.h" +#include "../../plugins/platforms/drm/drm_object.h" +#include + +class MockDrmObject : public KWin::DrmObject +{ +public: + MockDrmObject(uint32_t id, int fd) + : DrmObject(id, fd) + { + } + ~MockDrmObject() override {} + bool atomicInit() override; + bool initProps() override; + + void setProperties(uint32_t count, uint32_t *props, uint64_t *values) { + m_count = count; + m_props = props; + m_values = values; + } + + QByteArray name(int prop) const { + auto property = DrmObject::m_props.at(prop); + if (!property) { + return QByteArray(); + } + return property->name(); + } + + uint32_t propertyId(int prop) const { + auto property = DrmObject::m_props.at(prop); + if (!property) { + return 0xFFFFFFFFu; + } + return property->propId(); + } + +private: + uint32_t m_count = 0; + uint32_t *m_props = nullptr; + uint64_t *m_values = nullptr; +}; + +bool MockDrmObject::atomicInit() +{ + return initProps(); +} + +bool MockDrmObject::initProps() +{ + setPropertyNames({"foo", "bar", "baz"}); + drmModeObjectProperties properties{m_count, m_props, m_values}; + for (int i = 0; i < 3; i++) { + initProp(i, &properties); + } + return false; +} + +class ObjectTest : public QObject +{ + Q_OBJECT +private Q_SLOTS: + void testId_data(); + void testId(); + void testFd_data(); + void testFd(); + void testOutput(); + void testInitProperties(); +}; + +void ObjectTest::testId_data() +{ + QTest::addColumn("id"); + + QTest::newRow("0") << 0u; + QTest::newRow("1") << 1u; + QTest::newRow("10") << 10u; + QTest::newRow("uint max") << 0xFFFFFFFFu; +} + +void ObjectTest::testId() +{ + QFETCH(quint32, id); + MockDrmObject object{id, -1}; + QCOMPARE(object.id(), id); +} + +void ObjectTest::testFd_data() +{ + QTest::addColumn("fd"); + + QTest::newRow("-1") << -1; + QTest::newRow("0") << 0; + QTest::newRow("1") << 1; + QTest::newRow("2") << 2; + QTest::newRow("100") << 100; + QTest::newRow("int max") << 0x7FFFFFFF; +} + +void ObjectTest::testFd() +{ + QFETCH(int, fd); + MockDrmObject object{0, fd}; + QCOMPARE(object.fd(), fd); +} + +namespace KWin +{ +struct DrmOutput { + int foo; +}; +} + +void ObjectTest::testOutput() +{ + MockDrmObject object{0, 1}; + + QVERIFY(!object.output()); + + KWin::DrmOutput output{2}; + object.setOutput(&output); + QCOMPARE(object.output(), &output); + QCOMPARE(object.output()->foo, 2); +} + +void ObjectTest::testInitProperties() +{ + MockDrmObject object{0, 20}; + uint32_t propertiesIds[] = { 0, 1, 2, 3}; + uint64_t values[] = { 0, 2, 10, 20 }; + object.setProperties(4, propertiesIds, values); + + MockDrm::addDrmModeProperties(20, QVector<_drmModeProperty>{ + _drmModeProperty{ + 0, + 0, + "foo\0", + 0, + nullptr, + 0, + nullptr, + 0, + nullptr + }, + _drmModeProperty{ + 1, + 0, + "foobar\0", + 0, + nullptr, + 0, + nullptr, + 0, + nullptr + }, + _drmModeProperty{ + 2, + 0, + "baz\0", + 0, + nullptr, + 0, + nullptr, + 0, + nullptr + }, + _drmModeProperty{ + 3, + 0, + "foobarbaz\0", + 0, + nullptr, + 0, + nullptr, + 0, + nullptr + } + }); + + object.atomicInit(); + + // verify the names + QCOMPARE(object.name(0), QByteArrayLiteral("foo")); + QCOMPARE(object.name(1), QByteArray()); + QCOMPARE(object.name(2), QByteArrayLiteral("baz")); + + // verify the property ids + QCOMPARE(object.propertyId(0), 0u); + QCOMPARE(object.propertyId(1), 0xFFFFFFFFu); + QCOMPARE(object.propertyId(2), 2u); + + // doesn't have enums + QCOMPARE(object.propHasEnum(0, 0), false); + QCOMPARE(object.propHasEnum(1, 0), false); + QCOMPARE(object.propHasEnum(2, 0), false); +} + +QTEST_GUILESS_MAIN(ObjectTest) +#include "objecttest.moc" diff --git a/cmake/modules/FindLibdrm.cmake b/cmake/modules/FindLibdrm.cmake --- a/cmake/modules/FindLibdrm.cmake +++ b/cmake/modules/FindLibdrm.cmake @@ -111,7 +111,7 @@ # compatibility variables set(Libdrm_LIBRARIES ${Libdrm_LIBRARY}) - set(Libdrm_INCLUDE_DIRS ${Libdrm_INCLUDE_DIR}) + set(Libdrm_INCLUDE_DIRS ${Libdrm_INCLUDE_DIR} "${Libdrm_INCLUDE_DIR}/libdrm") set(Libdrm_VERSION_STRING ${Libdrm_VERSION}) else() diff --git a/plugins/platforms/drm/drm_backend.cpp b/plugins/platforms/drm/drm_backend.cpp --- a/plugins/platforms/drm/drm_backend.cpp +++ b/plugins/platforms/drm/drm_backend.cpp @@ -274,7 +274,7 @@ // create the plane objects for (unsigned int i = 0; i < planeResources->count_planes; ++i) { drmModePlane *kplane = drmModeGetPlane(m_fd, planeResources->planes[i]); - DrmPlane *p = new DrmPlane(kplane->plane_id, this); + DrmPlane *p = new DrmPlane(kplane->plane_id, m_fd); if (p->atomicInit()) { m_planes << p; if (p->type() == DrmPlane::TypeIndex::Overlay) { @@ -303,7 +303,7 @@ } for (int i = 0; i < res->count_connectors; ++i) { - m_connectors << new DrmConnector(res->connectors[i], this); + m_connectors << new DrmConnector(res->connectors[i], m_fd); } for (int i = 0; i < res->count_crtcs; ++i) { m_crtcs << new DrmCrtc(res->crtcs[i], this, i); @@ -726,14 +726,14 @@ DrmDumbBuffer *DrmBackend::createBuffer(const QSize &size) { - DrmDumbBuffer *b = new DrmDumbBuffer(this, size); + DrmDumbBuffer *b = new DrmDumbBuffer(m_fd, size); return b; } #if HAVE_GBM DrmSurfaceBuffer *DrmBackend::createBuffer(const std::shared_ptr &surface) { - DrmSurfaceBuffer *b = new DrmSurfaceBuffer(this, surface); + DrmSurfaceBuffer *b = new DrmSurfaceBuffer(m_fd, surface); return b; } #endif diff --git a/plugins/platforms/drm/drm_buffer.h b/plugins/platforms/drm/drm_buffer.h --- a/plugins/platforms/drm/drm_buffer.h +++ b/plugins/platforms/drm/drm_buffer.h @@ -26,12 +26,10 @@ namespace KWin { -class DrmBackend; - class DrmBuffer { public: - DrmBuffer(DrmBackend *backend); + DrmBuffer(int fd); virtual ~DrmBuffer() = default; virtual bool needsModeChange(DrmBuffer *b) const {Q_UNUSED(b) return false;} @@ -46,16 +44,20 @@ virtual void releaseGbm() {} + int fd() const { + return m_fd; + } + protected: - DrmBackend *m_backend; quint32 m_bufferId = 0; QSize m_size; + int m_fd; }; class DrmDumbBuffer : public DrmBuffer { public: - DrmDumbBuffer(DrmBackend *backend, const QSize &size); + DrmDumbBuffer(int fd, const QSize &size); ~DrmDumbBuffer(); bool needsModeChange(DrmBuffer *b) const override; diff --git a/plugins/platforms/drm/drm_buffer.cpp b/plugins/platforms/drm/drm_buffer.cpp --- a/plugins/platforms/drm/drm_buffer.cpp +++ b/plugins/platforms/drm/drm_buffer.cpp @@ -18,51 +18,51 @@ along with this program. If not, see . *********************************************************************/ #include "drm_buffer.h" -#include "drm_backend.h" #include "logging.h" // system #include #include // drm #include +#include namespace KWin { -DrmBuffer:: DrmBuffer(DrmBackend *backend) - : m_backend(backend) +DrmBuffer:: DrmBuffer(int fd) + : m_fd(fd) { } // DrmDumbBuffer -DrmDumbBuffer::DrmDumbBuffer(DrmBackend *backend, const QSize &size) - : DrmBuffer(backend) +DrmDumbBuffer::DrmDumbBuffer(int fd, const QSize &size) + : DrmBuffer(fd) { m_size = size; drm_mode_create_dumb createArgs; memset(&createArgs, 0, sizeof createArgs); createArgs.bpp = 32; createArgs.width = size.width(); createArgs.height = size.height(); - if (drmIoctl(m_backend->fd(), DRM_IOCTL_MODE_CREATE_DUMB, &createArgs) != 0) { + if (drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &createArgs) != 0) { qCWarning(KWIN_DRM) << "DRM_IOCTL_MODE_CREATE_DUMB failed"; return; } m_handle = createArgs.handle; m_bufferSize = createArgs.size; m_stride = createArgs.pitch; - if (drmModeAddFB(m_backend->fd(), size.width(), size.height(), 24, 32, + if (drmModeAddFB(fd, size.width(), size.height(), 24, 32, m_stride, createArgs.handle, &m_bufferId) != 0) { qCWarning(KWIN_DRM) << "drmModeAddFB failed with errno" << errno; } } DrmDumbBuffer::~DrmDumbBuffer() { if (m_bufferId) { - drmModeRmFB(m_backend->fd(), m_bufferId); + drmModeRmFB(fd(), m_bufferId); } delete m_image; @@ -72,7 +72,7 @@ if (m_handle) { drm_mode_destroy_dumb destroyArgs; destroyArgs.handle = m_handle; - drmIoctl(m_backend->fd(), DRM_IOCTL_MODE_DESTROY_DUMB, &destroyArgs); + drmIoctl(fd(), DRM_IOCTL_MODE_DESTROY_DUMB, &destroyArgs); } } @@ -92,10 +92,10 @@ drm_mode_map_dumb mapArgs; memset(&mapArgs, 0, sizeof mapArgs); mapArgs.handle = m_handle; - if (drmIoctl(m_backend->fd(), DRM_IOCTL_MODE_MAP_DUMB, &mapArgs) != 0) { + if (drmIoctl(fd(), DRM_IOCTL_MODE_MAP_DUMB, &mapArgs) != 0) { return false; } - void *address = mmap(nullptr, m_bufferSize, PROT_WRITE, MAP_SHARED, m_backend->fd(), mapArgs.offset); + void *address = mmap(nullptr, m_bufferSize, PROT_WRITE, MAP_SHARED, fd(), mapArgs.offset); if (address == MAP_FAILED) { return false; } diff --git a/plugins/platforms/drm/drm_buffer_gbm.h b/plugins/platforms/drm/drm_buffer_gbm.h --- a/plugins/platforms/drm/drm_buffer_gbm.h +++ b/plugins/platforms/drm/drm_buffer_gbm.h @@ -30,13 +30,12 @@ namespace KWin { -class DrmBackend; class GbmSurface; class DrmSurfaceBuffer : public DrmBuffer { public: - DrmSurfaceBuffer(DrmBackend *backend, const std::shared_ptr &surface); + DrmSurfaceBuffer(int fd, const std::shared_ptr &surface); ~DrmSurfaceBuffer(); bool needsModeChange(DrmBuffer *b) const override { diff --git a/plugins/platforms/drm/drm_buffer_gbm.cpp b/plugins/platforms/drm/drm_buffer_gbm.cpp --- a/plugins/platforms/drm/drm_buffer_gbm.cpp +++ b/plugins/platforms/drm/drm_buffer_gbm.cpp @@ -18,7 +18,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . *********************************************************************/ -#include "drm_backend.h" #include "drm_buffer_gbm.h" #include "gbm_surface.h" @@ -29,32 +28,33 @@ #include // drm #include +#include #include namespace KWin { // DrmSurfaceBuffer -DrmSurfaceBuffer::DrmSurfaceBuffer(DrmBackend *backend, const std::shared_ptr &surface) - : DrmBuffer(backend) +DrmSurfaceBuffer::DrmSurfaceBuffer(int fd, const std::shared_ptr &surface) + : DrmBuffer(fd) , m_surface(surface) { m_bo = m_surface->lockFrontBuffer(); if (!m_bo) { qCWarning(KWIN_DRM) << "Locking front buffer failed"; return; } m_size = QSize(gbm_bo_get_width(m_bo), gbm_bo_get_height(m_bo)); - if (drmModeAddFB(m_backend->fd(), m_size.width(), m_size.height(), 24, 32, gbm_bo_get_stride(m_bo), gbm_bo_get_handle(m_bo).u32, &m_bufferId) != 0) { + if (drmModeAddFB(fd, m_size.width(), m_size.height(), 24, 32, gbm_bo_get_stride(m_bo), gbm_bo_get_handle(m_bo).u32, &m_bufferId) != 0) { qCWarning(KWIN_DRM) << "drmModeAddFB failed"; } gbm_bo_set_user_data(m_bo, this, nullptr); } DrmSurfaceBuffer::~DrmSurfaceBuffer() { if (m_bufferId) { - drmModeRmFB(m_backend->fd(), m_bufferId); + drmModeRmFB(fd(), m_bufferId); } releaseGbm(); } diff --git a/plugins/platforms/drm/drm_object.h b/plugins/platforms/drm/drm_object.h --- a/plugins/platforms/drm/drm_object.h +++ b/plugins/platforms/drm/drm_object.h @@ -37,9 +37,9 @@ { public: // creates drm object by its id delivered by the kernel - DrmObject(uint32_t object_id, DrmBackend *backend); + DrmObject(uint32_t object_id, int fd); - virtual ~DrmObject() = 0; + virtual ~DrmObject(); virtual bool atomicInit() = 0; @@ -68,6 +68,10 @@ } } + int fd() const { + return m_fd; + } + virtual bool atomicPopulate(drmModeAtomicReq *req); protected: @@ -77,8 +81,8 @@ class Property; bool atomicAddProperty(drmModeAtomicReq *req, Property *property); - DrmBackend *m_backend; - const uint32_t m_id = 0; + int m_fd; + const uint32_t m_id; DrmOutput *m_output = nullptr; // for comparision with received name of DRM object diff --git a/plugins/platforms/drm/drm_object.cpp b/plugins/platforms/drm/drm_object.cpp --- a/plugins/platforms/drm/drm_object.cpp +++ b/plugins/platforms/drm/drm_object.cpp @@ -19,7 +19,6 @@ *********************************************************************/ #include "drm_object.h" -#include "drm_backend.h" #include "logging.h" namespace KWin @@ -29,8 +28,8 @@ * Defintions for class DrmObject */ -DrmObject::DrmObject(uint32_t object_id, DrmBackend *backend) - : m_backend(backend) +DrmObject::DrmObject(uint32_t object_id, int fd) + : m_fd(fd) , m_id(object_id) { } @@ -50,7 +49,7 @@ void DrmObject::initProp(int n, drmModeObjectProperties *properties, QVector enumNames) { for (unsigned int i = 0; i < properties->count_props; ++i) { - drmModePropertyRes *prop = drmModeGetProperty(m_backend->fd(), properties->props[i]); + drmModePropertyRes *prop = drmModeGetProperty(fd(), properties->props[i]); if (!prop) { continue; } diff --git a/plugins/platforms/drm/drm_object_connector.h b/plugins/platforms/drm/drm_object_connector.h --- a/plugins/platforms/drm/drm_object_connector.h +++ b/plugins/platforms/drm/drm_object_connector.h @@ -28,7 +28,7 @@ class DrmConnector : public DrmObject { public: - DrmConnector(uint32_t connector_id, DrmBackend *backend); + DrmConnector(uint32_t connector_id, int fd); virtual ~DrmConnector(); diff --git a/plugins/platforms/drm/drm_object_connector.cpp b/plugins/platforms/drm/drm_object_connector.cpp --- a/plugins/platforms/drm/drm_object_connector.cpp +++ b/plugins/platforms/drm/drm_object_connector.cpp @@ -18,17 +18,16 @@ along with this program. If not, see . *********************************************************************/ #include "drm_object_connector.h" -#include "drm_backend.h" #include "drm_pointer.h" #include "logging.h" namespace KWin { -DrmConnector::DrmConnector(uint32_t connector_id, DrmBackend *backend) - : DrmObject(connector_id, backend) +DrmConnector::DrmConnector(uint32_t connector_id, int fd) + : DrmObject(connector_id, fd) { - ScopedDrmPointer<_drmModeConnector, &drmModeFreeConnector> con(drmModeGetConnector(backend->fd(), connector_id)); + ScopedDrmPointer<_drmModeConnector, &drmModeFreeConnector> con(drmModeGetConnector(fd, connector_id)); if (!con) { return; } @@ -55,7 +54,7 @@ QByteArrayLiteral("CRTC_ID"), }); - drmModeObjectProperties *properties = drmModeObjectGetProperties(m_backend->fd(), m_id, DRM_MODE_OBJECT_CONNECTOR); + drmModeObjectProperties *properties = drmModeObjectGetProperties(fd(), m_id, DRM_MODE_OBJECT_CONNECTOR); if (!properties) { qCWarning(KWIN_DRM) << "Failed to get properties for connector " << m_id ; return false; @@ -71,7 +70,7 @@ bool DrmConnector::isConnected() { - ScopedDrmPointer<_drmModeConnector, &drmModeFreeConnector> con(drmModeGetConnector(m_backend->fd(), m_id)); + ScopedDrmPointer<_drmModeConnector, &drmModeFreeConnector> con(drmModeGetConnector(fd(), m_id)); if (!con) { return false; } diff --git a/plugins/platforms/drm/drm_object_crtc.h b/plugins/platforms/drm/drm_object_crtc.h --- a/plugins/platforms/drm/drm_object_crtc.h +++ b/plugins/platforms/drm/drm_object_crtc.h @@ -69,6 +69,7 @@ DrmBuffer *m_currentBuffer = nullptr; DrmBuffer *m_nextBuffer = nullptr; DrmDumbBuffer *m_blackBuffer = nullptr; + DrmBackend *m_backend; }; } diff --git a/plugins/platforms/drm/drm_object_crtc.cpp b/plugins/platforms/drm/drm_object_crtc.cpp --- a/plugins/platforms/drm/drm_object_crtc.cpp +++ b/plugins/platforms/drm/drm_object_crtc.cpp @@ -27,8 +27,9 @@ { DrmCrtc::DrmCrtc(uint32_t crtc_id, DrmBackend *backend, int resIndex) - : DrmObject(crtc_id, backend), - m_resIndex(resIndex) + : DrmObject(crtc_id, backend->fd()), + m_resIndex(resIndex), + m_backend(backend) { } @@ -53,7 +54,7 @@ QByteArrayLiteral("ACTIVE"), }); - drmModeObjectProperties *properties = drmModeObjectGetProperties(m_backend->fd(), m_id, DRM_MODE_OBJECT_CRTC); + drmModeObjectProperties *properties = drmModeObjectGetProperties(fd(), m_id, DRM_MODE_OBJECT_CRTC); if (!properties) { qCWarning(KWIN_DRM) << "Failed to get properties for crtc " << m_id ; return false; diff --git a/plugins/platforms/drm/drm_object_plane.h b/plugins/platforms/drm/drm_object_plane.h --- a/plugins/platforms/drm/drm_object_plane.h +++ b/plugins/platforms/drm/drm_object_plane.h @@ -32,7 +32,7 @@ class DrmPlane : public DrmObject { public: - DrmPlane(uint32_t plane_id, DrmBackend *backend); + DrmPlane(uint32_t plane_id, int fd); ~DrmPlane(); diff --git a/plugins/platforms/drm/drm_object_plane.cpp b/plugins/platforms/drm/drm_object_plane.cpp --- a/plugins/platforms/drm/drm_object_plane.cpp +++ b/plugins/platforms/drm/drm_object_plane.cpp @@ -18,16 +18,15 @@ along with this program. If not, see . *********************************************************************/ #include "drm_object_plane.h" -#include "drm_backend.h" #include "drm_buffer.h" #include "drm_pointer.h" #include "logging.h" namespace KWin { -DrmPlane::DrmPlane(uint32_t plane_id, DrmBackend *backend) - : DrmObject(plane_id, backend) +DrmPlane::DrmPlane(uint32_t plane_id, int fd) + : DrmObject(plane_id, fd) { } @@ -40,7 +39,7 @@ bool DrmPlane::atomicInit() { qCDebug(KWIN_DRM) << "Atomic init for plane:" << m_id; - ScopedDrmPointer<_drmModePlane, &drmModeFreePlane> p(drmModeGetPlane(m_backend->fd(), m_id)); + ScopedDrmPointer<_drmModePlane, &drmModeFreePlane> p(drmModeGetPlane(fd(), m_id)); if (!p) { qCWarning(KWIN_DRM) << "Failed to get kernel plane" << m_id; @@ -93,7 +92,7 @@ QByteArrayLiteral("reflect-y") }; - drmModeObjectProperties *properties = drmModeObjectGetProperties(m_backend->fd(), m_id, DRM_MODE_OBJECT_PLANE); + drmModeObjectProperties *properties = drmModeObjectGetProperties(fd(), m_id, DRM_MODE_OBJECT_PLANE); if (!properties){ qCWarning(KWIN_DRM) << "Failed to get properties for plane " << m_id ; return false;