From 87e7c6710524c04bb7ab57818c7e7393449260a7 Mon Sep 17 00:00:00 2001 From: nds Date: Fri, 22 Jan 2021 17:46:44 +0300 Subject: [PATCH] 0032077: Visualization - setting custom default frame buffer object for OpenGl context --- src/OpenGl/OpenGl_Context.cxx | 29 +++++++++++++++++--- src/OpenGl/OpenGl_Context.hxx | 6 +++++ src/OpenGl/OpenGl_FrameBuffer.cxx | 44 +++++++++++++++---------------- src/OpenGl/OpenGl_View_Redraw.cxx | 16 +++++------ 4 files changed, 62 insertions(+), 33 deletions(-) diff --git a/src/OpenGl/OpenGl_Context.cxx b/src/OpenGl/OpenGl_Context.cxx index 680f8a5055..41820578fb 100644 --- a/src/OpenGl/OpenGl_Context.cxx +++ b/src/OpenGl/OpenGl_Context.cxx @@ -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); diff --git a/src/OpenGl/OpenGl_Context.hxx b/src/OpenGl/OpenGl_Context.hxx index 564593e6f2..77b852deef 100644 --- a/src/OpenGl/OpenGl_Context.hxx +++ b/src/OpenGl/OpenGl_Context.hxx @@ -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 > OpenGl_ResourcesMap; //! Function for getting power of to number larger or equal to input number. diff --git a/src/OpenGl/OpenGl_FrameBuffer.cxx b/src/OpenGl/OpenGl_FrameBuffer.cxx index a05e321660..a3ca073e2a 100644 --- a/src/OpenGl/OpenGl_FrameBuffer.cxx +++ b/src/OpenGl/OpenGl_FrameBuffer.cxx @@ -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; } diff --git a/src/OpenGl/OpenGl_View_Redraw.cxx b/src/OpenGl/OpenGl_View_Redraw.cxx index 7fd8d7eb19..271e1eecb3 100644 --- a/src/OpenGl/OpenGl_View_Redraw.cxx +++ b/src/OpenGl/OpenGl_View_Redraw.cxx @@ -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); } } -- 2.39.5