18#include <drm_fourcc.h>
20#include <xcb/present.h>
37 const QSize bufferSize = m_output->
modeSize();
38 if (!m_swapchain || m_swapchain->size() != bufferSize) {
42 m_current = m_swapchain->acquire();
50 m_renderStart = std::chrono::steady_clock::now();
59 m_renderTime = std::chrono::steady_clock::now() - m_renderStart;
65 xcb_pixmap_t pixmap = m_output->
importBuffer(m_current->buffer());
66 Q_ASSERT(pixmap != XCB_PIXMAP_NONE);
68 xcb_xfixes_region_t valid = 0;
69 xcb_xfixes_region_t update = 0;
72 uint64_t targetMsc = 0;
105 const auto tmp =
size().expandedTo(QSize(64, 64));
106 const QSize bufferSize(std::ceil(tmp.width()), std::ceil(tmp.height()));
107 if (m_buffer.size() != bufferSize) {
108 m_buffer = QImage(bufferSize, QImage::Format_ARGB32_Premultiplied);
111 m_renderStart = std::chrono::steady_clock::now();
125 m_renderTime = std::chrono::steady_clock::now() - m_renderStart;
135 const auto outputs = m_backend->
outputs();
136 for (
Output *output : outputs) {
149void X11WindowedQPainterBackend::addOutput(
Output *output)
152 m_outputs[output] = Layers{
153 .primaryLayer = std::make_unique<X11WindowedQPainterPrimaryLayer>(x11Output,
this),
154 .cursorLayer = std::make_unique<X11WindowedQPainterCursorLayer>(x11Output),
158void X11WindowedQPainterBackend::removeOutput(Output *output)
160 m_outputs.erase(output);
165 return m_allocator.get();
170 m_outputs[output].primaryLayer->present();
176 return m_outputs[output].primaryLayer.get();
181 return m_outputs[output].cursorLayer.get();
186#include "moc_x11_windowed_qpainter_backend.cpp"
void outputAdded(Output *output)
void outputRemoved(Output *output)
xcb_connection_t * connection() const
uint32_t driFormatForDepth(int depth) const
Outputs outputs() const override
void update(const QImage &image, const QPointF &hotspot)
xcb_pixmap_t importBuffer(GraphicsBuffer *buffer)
QRegion exposedArea() const
X11WindowedCursor * cursor() const
X11WindowedBackend * backend() const
xcb_window_t window() const
~X11WindowedQPainterBackend() override
GraphicsBufferAllocator * graphicsBufferAllocator() const override
OutputLayer * cursorLayer(Output *output) override
void present(Output *output, const std::shared_ptr< OutputFrame > &frame) override
OutputLayer * primaryLayer(Output *output) override
X11WindowedQPainterBackend(X11WindowedBackend *backend)
bool endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion) override
std::chrono::nanoseconds queryRenderTime() const override
X11WindowedQPainterCursorLayer(X11WindowedOutput *output)
std::optional< OutputLayerBeginFrameInfo > beginFrame() override
bool endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion) override
std::optional< OutputLayerBeginFrameInfo > beginFrame() override
~X11WindowedQPainterPrimaryLayer() override
X11WindowedQPainterPrimaryLayer(X11WindowedOutput *output, X11WindowedQPainterBackend *backend)
std::chrono::nanoseconds queryRenderTime() const override
KWIN_EXPORT QRect infiniteRegion()
RenderTarget renderTarget