diff --git a/src/backends/drm/drm_backend.cpp b/src/backends/drm/drm_backend.cpp index 60bac6d175..f7aabe4fb4 100644 --- a/src/backends/drm/drm_backend.cpp +++ b/src/backends/drm/drm_backend.cpp @@ -635,20 +635,19 @@ gbm_bo *DrmBackend::createBo(const QSize &size, quint32 format, const QVectorgbmDevice(), size, format, modifiers); } -std::optional DrmBackend::testCreateDmaBuf(const QSize &size, quint32 format, const QVector &modifiers) +std::optional DrmBackend::testCreateDmaBuf(const QSize &size, quint32 format, const QVector &modifiers) { gbm_bo *bo = createBo(size, format, modifiers); if (!bo) { return {}; } - auto ret = dmaBufAttributesForBo(bo); - gbm_bo_destroy(bo); - + auto ret = dmaBufParamsForBo(bo); // We are just testing to know it works and check the modifier, no need to keep the fd - for (int i = 0, c = ret.planeCount; i < c; ++i) { - close(ret.fd[i]); + for (int i = 0, c = gbm_bo_get_plane_count(bo); i < c; ++i) { + close(gbm_bo_get_fd_for_plane(bo, i)); } + gbm_bo_destroy(bo); return ret; } diff --git a/src/backends/drm/drm_backend.h b/src/backends/drm/drm_backend.h index a9d2268fe8..6c46a15e80 100644 --- a/src/backends/drm/drm_backend.h +++ b/src/backends/drm/drm_backend.h @@ -47,7 +47,7 @@ public: QPainterBackend *createQPainterBackend() override; OpenGLBackend *createOpenGLBackend() override; - std::optional testCreateDmaBuf(const QSize &size, quint32 format, const QVector &modifiers) override; + std::optional testCreateDmaBuf(const QSize &size, quint32 format, const QVector &modifiers) override; std::shared_ptr createDmaBufTexture(const QSize &size, quint32 format, const uint64_t modifier) override; Session *session() const override; bool initialize() override; diff --git a/src/backends/drm/gbm_dmabuf.h b/src/backends/drm/gbm_dmabuf.h index 738f9c2c28..953aa53010 100644 --- a/src/backends/drm/gbm_dmabuf.h +++ b/src/backends/drm/gbm_dmabuf.h @@ -55,6 +55,17 @@ inline DmaBufAttributes dmaBufAttributesForBo(gbm_bo *bo) return attributes; } +inline DmaBufParams dmaBufParamsForBo(gbm_bo *bo) +{ + DmaBufParams attributes; + attributes.planeCount = gbm_bo_get_plane_count(bo); + attributes.width = gbm_bo_get_width(bo); + attributes.height = gbm_bo_get_height(bo); + attributes.format = gbm_bo_get_format(bo); + attributes.modifier = gbm_bo_get_modifier(bo); + return attributes; +} + inline gbm_bo *createGbmBo(gbm_device *device, const QSize &size, quint32 format, const QVector &modifiers) { const uint32_t flags = GBM_BO_USE_RENDERING | GBM_BO_USE_LINEAR; diff --git a/src/backends/wayland/wayland_backend.cpp b/src/backends/wayland/wayland_backend.cpp index 83d4c5be78..599dd234c7 100644 --- a/src/backends/wayland/wayland_backend.cpp +++ b/src/backends/wayland/wayland_backend.cpp @@ -1028,20 +1028,19 @@ void WaylandBackend::removeVirtualOutput(Output *output) } } -std::optional WaylandBackend::testCreateDmaBuf(const QSize &size, quint32 format, const QVector &modifiers) +std::optional WaylandBackend::testCreateDmaBuf(const QSize &size, quint32 format, const QVector &modifiers) { gbm_bo *bo = createGbmBo(m_gbmDevice, size, format, modifiers); if (!bo) { return {}; } - auto ret = dmaBufAttributesForBo(bo); - gbm_bo_destroy(bo); - + auto ret = dmaBufParamsForBo(bo); // We are just testing to know it works and check the modifier, no need to keep the fd - for (int i = 0, c = ret.planeCount; i < c; ++i) { - close(ret.fd[i]); + for (int i = 0, c = gbm_bo_get_plane_count(bo); i < c; ++i) { + close(gbm_bo_get_fd_for_plane(bo, i)); } + gbm_bo_destroy(bo); return ret; } diff --git a/src/backends/wayland/wayland_backend.h b/src/backends/wayland/wayland_backend.h index c4d593edc5..20395a6a69 100644 --- a/src/backends/wayland/wayland_backend.h +++ b/src/backends/wayland/wayland_backend.h @@ -303,7 +303,7 @@ public: Output *createVirtualOutput(const QString &name, const QSize &size, double scale) override; void removeVirtualOutput(Output *output) override; - std::optional testCreateDmaBuf(const QSize &size, quint32 format, const QVector &modifiers) override; + std::optional testCreateDmaBuf(const QSize &size, quint32 format, const QVector &modifiers) override; std::shared_ptr createDmaBufTexture(const QSize &size, quint32 format, uint64_t modifier) override; gbm_device *gbmDevice() const diff --git a/src/dmabufattributes.h b/src/dmabufattributes.h index c6717bb8cb..86d4cc876e 100644 --- a/src/dmabufattributes.h +++ b/src/dmabufattributes.h @@ -11,6 +11,15 @@ namespace KWin { +struct DmaBufParams +{ + int planeCount = 0; + int width = 0; + int height = 0; + uint32_t format = 0; + uint64_t modifier = 0; +}; + struct DmaBufAttributes { int planeCount = 0; diff --git a/src/platform.cpp b/src/platform.cpp index 3d13335a3c..37cfa137ca 100644 --- a/src/platform.cpp +++ b/src/platform.cpp @@ -81,7 +81,7 @@ QPainterBackend *Platform::createQPainterBackend() return nullptr; } -std::optional Platform::testCreateDmaBuf(const QSize &size, quint32 format, const QVector &modifiers) +std::optional Platform::testCreateDmaBuf(const QSize &size, quint32 format, const QVector &modifiers) { Q_UNUSED(size) Q_UNUSED(format) @@ -97,7 +97,7 @@ std::shared_ptr Platform::createDmaBufTexture(const QSize &size, return {}; } -std::shared_ptr Platform::createDmaBufTexture(const DmaBufAttributes &attribs) +std::shared_ptr Platform::createDmaBufTexture(const DmaBufParams &attribs) { return createDmaBufTexture({attribs.width, attribs.height}, attribs.format, attribs.modifier); } diff --git a/src/platform.h b/src/platform.h index 27001b7bbd..4641e8e675 100644 --- a/src/platform.h +++ b/src/platform.h @@ -44,7 +44,7 @@ class Scene; class ScreenEdges; class Session; class OutputConfiguration; -struct DmaBufAttributes; +struct DmaBufParams; class KWIN_EXPORT Outputs : public QVector { @@ -69,9 +69,9 @@ public: virtual InputBackend *createInputBackend(); virtual OpenGLBackend *createOpenGLBackend(); virtual QPainterBackend *createQPainterBackend(); - virtual std::optional testCreateDmaBuf(const QSize &size, quint32 format, const QVector &modifiers); + virtual std::optional testCreateDmaBuf(const QSize &size, quint32 format, const QVector &modifiers); virtual std::shared_ptr createDmaBufTexture(const QSize &size, quint32 format, const uint64_t modifier); - std::shared_ptr createDmaBufTexture(const DmaBufAttributes &attributes); + std::shared_ptr createDmaBufTexture(const DmaBufParams &attributes); /** * Allows the platform to create a platform specific screen edge. diff --git a/src/plugins/screencast/screencaststream.cpp b/src/plugins/screencast/screencaststream.cpp index 0e6ca974bb..9167b8ba6b 100644 --- a/src/plugins/screencast/screencaststream.cpp +++ b/src/plugins/screencast/screencaststream.cpp @@ -164,8 +164,8 @@ void ScreenCastStream::onStreamAddBuffer(void *data, pw_buffer *buffer) std::shared_ptr dmabuff; if (spa_data[0].type != SPA_ID_INVALID && spa_data[0].type & (1 << SPA_DATA_DmaBuf)) { - Q_ASSERT(stream->m_attribs); - dmabuff = kwinApp()->platform()->createDmaBufTexture(*stream->m_attribs); + Q_ASSERT(stream->m_params); + dmabuff = kwinApp()->platform()->createDmaBufTexture(*stream->m_params); } if (dmabuff) { @@ -306,9 +306,9 @@ bool ScreenCastStream::createStream() int n_params; const auto format = m_source->hasAlphaChannel() ? SPA_VIDEO_FORMAT_BGRA : SPA_VIDEO_FORMAT_BGR; - m_attribs = kwinApp()->platform()->testCreateDmaBuf(m_resolution, spaVideoFormatToDrmFormat(format), {DRM_FORMAT_MOD_INVALID}); + m_params = kwinApp()->platform()->testCreateDmaBuf(m_resolution, spaVideoFormatToDrmFormat(format), {DRM_FORMAT_MOD_INVALID}); - if (m_attribs) { + if (m_params) { params[0] = buildFormat(&podBuilder, SPA_VIDEO_FORMAT_BGRA, &resolution, &defaultFramerate, &minFramerate, &maxFramerate, &modifier, 1); params[1] = buildFormat(&podBuilder, format, &resolution, &defaultFramerate, &minFramerate, &maxFramerate, nullptr, 0); n_params = 2; diff --git a/src/plugins/screencast/screencaststream.h b/src/plugins/screencast/screencaststream.h index 86f7aeabeb..213b0d1aa2 100644 --- a/src/plugins/screencast/screencaststream.h +++ b/src/plugins/screencast/screencaststream.h @@ -121,7 +121,7 @@ private: EGLNativeFence *m_pendingFence = nullptr; std::optional m_start; quint64 m_sequential = 0; - std::optional m_attribs; + std::optional m_params; }; } // namespace KWin