diff --git a/src/backends/x11/windowed/egl_x11_backend.cpp b/src/backends/x11/windowed/egl_x11_backend.cpp index 67c9fb5a6f..2f5f75c2f8 100644 --- a/src/backends/x11/windowed/egl_x11_backend.cpp +++ b/src/backends/x11/windowed/egl_x11_backend.cpp @@ -23,7 +23,6 @@ namespace KWin EglX11Output::EglX11Output(EglX11Backend *backend, Output *output, EGLSurface surface) : m_eglSurface(surface) - , m_fbo(new GLFramebuffer(0, output->pixelSize())) , m_output(output) , m_backend(backend) { @@ -34,9 +33,17 @@ EglX11Output::~EglX11Output() eglDestroySurface(m_backend->eglDisplay(), m_eglSurface); } +void EglX11Output::ensureFbo() +{ + if (!m_fbo || m_fbo->size() != m_output->pixelSize()) { + m_fbo.reset(new GLFramebuffer(0, m_output->pixelSize())); + } +} + OutputLayerBeginFrameInfo EglX11Output::beginFrame() { eglMakeCurrent(m_backend->eglDisplay(), m_eglSurface, m_eglSurface, m_backend->context()); + ensureFbo(); GLFramebuffer::pushFramebuffer(m_fbo.data()); return OutputLayerBeginFrameInfo{ .renderTarget = RenderTarget(m_fbo.data()), diff --git a/src/backends/x11/windowed/egl_x11_backend.h b/src/backends/x11/windowed/egl_x11_backend.h index 54f393bdca..f160749fe7 100644 --- a/src/backends/x11/windowed/egl_x11_backend.h +++ b/src/backends/x11/windowed/egl_x11_backend.h @@ -32,6 +32,8 @@ public: QRegion lastDamage() const; private: + void ensureFbo(); + EGLSurface m_eglSurface; QScopedPointer m_fbo; QRegion m_lastDamage; diff --git a/src/backends/x11/windowed/scene_qpainter_x11_backend.cpp b/src/backends/x11/windowed/scene_qpainter_x11_backend.cpp index 6d022506fc..e670e8941d 100644 --- a/src/backends/x11/windowed/scene_qpainter_x11_backend.cpp +++ b/src/backends/x11/windowed/scene_qpainter_x11_backend.cpp @@ -18,14 +18,23 @@ namespace KWin X11WindowedQPainterOutput::X11WindowedQPainterOutput(Output *output, xcb_window_t window) : window(window) - , buffer(output->pixelSize() * output->scale(), QImage::Format_RGB32) , m_output(output) { - buffer.fill(Qt::black); +} + +void X11WindowedQPainterOutput::ensureBuffer() +{ + const QSize nativeSize(m_output->pixelSize() * m_output->scale()); + + if (buffer.size() != nativeSize) { + buffer = QImage(nativeSize, QImage::Format_RGB32); + buffer.fill(Qt::black); + } } OutputLayerBeginFrameInfo X11WindowedQPainterOutput::beginFrame() { + ensureBuffer(); return OutputLayerBeginFrameInfo{ .renderTarget = RenderTarget(&buffer), .repaint = m_output->rect(), diff --git a/src/backends/x11/windowed/scene_qpainter_x11_backend.h b/src/backends/x11/windowed/scene_qpainter_x11_backend.h index 88c2badcc3..76a12cbb20 100644 --- a/src/backends/x11/windowed/scene_qpainter_x11_backend.h +++ b/src/backends/x11/windowed/scene_qpainter_x11_backend.h @@ -29,6 +29,8 @@ class X11WindowedQPainterOutput : public OutputLayer public: X11WindowedQPainterOutput(Output *output, xcb_window_t window); + void ensureBuffer(); + OutputLayerBeginFrameInfo beginFrame() override; void endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion) override; diff --git a/src/backends/x11/windowed/x11windowed_output.cpp b/src/backends/x11/windowed/x11windowed_output.cpp index ceeb1b78de..86394aed28 100644 --- a/src/backends/x11/windowed/x11windowed_output.cpp +++ b/src/backends/x11/windowed/x11windowed_output.cpp @@ -66,9 +66,6 @@ void X11WindowedOutput::init(const QPoint &logicalPosition, const QSize &pixelSi m_renderLoop->setRefreshRate(refreshRate); m_vsyncMonitor->setRefreshRate(refreshRate); - auto mode = QSharedPointer::create(pixelSize, refreshRate); - setModesInternal({mode}, mode); - setGeometry(logicalPosition, pixelSize); setScale(m_backend->initialOutputScale()); @@ -150,8 +147,9 @@ void X11WindowedOutput::initXInputForWindow() void X11WindowedOutput::setGeometry(const QPoint &logicalPosition, const QSize &pixelSize) { - // TODO: set mode to have updated pixelSize - Q_UNUSED(pixelSize); + auto mode = QSharedPointer::create(pixelSize, m_renderLoop->refreshRate()); + setModesInternal({mode}, mode); + moveTo(logicalPosition); }