19#include <drm_fourcc.h>
31 if (!doesSwapchainFit()) {
36 m_currentBuffer = m_swapchain->acquire();
37 if (!m_currentBuffer) {
41 m_renderStart = std::chrono::steady_clock::now();
51 m_renderTime = std::chrono::steady_clock::now() - m_renderStart;
53 m_damageJournal.
add(damagedRegion);
54 m_swapchain->release(m_currentBuffer);
55 if (!m_currentFramebuffer) {
56 qCWarning(KWIN_DRM,
"Failed to create dumb framebuffer: %s", strerror(errno));
58 return m_currentFramebuffer !=
nullptr;
63 if (!doesSwapchainFit()) {
65 m_currentBuffer = m_swapchain->acquire();
66 if (m_currentBuffer) {
68 m_swapchain->release(m_currentBuffer);
69 if (!m_currentFramebuffer) {
70 qCWarning(KWIN_DRM,
"Failed to create dumb framebuffer: %s", strerror(errno));
73 m_currentFramebuffer.reset();
76 return m_currentFramebuffer !=
nullptr;
79bool DrmQPainterLayer::doesSwapchainFit()
const
81 return m_swapchain && m_swapchain->size() ==
m_pipeline->
mode()->size();
86 return m_currentFramebuffer;
114 m_currentBuffer = m_swapchain->acquire();
115 if (!m_currentBuffer) {
118 m_renderStart = std::chrono::steady_clock::now();
127 m_renderTime = std::chrono::steady_clock::now() - m_renderStart;
129 m_swapchain->release(m_currentBuffer);
130 if (!m_currentFramebuffer) {
131 qCWarning(KWIN_DRM,
"Failed to create dumb framebuffer for the cursor: %s", strerror(errno));
133 return m_currentFramebuffer !=
nullptr;
143 return m_currentFramebuffer;
168 if (m_image.isNull() || m_image.size() != m_output->
modeSize()) {
169 m_image = QImage(m_output->
modeSize(), QImage::Format_RGB32);
171 m_renderStart = std::chrono::steady_clock::now();
174 .repaint = QRegion(),
180 m_renderTime = std::chrono::steady_clock::now() - m_renderStart;
181 m_currentDamage = damagedRegion;
187 return m_currentDamage;
void add(const QRegion ®ion)
QRegion accumulate(int bufferAge, const QRegion &fallback=QRegion()) const
QRegion lastDamage() const
void releaseBuffers() override
std::shared_ptr< DrmFramebuffer > currentBuffer() const override
std::chrono::nanoseconds queryRenderTime() const override
QRegion currentDamage() const override
bool endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion) override
std::optional< OutputLayerBeginFrameInfo > beginFrame() override
DrmCursorQPainterLayer(DrmPipeline *pipeline)
bool checkTestBuffer() override
std::shared_ptr< DrmFramebuffer > importBuffer(GraphicsBuffer *buffer, FileDescriptor &&explicitFence)
GraphicsBufferAllocator * graphicsBufferAllocator() const
std::shared_ptr< DrmConnectorMode > mode() const
DrmPipeline *const m_pipeline
std::optional< OutputLayerBeginFrameInfo > beginFrame() override
DrmQPainterLayer(DrmPipeline *pipeline)
bool endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion) override
std::chrono::nanoseconds queryRenderTime() const override
bool checkTestBuffer() override
std::shared_ptr< DrmFramebuffer > currentBuffer() const override
QRegion currentDamage() const override
void releaseBuffers() override
std::optional< OutputLayerBeginFrameInfo > beginFrame() override
bool endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion) override
std::chrono::nanoseconds queryRenderTime() const override
void releaseBuffers() override
DrmVirtualQPainterLayer(DrmVirtualOutput *output)
QRegion currentDamage() const override
KWIN_EXPORT QRect infiniteRegion()
RenderTarget renderTarget