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.
wilder/Plasma/6.3
Vlad Zahorodnii 2 years ago
parent 1ffc72ef8d
commit 88db009083
  1. 22
      src/platformsupport/scenes/qpainter/qpainterswapchain.cpp
  2. 4
      src/platformsupport/scenes/qpainter/qpainterswapchain.h

@ -16,9 +16,9 @@
namespace KWin
{
QPainterSwapchainSlot::QPainterSwapchainSlot(GraphicsBuffer *buffer)
QPainterSwapchainSlot::QPainterSwapchainSlot(GraphicsBuffer *buffer, std::unique_ptr<GraphicsBufferView> &&view)
: m_buffer(buffer)
, m_view(std::make_unique<GraphicsBufferView>(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> QPainterSwapchainSlot::create(GraphicsBuffer *buffer)
{
auto view = std::make_unique<GraphicsBufferView>(buffer, GraphicsBuffer::Read | GraphicsBuffer::Write);
if (view->isNull()) {
buffer->drop();
return nullptr;
}
return std::make_shared<QPainterSwapchainSlot>(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<QPainterSwapchainSlot> QPainterSwapchain::acquire()
return nullptr;
}
auto slot = std::make_shared<QPainterSwapchainSlot>(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;
}

@ -28,13 +28,15 @@ class GraphicsBufferView;
class KWIN_EXPORT QPainterSwapchainSlot
{
public:
QPainterSwapchainSlot(GraphicsBuffer *buffer);
QPainterSwapchainSlot(GraphicsBuffer *buffer, std::unique_ptr<GraphicsBufferView> &&view);
~QPainterSwapchainSlot();
GraphicsBuffer *buffer() const;
GraphicsBufferView *view() const;
int age() const;
static std::shared_ptr<QPainterSwapchainSlot> create(GraphicsBuffer *buffer);
private:
GraphicsBuffer *m_buffer;
std::unique_ptr<GraphicsBufferView> m_view;

Loading…
Cancel
Save