[plugins/qpa] Call makeCurrent on the QOpenGLContext instead of the one in the platform context

Summary:
SharingPlatformContext::swapBuffers needs to make the context current.
For this is calls makeCurrent. Later on this tries to bind a fbo, which
checks calls into the current QOpenGLContext. As we called makeCurrent on
our own platform context Qt doesn't know that the context is current and
returns in the worst case a nullptr and crashes.

This change calls makeCurrent on the QOpenGLContext so that Qt also knows
that this context is current now. The QOpenGLContext calls makeCurrent on
the platform context, so what our code tried to do is still being done.

In addition the method context() in AbstractPlatformContext is renamed to
eglContext to no longer shadow the method in QPlatformContext.

Reviewers: #kwin, #plasma_on_wayland

Subscribers: plasma-devel, kwin

Tags: #plasma_on_wayland, #kwin

Differential Revision: https://phabricator.kde.org/D2582
This commit is contained in:
Martin Gräßlin 2016-08-26 07:32:34 +02:00
parent 6e8a8913d1
commit 8909f8780b
3 changed files with 4 additions and 4 deletions

View file

@ -53,7 +53,7 @@ protected:
return m_config;
}
bool bindApi();
EGLContext context() const {
EGLContext eglContext() const {
return m_context;
}
void createContext(EGLContext shareContext = EGL_NO_CONTEXT);

View file

@ -44,7 +44,7 @@ bool PlatformContextWayland::makeCurrent(QPlatformSurface *surface)
return false;
}
}
return eglMakeCurrent(eglDisplay(), s, s, context());
return eglMakeCurrent(eglDisplay(), s, s, eglContext());
}
bool PlatformContextWayland::isSharing() const

View file

@ -48,7 +48,7 @@ SharingPlatformContext::SharingPlatformContext(QOpenGLContext *context, Integrat
bool SharingPlatformContext::makeCurrent(QPlatformSurface *surface)
{
Window *window = static_cast<Window*>(surface);
if (eglMakeCurrent(eglDisplay(), m_surface, m_surface, context())) {
if (eglMakeCurrent(eglDisplay(), m_surface, m_surface, eglContext())) {
window->bindContentFBO();
return true;
}
@ -74,7 +74,7 @@ void SharingPlatformContext::swapBuffers(QPlatformSurface *surface)
qCDebug(KWIN_QPA) << "SwapBuffers called but there is no ShellClient";
return;
}
makeCurrent(surface);
context()->makeCurrent(surface->surface());
glFlush();
c->setInternalFramebufferObject(window->swapFBO());
window->bindContentFBO();