1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-09-08 14:17:06 +03:00

0032077: Visualization - setting custom default frame buffer object for OpenGl context

This commit is contained in:
nds
2021-01-22 17:46:44 +03:00
parent 4fd4c96c2f
commit 87e7c67105
4 changed files with 62 additions and 33 deletions

View 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 // function : OpenGl_Context
// purpose : // purpose :
@@ -453,7 +476,7 @@ void OpenGl_Context::SetReadBuffer (const Standard_Integer theReadBuffer)
if (myReadBuffer < GL_COLOR_ATTACHMENT0 if (myReadBuffer < GL_COLOR_ATTACHMENT0
&& arbFBO != NULL) && arbFBO != NULL)
{ {
arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_FrameBuffer::NO_FRAMEBUFFER); arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_Context::NO_FRAMEBUFFER()/*OpenGl_FrameBuffer::NO_FRAMEBUFFER*/);
} }
::glReadBuffer (myReadBuffer); ::glReadBuffer (myReadBuffer);
#else #else
@@ -472,7 +495,7 @@ void OpenGl_Context::SetDrawBuffer (const Standard_Integer theDrawBuffer)
if (aDrawBuffer < GL_COLOR_ATTACHMENT0 if (aDrawBuffer < GL_COLOR_ATTACHMENT0
&& arbFBO != NULL) && arbFBO != NULL)
{ {
arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_FrameBuffer::NO_FRAMEBUFFER); arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_Context::NO_FRAMEBUFFER()/*OpenGl_FrameBuffer::NO_FRAMEBUFFER*/);
} }
::glDrawBuffer (aDrawBuffer); ::glDrawBuffer (aDrawBuffer);
@@ -512,7 +535,7 @@ void OpenGl_Context::SetDrawBuffers (const Standard_Integer theNb, const Standar
} }
if (arbFBO != NULL && useDefaultFbo) 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); myFuncs->glDrawBuffers (theNb, (const GLenum*)theDrawBuffers);

View File

@@ -214,6 +214,12 @@ class OpenGl_Context : public Standard_Transient
friend class OpenGl_Window; friend class OpenGl_Window;
public: 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; 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. //! Function for getting power of to number larger or equal to input number.

View File

@@ -71,9 +71,9 @@ OpenGl_FrameBuffer::OpenGl_FrameBuffer()
myVPSizeY (0), myVPSizeY (0),
myNbSamples (0), myNbSamples (0),
myDepthFormat (GL_DEPTH24_STENCIL8), myDepthFormat (GL_DEPTH24_STENCIL8),
myGlFBufferId (NO_FRAMEBUFFER), myGlFBufferId (OpenGl_Context::NO_FRAMEBUFFER()/*NO_FRAMEBUFFER*/),
myGlColorRBufferId (NO_RENDERBUFFER), myGlColorRBufferId (OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/),
myGlDepthRBufferId (NO_RENDERBUFFER), myGlDepthRBufferId (OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/),
myIsOwnBuffer (false), myIsOwnBuffer (false),
myIsOwnDepth (false), myIsOwnDepth (false),
myDepthStencilTexture (new OpenGl_Texture()) 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->glGenRenderbuffers (1, &myGlDepthRBufferId);
theGlContext->arbFBO->glBindRenderbuffer (GL_RENDERBUFFER, myGlDepthRBufferId); theGlContext->arbFBO->glBindRenderbuffer (GL_RENDERBUFFER, myGlDepthRBufferId);
theGlContext->arbFBO->glRenderbufferStorage (GL_RENDERBUFFER, aDepthStencilFormat, aSizeX, aSizeY); 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); myDepthStencilTexture->GetTarget(), myDepthStencilTexture->TextureId(), 0);
} }
} }
else if (myGlDepthRBufferId != NO_RENDERBUFFER) else if (myGlDepthRBufferId != OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/)
{ {
if (hasDepthStencilAttach (theGlContext) && hasStencilRB) 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; const Standard_Integer aSizeY = theSizeY > 0 ? theSizeY : 2;
// Create the render-buffers // Create the render-buffers
if (theColorRBufferFromWindow != NO_RENDERBUFFER) if (theColorRBufferFromWindow != OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/)
{ {
myGlColorRBufferId = theColorRBufferFromWindow; myGlColorRBufferId = theColorRBufferFromWindow;
} }
@@ -506,7 +506,7 @@ Standard_Boolean OpenGl_FrameBuffer::InitWithRB (const Handle(OpenGl_Context)& t
theGlCtx->arbFBO->glGenRenderbuffers (1, &myGlDepthRBufferId); theGlCtx->arbFBO->glGenRenderbuffers (1, &myGlDepthRBufferId);
theGlCtx->arbFBO->glBindRenderbuffer (GL_RENDERBUFFER, myGlDepthRBufferId); theGlCtx->arbFBO->glBindRenderbuffer (GL_RENDERBUFFER, myGlDepthRBufferId);
theGlCtx->arbFBO->glRenderbufferStorage (GL_RENDERBUFFER, myDepthFormat, aSizeX, aSizeY); 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 // create FBO
@@ -514,7 +514,7 @@ Standard_Boolean OpenGl_FrameBuffer::InitWithRB (const Handle(OpenGl_Context)& t
theGlCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, myGlFBufferId); theGlCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, myGlFBufferId);
theGlCtx->arbFBO->glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, theGlCtx->arbFBO->glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_RENDERBUFFER, myGlColorRBufferId); GL_RENDERBUFFER, myGlColorRBufferId);
if (myGlDepthRBufferId != NO_RENDERBUFFER) if (myGlDepthRBufferId != OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/)
{ {
if (hasDepthStencilAttach (theGlCtx) && hasStencilRB) if (hasDepthStencilAttach (theGlCtx) && hasStencilRB)
{ {
@@ -558,9 +558,9 @@ Standard_Boolean OpenGl_FrameBuffer::InitWrapper (const Handle(OpenGl_Context)&
// clean up previous state // clean up previous state
Release (theGlCtx.operator->()); Release (theGlCtx.operator->());
GLint anFbo = GLint(NO_FRAMEBUFFER); GLint anFbo = GLint(OpenGl_Context::NO_FRAMEBUFFER()/*NO_FRAMEBUFFER*/);
::glGetIntegerv (GL_FRAMEBUFFER_BINDING, &anFbo); ::glGetIntegerv (GL_FRAMEBUFFER_BINDING, &anFbo);
if (anFbo == GLint(NO_FRAMEBUFFER)) if (anFbo == GLint(OpenGl_Context::NO_FRAMEBUFFER()/*NO_FRAMEBUFFER*/))
{ {
return Standard_False; return Standard_False;
} }
@@ -606,16 +606,16 @@ Standard_Boolean OpenGl_FrameBuffer::InitWrapper (const Handle(OpenGl_Context)&
} }
// retrieve dimensions // retrieve dimensions
GLuint aRBuffer = myGlColorRBufferId != NO_RENDERBUFFER ? myGlColorRBufferId : myGlDepthRBufferId; GLuint aRBuffer = myGlColorRBufferId != OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/ ? myGlColorRBufferId : myGlDepthRBufferId;
if (aRBuffer != NO_RENDERBUFFER) if (aRBuffer != OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/)
{ {
theGlCtx->arbFBO->glBindRenderbuffer (GL_RENDERBUFFER, aRBuffer); theGlCtx->arbFBO->glBindRenderbuffer (GL_RENDERBUFFER, aRBuffer);
theGlCtx->arbFBO->glGetRenderbufferParameteriv (GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &myVPSizeX); theGlCtx->arbFBO->glGetRenderbufferParameteriv (GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &myVPSizeX);
theGlCtx->arbFBO->glGetRenderbufferParameteriv (GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &myVPSizeY); 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) && myIsOwnBuffer)
{ {
theGlCtx->arbFBO->glDeleteFramebuffers (1, &myGlFBufferId); theGlCtx->arbFBO->glDeleteFramebuffers (1, &myGlFBufferId);
if (myGlColorRBufferId != NO_RENDERBUFFER) if (myGlColorRBufferId != OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/)
{ {
theGlCtx->arbFBO->glDeleteRenderbuffers (1, &myGlColorRBufferId); theGlCtx->arbFBO->glDeleteRenderbuffers (1, &myGlColorRBufferId);
} }
if (myGlDepthRBufferId != NO_RENDERBUFFER) if (myGlDepthRBufferId != OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/)
{ {
theGlCtx->arbFBO->glDeleteRenderbuffers (1, &myGlDepthRBufferId); theGlCtx->arbFBO->glDeleteRenderbuffers (1, &myGlDepthRBufferId);
} }
} }
myGlFBufferId = NO_FRAMEBUFFER; myGlFBufferId = OpenGl_Context::NO_FRAMEBUFFER()/*NO_FRAMEBUFFER*/;
myGlColorRBufferId = NO_RENDERBUFFER; myGlColorRBufferId = OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/;
myGlDepthRBufferId = NO_RENDERBUFFER; myGlDepthRBufferId = OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/;
myIsOwnBuffer = false; myIsOwnBuffer = false;
} }
@@ -726,7 +726,7 @@ void OpenGl_FrameBuffer::UnbindBuffer (const Handle(OpenGl_Context)& theGlCtx)
} }
else else
{ {
theGlCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, NO_FRAMEBUFFER); theGlCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_Context::NO_FRAMEBUFFER()/*NO_FRAMEBUFFER*/);
theGlCtx->SetFrameBufferSRGB (false); theGlCtx->SetFrameBufferSRGB (false);
} }
} }
@@ -993,12 +993,12 @@ Standard_Size OpenGl_FrameBuffer::EstimatedDataSize() const
{ {
aSize += myDepthStencilTexture->EstimatedDataSize(); aSize += myDepthStencilTexture->EstimatedDataSize();
} }
if (myGlColorRBufferId != NO_RENDERBUFFER if (myGlColorRBufferId != OpenGl_Context::NO_RENDERBUFFER()/*NO_RENDERBUFFER*/
&& !myColorFormats.IsEmpty()) && !myColorFormats.IsEmpty())
{ {
aSize += OpenGl_Texture::PixelSizeOfPixelFormat (myColorFormats.First()) * myInitVPSizeX * myInitVPSizeY; 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; aSize += OpenGl_Texture::PixelSizeOfPixelFormat (myDepthFormat) * myInitVPSizeX * myInitVPSizeY;
} }

View File

@@ -806,7 +806,7 @@ void OpenGl_View::RedrawImmediate()
if (aCtx->arbFBO != NULL) 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 !defined(GL_ES_VERSION_2_0)
if (anImmFbos[0] == NULL) if (anImmFbos[0] == NULL)
@@ -831,7 +831,7 @@ void OpenGl_View::RedrawImmediate()
if (aCtx->arbFBO != NULL) 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 !defined(GL_ES_VERSION_2_0)
if (anImmFbos[1] == NULL) if (anImmFbos[1] == NULL)
@@ -1275,7 +1275,7 @@ void OpenGl_View::renderStructs (Graphic3d_Camera::Projection theProjection,
} }
else else
{ {
aCtx->arbFBO->glBindFramebuffer (GL_DRAW_FRAMEBUFFER, 0); aCtx->arbFBO->glBindFramebuffer (GL_DRAW_FRAMEBUFFER, OpenGl_Context::NO_FRAMEBUFFER());
aCtx->SetFrameBufferSRGB (false); aCtx->SetFrameBufferSRGB (false);
} }
@@ -1291,7 +1291,7 @@ void OpenGl_View::renderStructs (Graphic3d_Camera::Projection theProjection,
} }
else else
{ {
aCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, 0); aCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_Context::NO_FRAMEBUFFER());
aCtx->SetFrameBufferSRGB (false); aCtx->SetFrameBufferSRGB (false);
} }
@@ -1411,7 +1411,7 @@ void OpenGl_View::bindDefaultFbo (OpenGl_FrameBuffer* theCustomFbo)
#else #else
if (aCtx->arbFBO != NULL) 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 #endif
const Standard_Integer aViewport[4] = { 0, 0, myWindow->Width(), myWindow->Height() }; const Standard_Integer aViewport[4] = { 0, 0, myWindow->Width(), myWindow->Height() };
@@ -1489,7 +1489,7 @@ bool OpenGl_View::blitBuffers (OpenGl_FrameBuffer* theReadFbo,
} }
else 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); aCtx->SetFrameBufferSRGB (false);
} }
const Standard_Integer aViewport[4] = { 0, 0, aDrawSizeX, aDrawSizeY }; 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; 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); aCtx->SetFrameBufferSRGB (false);
} }
@@ -1575,7 +1575,7 @@ bool OpenGl_View::blitBuffers (OpenGl_FrameBuffer* theReadFbo,
} }
else 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); aCtx->SetFrameBufferSRGB (false);
} }
} }