Hopefully a workaround for crashes and hang ups at closing on Windows.
Release the OpenGL contexts not by a destructor of a static class, but explicitely (predictively).
This commit is contained in:
parent
c6604ff55d
commit
0de566e2a2
@ -48,6 +48,7 @@
|
|||||||
#ifdef SLIC3R_GUI
|
#ifdef SLIC3R_GUI
|
||||||
#include "slic3r/GUI/GUI.hpp"
|
#include "slic3r/GUI/GUI.hpp"
|
||||||
#include "slic3r/GUI/GUI_App.hpp"
|
#include "slic3r/GUI/GUI_App.hpp"
|
||||||
|
#include "slic3r/GUI/3DScene.hpp"
|
||||||
#endif /* SLIC3R_GUI */
|
#endif /* SLIC3R_GUI */
|
||||||
|
|
||||||
using namespace Slic3r;
|
using namespace Slic3r;
|
||||||
@ -505,7 +506,10 @@ int CLI::run(int argc, char **argv)
|
|||||||
if (! m_extra_config.empty())
|
if (! m_extra_config.empty())
|
||||||
gui->mainframe->load_config(m_extra_config);
|
gui->mainframe->load_config(m_extra_config);
|
||||||
});
|
});
|
||||||
return wxEntry(argc, argv);
|
int result = wxEntry(argc, argv);
|
||||||
|
//FIXME this is a workaround for the PrusaSlicer 2.1 release.
|
||||||
|
_3DScene::destroy();
|
||||||
|
return result;
|
||||||
#else /* SLIC3R_GUI */
|
#else /* SLIC3R_GUI */
|
||||||
// No GUI support. Just print out a help.
|
// No GUI support. Just print out a help.
|
||||||
this->print_help(false);
|
this->print_help(false);
|
||||||
|
@ -2007,6 +2007,11 @@ bool _3DScene::init(wxGLCanvas* canvas)
|
|||||||
return s_canvas_mgr.init(canvas);
|
return s_canvas_mgr.init(canvas);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _3DScene::destroy()
|
||||||
|
{
|
||||||
|
s_canvas_mgr.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
GUI::GLCanvas3D* _3DScene::get_canvas(wxGLCanvas* canvas)
|
GUI::GLCanvas3D* _3DScene::get_canvas(wxGLCanvas* canvas)
|
||||||
{
|
{
|
||||||
return s_canvas_mgr.get_canvas(canvas);
|
return s_canvas_mgr.get_canvas(canvas);
|
||||||
|
@ -647,6 +647,7 @@ public:
|
|||||||
static void remove_all_canvases();
|
static void remove_all_canvases();
|
||||||
|
|
||||||
static bool init(wxGLCanvas* canvas);
|
static bool init(wxGLCanvas* canvas);
|
||||||
|
static void destroy();
|
||||||
|
|
||||||
static GUI::GLCanvas3D* get_canvas(wxGLCanvas* canvas);
|
static GUI::GLCanvas3D* get_canvas(wxGLCanvas* canvas);
|
||||||
|
|
||||||
|
@ -197,11 +197,7 @@ GLCanvas3DManager::GLCanvas3DManager()
|
|||||||
|
|
||||||
GLCanvas3DManager::~GLCanvas3DManager()
|
GLCanvas3DManager::~GLCanvas3DManager()
|
||||||
{
|
{
|
||||||
if (m_context != nullptr)
|
this->destroy();
|
||||||
{
|
|
||||||
delete m_context;
|
|
||||||
m_context = nullptr;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GLCanvas3DManager::add(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar)
|
bool GLCanvas3DManager::add(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar)
|
||||||
@ -282,6 +278,15 @@ bool GLCanvas3DManager::init(wxGLCanvas* canvas)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GLCanvas3DManager::destroy()
|
||||||
|
{
|
||||||
|
if (m_context != nullptr)
|
||||||
|
{
|
||||||
|
delete m_context;
|
||||||
|
m_context = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
GLCanvas3D* GLCanvas3DManager::get_canvas(wxGLCanvas* canvas)
|
GLCanvas3D* GLCanvas3DManager::get_canvas(wxGLCanvas* canvas)
|
||||||
{
|
{
|
||||||
CanvasesMap::const_iterator it = do_get_canvas(canvas);
|
CanvasesMap::const_iterator it = do_get_canvas(canvas);
|
||||||
|
@ -91,6 +91,7 @@ public:
|
|||||||
void init_gl();
|
void init_gl();
|
||||||
|
|
||||||
bool init(wxGLCanvas* canvas);
|
bool init(wxGLCanvas* canvas);
|
||||||
|
void destroy();
|
||||||
|
|
||||||
GLCanvas3D* get_canvas(wxGLCanvas* canvas);
|
GLCanvas3D* get_canvas(wxGLCanvas* canvas);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user