scene: Make ItemRenderer responsible for pushing fbo

It makes more sense for an output layer to return the render target fbo.
The user of the render target will then take appropriate steps to bind
the fbo. It reduces the amount of boilerplate code in output layers too.
This commit is contained in:
Vlad Zahorodnii 2022-12-17 21:04:46 +02:00
parent a0e3a6e54b
commit 8071ade9a8
11 changed files with 21 additions and 26 deletions

View file

@ -96,9 +96,7 @@ std::optional<OutputLayerBeginFrameInfo> EglGbmLayerSurface::startRendering(cons
}
}
GLFramebuffer::pushFramebuffer(m_surface.gbmSurface->fbo());
if (m_shadowBuffer) {
GLFramebuffer::pushFramebuffer(m_shadowBuffer->fbo());
// the blit after rendering will completely overwrite the back buffer anyways
return OutputLayerBeginFrameInfo{
.renderTarget = RenderTarget(m_shadowBuffer->fbo()),
@ -130,11 +128,11 @@ void EglGbmLayerSurface::aboutToStartPainting(DrmOutput *output, const QRegion &
bool EglGbmLayerSurface::endRendering(DrmPlane::Transformations renderOrientation, const QRegion &damagedRegion)
{
if (m_shadowBuffer) {
GLFramebuffer::popFramebuffer();
GLFramebuffer::pushFramebuffer(m_surface.gbmSurface->fbo());
// TODO handle bufferOrientation != Rotate0
m_shadowBuffer->render(renderOrientation);
GLFramebuffer::popFramebuffer();
}
GLFramebuffer::popFramebuffer();
const auto gbmBuffer = m_surface.gbmSurface->swapBuffers(damagedRegion);
if (!gbmBuffer) {
return false;

View file

@ -500,6 +500,9 @@ void DrmOutput::renderCursorOpengl(const RenderTarget &renderTarget, const QSize
QMatrix4x4 mvp;
mvp.ortho(QRect(QPoint(), renderTarget.size()));
GLFramebuffer *fbo = std::get<GLFramebuffer *>(renderTarget.nativeHandle());
GLFramebuffer::pushFramebuffer(fbo);
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);
@ -512,6 +515,8 @@ void DrmOutput::renderCursorOpengl(const RenderTarget &renderTarget, const QSize
m_cursor.texture->render(QRect(0, 0, cursorSize.width(), cursorSize.height()), renderTarget.devicePixelRatio());
m_cursor.texture->unbind();
glDisable(GL_BLEND);
GLFramebuffer::popFramebuffer();
}
void DrmOutput::renderCursorQPainter(const RenderTarget &renderTarget)

View file

@ -69,7 +69,6 @@ std::optional<OutputLayerBeginFrameInfo> VirtualEglGbmLayer::beginFrame()
if (!m_gbmSurface->makeContextCurrent()) {
return std::nullopt;
}
GLFramebuffer::pushFramebuffer(m_gbmSurface->fbo());
return OutputLayerBeginFrameInfo{
.renderTarget = RenderTarget(m_gbmSurface->fbo()),
.repaint = m_gbmSurface->repaintRegion(),
@ -78,7 +77,6 @@ std::optional<OutputLayerBeginFrameInfo> VirtualEglGbmLayer::beginFrame()
bool VirtualEglGbmLayer::endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion)
{
GLFramebuffer::popFramebuffer();
const auto buffer = m_gbmSurface->swapBuffers(damagedRegion);
if (buffer) {
m_currentBuffer = buffer;

View file

@ -48,7 +48,6 @@ std::optional<OutputLayerBeginFrameInfo> VirtualEglLayer::beginFrame()
m_fbo = std::make_unique<GLFramebuffer>(m_texture.get());
}
GLFramebuffer::pushFramebuffer(m_fbo.get());
return OutputLayerBeginFrameInfo{
.renderTarget = RenderTarget(m_fbo.get()),
.repaint = infiniteRegion(),
@ -57,7 +56,6 @@ std::optional<OutputLayerBeginFrameInfo> VirtualEglLayer::beginFrame()
bool VirtualEglLayer::endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion)
{
GLFramebuffer::popFramebuffer();
return true;
}

View file

@ -197,7 +197,6 @@ std::optional<OutputLayerBeginFrameInfo> WaylandEglPrimaryLayer::beginFrame()
repair = m_damageJournal.accumulate(m_buffer->age(), infiniteRegion());
}
GLFramebuffer::pushFramebuffer(m_buffer->framebuffer());
return OutputLayerBeginFrameInfo{
.renderTarget = RenderTarget(m_buffer->framebuffer()),
.repaint = repair,
@ -207,7 +206,6 @@ std::optional<OutputLayerBeginFrameInfo> WaylandEglPrimaryLayer::beginFrame()
bool WaylandEglPrimaryLayer::endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion)
{
m_damageJournal.add(damagedRegion);
GLFramebuffer::popFramebuffer();
return true;
}
@ -279,7 +277,6 @@ std::optional<OutputLayerBeginFrameInfo> WaylandEglCursorLayer::beginFrame()
m_framebuffer = std::make_unique<GLFramebuffer>(m_texture.get());
}
GLFramebuffer::pushFramebuffer(m_framebuffer.get());
return OutputLayerBeginFrameInfo{
.renderTarget = RenderTarget(m_framebuffer.get()),
.repaint = infiniteRegion(),
@ -288,8 +285,6 @@ std::optional<OutputLayerBeginFrameInfo> WaylandEglCursorLayer::beginFrame()
bool WaylandEglCursorLayer::endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion)
{
GLFramebuffer::popFramebuffer();
// Technically, we could pass a linux-dmabuf buffer, but host kwin does not support that atm.
const QImage image = m_texture->toImage().mirrored(false, true);
KWayland::Client::Buffer::Ptr buffer = m_output->backend()->display()->shmPool()->createBuffer(image);

View file

@ -215,6 +215,9 @@ void WaylandOutput::renderCursorOpengl(WaylandEglBackend *backend, const QImage
QMatrix4x4 mvp;
mvp.ortho(QRect(QPoint(), beginInfo->renderTarget.size()));
GLFramebuffer *fbo = std::get<GLFramebuffer *>(beginInfo->renderTarget.nativeHandle());
GLFramebuffer::pushFramebuffer(fbo);
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);
@ -231,6 +234,8 @@ void WaylandOutput::renderCursorOpengl(WaylandEglBackend *backend, const QImage
glDisable(GL_BLEND);
}
GLFramebuffer::popFramebuffer();
cursorLayer->endFrame(infiniteRegion(), infiniteRegion());
}

View file

@ -165,8 +165,6 @@ OutputLayerBeginFrameInfo EglBackend::beginFrame()
eglWaitNative(EGL_CORE_NATIVE_ENGINE);
// Push the default framebuffer to the render target stack.
GLFramebuffer::pushFramebuffer(m_fbo.get());
return OutputLayerBeginFrameInfo{
.renderTarget = RenderTarget(m_fbo.get()),
.repaint = repaint,
@ -199,9 +197,6 @@ void EglBackend::present(Output *output)
}
}
// Pop the default render target from the render target stack.
GLFramebuffer::popFramebuffer();
presentSurface(surface(), effectiveRenderedRegion, workspace()->geometry());
if (overlayWindow() && overlayWindow()->window()) { // show the window only after the first pass,

View file

@ -783,7 +783,6 @@ OutputLayerBeginFrameInfo GlxBackend::beginFrame()
QRegion repaint;
makeCurrent();
GLFramebuffer::pushFramebuffer(m_fbo.get());
if (supportsBufferAge()) {
repaint = m_damageJournal.accumulate(m_bufferAge, infiniteRegion());
}
@ -823,8 +822,6 @@ void GlxBackend::present(Output *output)
effectiveRenderedRegion = displayRect;
}
GLFramebuffer::popFramebuffer();
present(effectiveRenderedRegion);
if (overlayWindow()->window()) { // show the window only after the first pass,

View file

@ -41,7 +41,6 @@ std::optional<OutputLayerBeginFrameInfo> X11WindowedEglPrimaryLayer::beginFrame(
{
eglMakeCurrent(m_backend->eglDisplay(), m_eglSurface, m_eglSurface, m_backend->context());
ensureFbo();
GLFramebuffer::pushFramebuffer(m_fbo.get());
QRegion repaint = m_output->exposedArea() + m_output->rect();
m_output->clearExposedArea();
@ -55,7 +54,6 @@ std::optional<OutputLayerBeginFrameInfo> X11WindowedEglPrimaryLayer::beginFrame(
bool X11WindowedEglPrimaryLayer::endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion)
{
m_lastDamage = damagedRegion;
GLFramebuffer::popFramebuffer();
return true;
}
@ -112,7 +110,6 @@ std::optional<OutputLayerBeginFrameInfo> X11WindowedEglCursorLayer::beginFrame()
m_framebuffer = std::make_unique<GLFramebuffer>(m_texture.get());
}
GLFramebuffer::pushFramebuffer(m_framebuffer.get());
return OutputLayerBeginFrameInfo{
.renderTarget = RenderTarget(m_framebuffer.get()),
.repaint = infiniteRegion(),
@ -121,8 +118,6 @@ std::optional<OutputLayerBeginFrameInfo> X11WindowedEglCursorLayer::beginFrame()
bool X11WindowedEglCursorLayer::endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion)
{
GLFramebuffer::popFramebuffer();
const QImage buffer = m_texture->toImage().mirrored(false, true);
m_output->cursor()->update(buffer, m_hotspot);

View file

@ -315,6 +315,9 @@ void X11WindowedOutput::renderCursorOpengl(X11WindowedEglBackend *backend, const
QMatrix4x4 mvp;
mvp.ortho(QRect(QPoint(), beginInfo->renderTarget.size()));
GLFramebuffer *fbo = std::get<GLFramebuffer *>(beginInfo->renderTarget.nativeHandle());
GLFramebuffer::pushFramebuffer(fbo);
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);
@ -331,6 +334,8 @@ void X11WindowedOutput::renderCursorOpengl(X11WindowedEglBackend *backend, const
glDisable(GL_BLEND);
}
GLFramebuffer::popFramebuffer();
cursorLayer->endFrame(infiniteRegion(), infiniteRegion());
}

View file

@ -20,12 +20,16 @@ ItemRendererOpenGL::ItemRendererOpenGL()
void ItemRendererOpenGL::beginFrame(RenderTarget *renderTarget)
{
GLFramebuffer *fbo = std::get<GLFramebuffer *>(renderTarget->nativeHandle());
GLFramebuffer::pushFramebuffer(fbo);
GLVertexBuffer::streamingBuffer()->beginFrame();
}
void ItemRendererOpenGL::endFrame()
{
GLVertexBuffer::streamingBuffer()->endOfFrame();
GLFramebuffer::popFramebuffer();
}
QVector4D ItemRendererOpenGL::modulate(float opacity, float brightness) const