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:
parent
a0e3a6e54b
commit
8071ade9a8
11 changed files with 21 additions and 26 deletions
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue