]> OCCT Git - occt-copy.git/commitdiff
0032077: Visualization - setting custom default frame buffer object for OpenGl context CR32077
authornds <nds@opencascade.com>
Fri, 22 Jan 2021 14:46:44 +0000 (17:46 +0300)
committernds <nds@opencascade.com>
Fri, 22 Jan 2021 14:47:30 +0000 (17:47 +0300)
src/OpenGl/OpenGl_Context.cxx
src/OpenGl/OpenGl_Context.hxx
src/OpenGl/OpenGl_FrameBuffer.cxx
src/OpenGl/OpenGl_View_Redraw.cxx

index 680f8a5055d9454e89cad4e49447f2ad8b629daf..41820578fb86a90084e10f5189e844e1b3cdef82 100644 (file)
@@ -111,6 +111,29 @@ namespace
   }
 }
 
+static GLuint NoFrameBuffer = 0;
+static GLuint NoRenderBuffer = 0;
+
+GLuint OpenGl_Context::NO_FRAMEBUFFER()
+{
+  return NoFrameBuffer;
+}
+
+GLuint OpenGl_Context::NO_RENDERBUFFER()
+{
+  return NoRenderBuffer;
+}
+
+void OpenGl_Context::SET_NO_FRAMEBUFFER(GLuint val)
+{
+  NoFrameBuffer = val;
+}
+
+void OpenGl_Context::SET_NO_RENDERBUFFER(GLuint val)
+{
+  NoRenderBuffer = val;
+}
+
 // =======================================================================
 // function : OpenGl_Context
 // purpose  :
@@ -453,7 +476,7 @@ void OpenGl_Context::SetReadBuffer (const Standard_Integer theReadBuffer)
   if (myReadBuffer < GL_COLOR_ATTACHMENT0
    && arbFBO != NULL)
   {
-    arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_FrameBuffer::NO_FRAMEBUFFER);
+    arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_Context::NO_FRAMEBUFFER()/*OpenGl_FrameBuffer::NO_FRAMEBUFFER*/);
   }
   ::glReadBuffer (myReadBuffer);
 #else
@@ -472,7 +495,7 @@ void OpenGl_Context::SetDrawBuffer (const Standard_Integer theDrawBuffer)
   if (aDrawBuffer < GL_COLOR_ATTACHMENT0
    && arbFBO != NULL)
   {
-    arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_FrameBuffer::NO_FRAMEBUFFER);
+    arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_Context::NO_FRAMEBUFFER()/*OpenGl_FrameBuffer::NO_FRAMEBUFFER*/);
   }
   ::glDrawBuffer (aDrawBuffer);
 
@@ -512,7 +535,7 @@ void OpenGl_Context::SetDrawBuffers (const Standard_Integer theNb, const Standar
   }
   if (arbFBO != NULL && useDefaultFbo)
   {
-    arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_FrameBuffer::NO_FRAMEBUFFER);
+    arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_Context::NO_FRAMEBUFFER()/*OpenGl_FrameBuffer::NO_FRAMEBUFFER*/);
   }
 
   myFuncs->glDrawBuffers (theNb, (const GLenum*)theDrawBuffers);
index 564593e6f27f3bb9945f1ee1a0e5651b31bef5eb..77b852deefd5a202dd6eb06de90ed8274a13cbe7 100644 (file)
@@ -214,6 +214,12 @@ class OpenGl_Context : public Standard_Transient
   friend class OpenGl_Window;
 public:
 
+  Standard_EXPORT static GLuint NO_FRAMEBUFFER();
+  Standard_EXPORT static GLuint NO_RENDERBUFFER();
+
+  Standard_EXPORT static void SET_NO_FRAMEBUFFER(GLuint val);
+  Standard_EXPORT static void SET_NO_RENDERBUFFER(GLuint val);
+
   typedef NCollection_Shared< NCollection_DataMap<TCollection_AsciiString, Handle(OpenGl_Resource)> > OpenGl_ResourcesMap;
 
   //! Function for getting power of to number larger or equal to input number.
index a05e3216600c61fe4649d167a33f3b1372c024ba..a3ca073e2a5a55d957126e2afc53856187d32f0f 100644 (file)
@@ -71,9 +71,9 @@ OpenGl_FrameBuffer::OpenGl_FrameBuffer()
   myVPSizeY (0),
   myNbSamples (0),
   myDepthFormat (GL_DEPTH24_STENCIL8),
-  myGlFBufferId (NO_FRAMEBUFFER),
-  myGlColorRBufferId (NO_RENDERBUFFER),
-  myGlDepthRBufferId (NO_RENDERBUFFER),
+  myGlFBufferId (OpenGl_Context::NO_FRAMEBUFFER()/*NO_FRAMEBUFFER*/),
+  myGlColorRBufferId (OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/),
+  myGlDepthRBufferId (OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/),
   myIsOwnBuffer  (false),
   myIsOwnDepth  (false),
   myDepthStencilTexture (new OpenGl_Texture())
@@ -339,7 +339,7 @@ Standard_Boolean OpenGl_FrameBuffer::Init (const Handle(OpenGl_Context)& theGlCo
       theGlContext->arbFBO->glGenRenderbuffers (1, &myGlDepthRBufferId);
       theGlContext->arbFBO->glBindRenderbuffer (GL_RENDERBUFFER, myGlDepthRBufferId);
       theGlContext->arbFBO->glRenderbufferStorage (GL_RENDERBUFFER, aDepthStencilFormat, aSizeX, aSizeY);
-      theGlContext->arbFBO->glBindRenderbuffer (GL_RENDERBUFFER, NO_RENDERBUFFER);
+      theGlContext->arbFBO->glBindRenderbuffer (GL_RENDERBUFFER, OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/);
     }
   }
 
@@ -371,7 +371,7 @@ Standard_Boolean OpenGl_FrameBuffer::Init (const Handle(OpenGl_Context)& theGlCo
                                                     myDepthStencilTexture->GetTarget(), myDepthStencilTexture->TextureId(), 0);
     }
   }
-  else if (myGlDepthRBufferId != NO_RENDERBUFFER)
+  else if (myGlDepthRBufferId != OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/)
   {
     if (hasDepthStencilAttach (theGlContext) && hasStencilRB)
     {
@@ -486,7 +486,7 @@ Standard_Boolean OpenGl_FrameBuffer::InitWithRB (const Handle(OpenGl_Context)& t
   const Standard_Integer aSizeY = theSizeY > 0 ? theSizeY : 2;
 
   // Create the render-buffers
-  if (theColorRBufferFromWindow != NO_RENDERBUFFER)
+  if (theColorRBufferFromWindow != OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/)
   {
     myGlColorRBufferId = theColorRBufferFromWindow;
   }
@@ -506,7 +506,7 @@ Standard_Boolean OpenGl_FrameBuffer::InitWithRB (const Handle(OpenGl_Context)& t
     theGlCtx->arbFBO->glGenRenderbuffers (1, &myGlDepthRBufferId);
     theGlCtx->arbFBO->glBindRenderbuffer (GL_RENDERBUFFER, myGlDepthRBufferId);
     theGlCtx->arbFBO->glRenderbufferStorage (GL_RENDERBUFFER, myDepthFormat, aSizeX, aSizeY);
-    theGlCtx->arbFBO->glBindRenderbuffer (GL_RENDERBUFFER, NO_RENDERBUFFER);
+    theGlCtx->arbFBO->glBindRenderbuffer (GL_RENDERBUFFER, OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/);
   }
 
   // create FBO
@@ -514,7 +514,7 @@ Standard_Boolean OpenGl_FrameBuffer::InitWithRB (const Handle(OpenGl_Context)& t
   theGlCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, myGlFBufferId);
   theGlCtx->arbFBO->glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
                                                GL_RENDERBUFFER, myGlColorRBufferId);
-  if (myGlDepthRBufferId != NO_RENDERBUFFER)
+  if (myGlDepthRBufferId != OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/)
   {
     if (hasDepthStencilAttach (theGlCtx) && hasStencilRB)
     {
@@ -558,9 +558,9 @@ Standard_Boolean OpenGl_FrameBuffer::InitWrapper (const Handle(OpenGl_Context)&
   // clean up previous state
   Release (theGlCtx.operator->());
 
-  GLint anFbo = GLint(NO_FRAMEBUFFER);
+  GLint anFbo = GLint(OpenGl_Context::NO_FRAMEBUFFER()/*NO_FRAMEBUFFER*/);
   ::glGetIntegerv (GL_FRAMEBUFFER_BINDING, &anFbo);
-  if (anFbo == GLint(NO_FRAMEBUFFER))
+  if (anFbo == GLint(OpenGl_Context::NO_FRAMEBUFFER()/*NO_FRAMEBUFFER*/))
   {
     return Standard_False;
   }
@@ -606,16 +606,16 @@ Standard_Boolean OpenGl_FrameBuffer::InitWrapper (const Handle(OpenGl_Context)&
   }
 
   // retrieve dimensions
-  GLuint aRBuffer = myGlColorRBufferId != NO_RENDERBUFFER ? myGlColorRBufferId : myGlDepthRBufferId;
-  if (aRBuffer != NO_RENDERBUFFER)
+  GLuint aRBuffer = myGlColorRBufferId != OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/ ? myGlColorRBufferId : myGlDepthRBufferId;
+  if (aRBuffer != OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/)
   {
     theGlCtx->arbFBO->glBindRenderbuffer (GL_RENDERBUFFER, aRBuffer);
     theGlCtx->arbFBO->glGetRenderbufferParameteriv (GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH,  &myVPSizeX);
     theGlCtx->arbFBO->glGetRenderbufferParameteriv (GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &myVPSizeY);
-    theGlCtx->arbFBO->glBindRenderbuffer (GL_RENDERBUFFER, NO_RENDERBUFFER);
+    theGlCtx->arbFBO->glBindRenderbuffer (GL_RENDERBUFFER, OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/);
   }
 
-  return aRBuffer != NO_RENDERBUFFER;
+  return aRBuffer != OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/;
 }
 
 // =======================================================================
@@ -633,18 +633,18 @@ void OpenGl_FrameBuffer::Release (OpenGl_Context* theGlCtx)
      && myIsOwnBuffer)
     {
       theGlCtx->arbFBO->glDeleteFramebuffers (1, &myGlFBufferId);
-      if (myGlColorRBufferId != NO_RENDERBUFFER)
+      if (myGlColorRBufferId != OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/)
       {
         theGlCtx->arbFBO->glDeleteRenderbuffers (1, &myGlColorRBufferId);
       }
-      if (myGlDepthRBufferId != NO_RENDERBUFFER)
+      if (myGlDepthRBufferId != OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/)
       {
         theGlCtx->arbFBO->glDeleteRenderbuffers (1, &myGlDepthRBufferId);
       }
     }
-    myGlFBufferId      = NO_FRAMEBUFFER;
-    myGlColorRBufferId = NO_RENDERBUFFER;
-    myGlDepthRBufferId = NO_RENDERBUFFER;
+    myGlFBufferId      = OpenGl_Context::NO_FRAMEBUFFER()/*NO_FRAMEBUFFER*/;
+    myGlColorRBufferId = OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/;
+    myGlDepthRBufferId = OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/;
     myIsOwnBuffer      = false;
   }
 
@@ -726,7 +726,7 @@ void OpenGl_FrameBuffer::UnbindBuffer (const Handle(OpenGl_Context)& theGlCtx)
   }
   else
   {
-    theGlCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, NO_FRAMEBUFFER);
+    theGlCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_Context::NO_FRAMEBUFFER()/*NO_FRAMEBUFFER*/);
     theGlCtx->SetFrameBufferSRGB (false);
   }
 }
@@ -993,12 +993,12 @@ Standard_Size OpenGl_FrameBuffer::EstimatedDataSize() const
   {
     aSize += myDepthStencilTexture->EstimatedDataSize();
   }
-  if (myGlColorRBufferId != NO_RENDERBUFFER
+  if (myGlColorRBufferId != OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/
   && !myColorFormats.IsEmpty())
   {
     aSize += OpenGl_Texture::PixelSizeOfPixelFormat (myColorFormats.First()) * myInitVPSizeX * myInitVPSizeY;
   }
-  if (myGlDepthRBufferId != NO_RENDERBUFFER)
+  if (myGlDepthRBufferId != OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/)
   {
     aSize += OpenGl_Texture::PixelSizeOfPixelFormat (myDepthFormat) * myInitVPSizeX * myInitVPSizeY;
   }
index 7fd8d7eb1939fc9e3a8868211d44f1511b6801dc..271e1eecb390c56f330660e83c88accc4abac384 100644 (file)
@@ -806,7 +806,7 @@ void OpenGl_View::RedrawImmediate()
 
     if (aCtx->arbFBO != NULL)
     {
-      aCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_FrameBuffer::NO_FRAMEBUFFER);
+      aCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_Context::NO_FRAMEBUFFER()/*OpenGl_FrameBuffer::NO_FRAMEBUFFER*/);
     }
   #if !defined(GL_ES_VERSION_2_0)
     if (anImmFbos[0] == NULL)
@@ -831,7 +831,7 @@ void OpenGl_View::RedrawImmediate()
 
     if (aCtx->arbFBO != NULL)
     {
-      aCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_FrameBuffer::NO_FRAMEBUFFER);
+      aCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_Context::NO_FRAMEBUFFER()/*OpenGl_FrameBuffer::NO_FRAMEBUFFER*/);
     }
   #if !defined(GL_ES_VERSION_2_0)
     if (anImmFbos[1] == NULL)
@@ -1275,7 +1275,7 @@ void OpenGl_View::renderStructs (Graphic3d_Camera::Projection theProjection,
           }
           else
           {
-            aCtx->arbFBO->glBindFramebuffer (GL_DRAW_FRAMEBUFFER, 0);
+            aCtx->arbFBO->glBindFramebuffer (GL_DRAW_FRAMEBUFFER, OpenGl_Context::NO_FRAMEBUFFER());
             aCtx->SetFrameBufferSRGB (false);
           }
 
@@ -1291,7 +1291,7 @@ void OpenGl_View::renderStructs (Graphic3d_Camera::Projection theProjection,
       }
       else
       {
-        aCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, 0);
+        aCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_Context::NO_FRAMEBUFFER());
         aCtx->SetFrameBufferSRGB (false);
       }
 
@@ -1411,7 +1411,7 @@ void OpenGl_View::bindDefaultFbo (OpenGl_FrameBuffer* theCustomFbo)
   #else
     if (aCtx->arbFBO != NULL)
     {
-      aCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_FrameBuffer::NO_FRAMEBUFFER);
+      aCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_Context::NO_FRAMEBUFFER()/*OpenGl_FrameBuffer::NO_FRAMEBUFFER*/);
     }
   #endif
     const Standard_Integer aViewport[4] = { 0, 0, myWindow->Width(), myWindow->Height() };
@@ -1489,7 +1489,7 @@ bool OpenGl_View::blitBuffers (OpenGl_FrameBuffer*    theReadFbo,
   }
   else
   {
-    aCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_FrameBuffer::NO_FRAMEBUFFER);
+    aCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_Context::NO_FRAMEBUFFER()/*OpenGl_FrameBuffer::NO_FRAMEBUFFER*/);
     aCtx->SetFrameBufferSRGB (false);
   }
   const Standard_Integer aViewport[4] = { 0, 0, aDrawSizeX, aDrawSizeY };
@@ -1534,7 +1534,7 @@ bool OpenGl_View::blitBuffers (OpenGl_FrameBuffer*    theReadFbo,
       {
         aCopyMask |= GL_DEPTH_BUFFER_BIT;
       }
-      aCtx->arbFBO->glBindFramebuffer (GL_DRAW_FRAMEBUFFER, OpenGl_FrameBuffer::NO_FRAMEBUFFER);
+      aCtx->arbFBO->glBindFramebuffer (GL_DRAW_FRAMEBUFFER, OpenGl_Context::NO_FRAMEBUFFER()/*OpenGl_FrameBuffer::NO_FRAMEBUFFER*/);
       aCtx->SetFrameBufferSRGB (false);
     }
 
@@ -1575,7 +1575,7 @@ bool OpenGl_View::blitBuffers (OpenGl_FrameBuffer*    theReadFbo,
     }
     else
     {
-      aCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_FrameBuffer::NO_FRAMEBUFFER);
+      aCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_Context::NO_FRAMEBUFFER()/*OpenGl_FrameBuffer::NO_FRAMEBUFFER*/);
       aCtx->SetFrameBufferSRGB (false);
     }
   }