Ensure the proper default framebuffer is bound when activating a RenderWindow. Fixes #1471.

This commit is contained in:
binary1248 2018-09-15 21:36:53 +02:00 committed by Lukas Dürrenberger
parent 5e10e1f0c9
commit 8554d210df
2 changed files with 21 additions and 4 deletions

View File

@ -177,6 +177,13 @@ protected:
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
virtual void onResize(); virtual void onResize();
private:
////////////////////////////////////////////////////////////
// Member data
////////////////////////////////////////////////////////////
unsigned int m_defaultFrameBuffer; ///< Framebuffer to bind when targeting this window
}; };
} // namespace sf } // namespace sf

View File

@ -34,14 +34,16 @@
namespace sf namespace sf
{ {
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
RenderWindow::RenderWindow() RenderWindow::RenderWindow() :
m_defaultFrameBuffer(0)
{ {
// Nothing to do // Nothing to do
} }
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
RenderWindow::RenderWindow(VideoMode mode, const String& title, Uint32 style, const ContextSettings& settings) RenderWindow::RenderWindow(VideoMode mode, const String& title, Uint32 style, const ContextSettings& settings) :
m_defaultFrameBuffer(0)
{ {
// Don't call the base class constructor because it contains virtual function calls // Don't call the base class constructor because it contains virtual function calls
create(mode, title, style, settings); create(mode, title, style, settings);
@ -49,7 +51,8 @@ RenderWindow::RenderWindow(VideoMode mode, const String& title, Uint32 style, co
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
RenderWindow::RenderWindow(WindowHandle handle, const ContextSettings& settings) RenderWindow::RenderWindow(WindowHandle handle, const ContextSettings& settings) :
m_defaultFrameBuffer(0)
{ {
// Don't call the base class constructor because it contains virtual function calls // Don't call the base class constructor because it contains virtual function calls
create(handle, settings); create(handle, settings);
@ -83,7 +86,7 @@ bool RenderWindow::setActive(bool active)
// try to draw to the default framebuffer of the RenderWindow // try to draw to the default framebuffer of the RenderWindow
if (active && result && priv::RenderTextureImplFBO::isAvailable()) if (active && result && priv::RenderTextureImplFBO::isAvailable())
{ {
priv::RenderTextureImplFBO::unbind(); glCheck(GLEXT_glBindFramebuffer(GLEXT_GL_FRAMEBUFFER, m_defaultFrameBuffer));
return true; return true;
} }
@ -108,6 +111,13 @@ Image RenderWindow::capture() const
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
void RenderWindow::onCreate() void RenderWindow::onCreate()
{ {
if (priv::RenderTextureImplFBO::isAvailable())
{
// Retrieve the framebuffer ID we have to bind when targeting the window for rendering
// We assume that this window's context is still active at this point
glCheck(glGetIntegerv(GLEXT_GL_FRAMEBUFFER_BINDING, reinterpret_cast<GLint*>(&m_defaultFrameBuffer)));
}
// Just initialize the render target part // Just initialize the render target part
RenderTarget::initialize(); RenderTarget::initialize();
} }