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:
@@ -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);
|
||||
|
@@ -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.
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user