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
// 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);

View 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.

View 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;
}

View 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);
}
}