0023428: Extend OpenGl_Context to use Geometry Shaders extension
[occt.git] / src / OpenGl / OpenGl_Workspace_4.cxx
index 2709558..0eecbcc 100644 (file)
@@ -1,7 +1,22 @@
-// File:      OpenGl_Workspace_3.cxx
-// Created:   20 September 2011
-// Author:    Sergey ZERCHANINOV
-// Copyright: OPEN CASCADE 2011
+// Created on: 2011-09-20
+// Created by: Sergey ZERCHANINOV
+// Copyright (c) 2011-2012 OPEN CASCADE SAS
+//
+// The content of this file is subject to the Open CASCADE Technology Public
+// License Version 6.5 (the "License"). You may not use the content of this file
+// except in compliance with the License. Please obtain a copy of the License
+// at http://www.opencascade.org and read it completely before using this file.
+//
+// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
+// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
+//
+// The Original Code and all software distributed under the License is
+// distributed on an "AS IS" basis, without warranty of any kind, and the
+// Initial Developer hereby disclaims all such warranties, including without
+// limitation, any warranties of merchantability, fitness for a particular
+// purpose or non-infringement. Please see the License for the specific terms
+// and conditions governing the rights and limitations under the License.
+
 
 #include <OpenGl_GlCore11.hxx>
 
@@ -10,7 +25,6 @@
 #endif
 
 #include <OpenGl_FrameBuffer.hxx>
-#include <OpenGl_ResourceCleaner.hxx>
 #include <InterfaceGraphic_Graphic3d.hxx>
 #include <InterfaceGraphic_Visual3d.hxx>
 
@@ -25,16 +39,22 @@ void OpenGl_Workspace::Redraw (const Graphic3d_CView& theCView,
     return;
 
   // release pending GL resources
-  OpenGl_ResourceCleaner::GetInstance()->Cleanup (GetGlContext());
+  Handle(OpenGl_Context) aGlCtx = GetGlContext();
+  aGlCtx->ReleaseDelayed();
+
+  // cache render mode state
+  GLint aRendMode = GL_RENDER;
+  glGetIntegerv (GL_RENDER_MODE, &aRendMode);
+  aGlCtx->SetFeedback (aRendMode == GL_FEEDBACK);
 
-  Tint toSwap = 1; // swap buffers
+  Tint toSwap = (aRendMode == GL_RENDER); // swap buffers
   GLint aViewPortBack[4];
   OpenGl_FrameBuffer* aFrameBuffer = (OpenGl_FrameBuffer* )theCView.ptrFBO;
   if (aFrameBuffer != NULL)
   {
     glGetIntegerv (GL_VIEWPORT, aViewPortBack);
     aFrameBuffer->SetupViewport();
-    aFrameBuffer->BindBuffer (GetGlContext());
+    aFrameBuffer->BindBuffer (aGlCtx);
     toSwap = 0; // no need to swap buffers
   }
 
@@ -43,7 +63,7 @@ void OpenGl_Workspace::Redraw (const Graphic3d_CView& theCView,
 
   if (aFrameBuffer != NULL)
   {
-    aFrameBuffer->UnbindBuffer (GetGlContext());
+    aFrameBuffer->UnbindBuffer (aGlCtx);
     // move back original viewport
     glViewport (aViewPortBack[0], aViewPortBack[1], aViewPortBack[2], aViewPortBack[3]);
   }
@@ -65,4 +85,7 @@ void OpenGl_Workspace::Redraw (const Graphic3d_CView& theCView,
     delete[] aDumpData;
   }
 #endif
+
+  // reset render mode state
+  aGlCtx->SetFeedback (Standard_False);
 }