From acce8dbff6d9959b6ec879a4989c55ae11fa1deb Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 22 Feb 2018 14:44:07 +0100 Subject: [PATCH] A workaround of the dreaded Intel HD Graphics driver issue at least on the laptop of @roesel. fixes https://github.com/prusa3d/Slic3r/issues/672 The Intel HD Graphics hangs on the glFinish() call for some reason with one particular graphics driver revision. Also the glFinish() call was superfluous and it only may have had negative effect over the performance. Both glFinish() and glFlush() were removed for performance reasons where they were not needed, see https://www.khronos.org/opengl/wiki/Common_Mistakes --- lib/Slic3r/GUI/3DScene.pm | 29 +++++++++++----------------- lib/Slic3r/GUI/Plater/2DToolpaths.pm | 2 -- 2 files changed, 11 insertions(+), 20 deletions(-) diff --git a/lib/Slic3r/GUI/3DScene.pm b/lib/Slic3r/GUI/3DScene.pm index b16f7db42..7f2fe4346 100644 --- a/lib/Slic3r/GUI/3DScene.pm +++ b/lib/Slic3r/GUI/3DScene.pm @@ -1172,18 +1172,17 @@ sub Render { glLightfv_p(GL_LIGHT1, GL_POSITION, 1, 0, 1, 0); if ($self->enable_picking) { - # Render the object for picking. - # FIXME This cannot possibly work in a multi-sampled context as the color gets mangled by the anti-aliasing. - # Better to use software ray-casting on a bounding-box hierarchy. - glPushAttrib(GL_ENABLE_BIT); - glDisable(GL_MULTISAMPLE) if ($self->{can_multisample}); - glDisable(GL_LIGHTING); - glDisable(GL_BLEND); - $self->draw_volumes(1); - glFlush(); - glFinish(); - if (my $pos = $self->_mouse_pos) { + # Render the object for picking. + # FIXME This cannot possibly work in a multi-sampled context as the color gets mangled by the anti-aliasing. + # Better to use software ray-casting on a bounding-box hierarchy. + glPushAttrib(GL_ENABLE_BIT); + glDisable(GL_MULTISAMPLE) if ($self->{can_multisample}); + glDisable(GL_LIGHTING); + glDisable(GL_BLEND); + $self->draw_volumes(1); + glPopAttrib(); + glFlush(); my $col = [ glReadPixels_p($pos->x, $self->GetSize->GetHeight - $pos->y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE) ]; my $volume_idx = $col->[0] + $col->[1]*256 + $col->[2]*256*256; $self->_hover_volume_idx(undef); @@ -1199,11 +1198,8 @@ sub Render { $self->on_hover->($volume_idx) if $self->on_hover; } + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glFlush(); - glFinish(); - glPopAttrib(); } # draw fixed background @@ -1337,9 +1333,6 @@ sub Render { $self->draw_active_object_annotations; $self->SwapBuffers(); - - # Calling glFinish has a performance penalty, but it seems to fix some OpenGL driver hang-up with extremely large scenes. -# glFinish(); } sub draw_volumes { diff --git a/lib/Slic3r/GUI/Plater/2DToolpaths.pm b/lib/Slic3r/GUI/Plater/2DToolpaths.pm index e48793bb0..96a252a08 100644 --- a/lib/Slic3r/GUI/Plater/2DToolpaths.pm +++ b/lib/Slic3r/GUI/Plater/2DToolpaths.pm @@ -338,7 +338,6 @@ sub Render { glClear(GL_COLOR_BUFFER_BIT); if (!$self->GetParent->enabled || !$self->layers) { - glFlush(); $self->SwapBuffers; return; } @@ -486,7 +485,6 @@ sub Render { } gluDeleteTess($tess) if $tess; - glFlush(); $self->SwapBuffers; }