From 88db009083f046e0eb281f8d755f91c76ea27a5b Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Thu, 19 Sep 2024 08:21:46 +0000 Subject: [PATCH] Handle failing to create a qpainter swapchain slot gracefully If the graphics buffer cannot be mapped, handle it more gracefully by not creating the corresponding slot and yelling about it in the logs. --- .../scenes/qpainter/qpainterswapchain.cpp | 22 +++++++++++++++---- .../scenes/qpainter/qpainterswapchain.h | 4 +++- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/platformsupport/scenes/qpainter/qpainterswapchain.cpp b/src/platformsupport/scenes/qpainter/qpainterswapchain.cpp index a412fa7e0e..cd80f286e5 100644 --- a/src/platformsupport/scenes/qpainter/qpainterswapchain.cpp +++ b/src/platformsupport/scenes/qpainter/qpainterswapchain.cpp @@ -16,9 +16,9 @@ namespace KWin { -QPainterSwapchainSlot::QPainterSwapchainSlot(GraphicsBuffer *buffer) +QPainterSwapchainSlot::QPainterSwapchainSlot(GraphicsBuffer *buffer, std::unique_ptr &&view) : m_buffer(buffer) - , m_view(std::make_unique(buffer, GraphicsBuffer::Read | GraphicsBuffer::Write)) + , m_view(std::move(view)) { } @@ -43,6 +43,16 @@ int QPainterSwapchainSlot::age() const return m_age; } +std::shared_ptr QPainterSwapchainSlot::create(GraphicsBuffer *buffer) +{ + auto view = std::make_unique(buffer, GraphicsBuffer::Read | GraphicsBuffer::Write); + if (view->isNull()) { + buffer->drop(); + return nullptr; + } + return std::make_shared(buffer, std::move(view)); +} + QPainterSwapchain::QPainterSwapchain(GraphicsBufferAllocator *allocator, const QSize &size, uint32_t format) : m_allocator(allocator) , m_size(size) @@ -82,9 +92,13 @@ std::shared_ptr QPainterSwapchain::acquire() return nullptr; } - auto slot = std::make_shared(buffer); - m_slots.append(slot); + auto slot = QPainterSwapchainSlot::create(buffer); + if (!slot) { + qCWarning(KWIN_QPAINTER) << "Failed to create a qpainter swapchain slot"; + return nullptr; + } + m_slots.append(slot); return slot; } diff --git a/src/platformsupport/scenes/qpainter/qpainterswapchain.h b/src/platformsupport/scenes/qpainter/qpainterswapchain.h index 584704769c..339698e402 100644 --- a/src/platformsupport/scenes/qpainter/qpainterswapchain.h +++ b/src/platformsupport/scenes/qpainter/qpainterswapchain.h @@ -28,13 +28,15 @@ class GraphicsBufferView; class KWIN_EXPORT QPainterSwapchainSlot { public: - QPainterSwapchainSlot(GraphicsBuffer *buffer); + QPainterSwapchainSlot(GraphicsBuffer *buffer, std::unique_ptr &&view); ~QPainterSwapchainSlot(); GraphicsBuffer *buffer() const; GraphicsBufferView *view() const; int age() const; + static std::shared_ptr create(GraphicsBuffer *buffer); + private: GraphicsBuffer *m_buffer; std::unique_ptr m_view;