backends/x11: Support resizing the windowed output

In response to a XCB_CONFIGURE_NOTIFY on the output window, the new size
is set as mode and the output layer buffer is recreated.

Signed-off-by: Victoria Fischer <victoria.fischer@mbition.io>
Part-of: <https://invent.kde.org/plasma/kwin/-/merge_requests/2459>
This commit is contained in:
Kai Uwe Broulik 2022-05-24 17:18:36 +02:00 committed by Merge Service
parent 486d229cae
commit b062d09fdc
5 changed files with 26 additions and 8 deletions

View file

@ -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()),

View file

@ -32,6 +32,8 @@ public:
QRegion lastDamage() const;
private:
void ensureFbo();
EGLSurface m_eglSurface;
QScopedPointer<GLFramebuffer> m_fbo;
QRegion m_lastDamage;

View file

@ -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(),

View file

@ -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;

View file

@ -66,9 +66,6 @@ void X11WindowedOutput::init(const QPoint &logicalPosition, const QSize &pixelSi
m_renderLoop->setRefreshRate(refreshRate);
m_vsyncMonitor->setRefreshRate(refreshRate);
auto mode = QSharedPointer<OutputMode>::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<OutputMode>::create(pixelSize, m_renderLoop->refreshRate());
setModesInternal({mode}, mode);
moveTo(logicalPosition);
}