KWin
Loading...
Searching...
No Matches
qpainterswapchain.cpp
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2021 Xaver Hugl <xaver.hugl@gmail.com>
6 SPDX-FileCopyrightText: 2023 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
7
8 SPDX-License-Identifier: GPL-2.0-or-later
9*/
10
14#include "utils/common.h"
15
16namespace KWin
17{
18
20 : m_buffer(buffer)
21 , m_view(std::make_unique<GraphicsBufferView>(buffer, GraphicsBuffer::Read | GraphicsBuffer::Write))
22{
23}
24
26{
27 m_view.reset();
28 m_buffer->drop();
29}
30
32{
33 return m_buffer;
34}
35
37{
38 return m_view.get();
39}
40
42{
43 return m_age;
44}
45
47 : m_allocator(allocator)
48 , m_size(size)
49 , m_format(format)
50{
51}
52
56
58{
59 return m_size;
60}
61
63{
64 return m_format;
65}
66
67std::shared_ptr<QPainterSwapchainSlot> QPainterSwapchain::acquire()
68{
69 for (const auto &slot : std::as_const(m_slots)) {
70 if (!slot->buffer()->isReferenced()) {
71 return slot;
72 }
73 }
74
75 GraphicsBuffer *buffer = m_allocator->allocate(GraphicsBufferOptions{
76 .size = m_size,
77 .format = m_format,
78 .software = true,
79 });
80 if (!buffer) {
81 qCWarning(KWIN_QPAINTER) << "Failed to allocate a qpainter swapchain graphics buffer";
82 return nullptr;
83 }
84
85 auto slot = std::make_shared<QPainterSwapchainSlot>(buffer);
86 m_slots.append(slot);
87
88 return slot;
89}
90
91void QPainterSwapchain::release(std::shared_ptr<QPainterSwapchainSlot> slot)
92{
93 for (qsizetype i = 0; i < m_slots.count(); ++i) {
94 if (m_slots[i] == slot) {
95 m_slots[i]->m_age = 1;
96 } else if (m_slots[i]->m_age > 0) {
97 m_slots[i]->m_age++;
98 }
99 }
100}
101
102}
virtual GraphicsBuffer * allocate(const GraphicsBufferOptions &options)=0
std::shared_ptr< QPainterSwapchainSlot > acquire()
void release(std::shared_ptr< QPainterSwapchainSlot > slot)
QPainterSwapchain(GraphicsBufferAllocator *allocator, const QSize &size, uint32_t format)
QPainterSwapchainSlot(GraphicsBuffer *buffer)
GraphicsBuffer * buffer() const
GraphicsBufferView * view() const
GLenum format
Definition gltexture.cpp:49
QSize size
The size of the buffer, in device pixels.