1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-08 18:40:55 +03:00

0029137: Visualization - D3DHost_FrameBuffer does not release Depth texture and FBO index

This commit is contained in:
kgv 2017-09-25 15:21:11 +03:00 committed by bugmaster
parent 6a657c9247
commit c98fcb6456

View File

@ -29,11 +29,11 @@ IMPLEMENT_STANDARD_RTTIEXT(D3DHost_FrameBuffer,OpenGl_FrameBuffer)
// purpose : // purpose :
// ======================================================================= // =======================================================================
D3DHost_FrameBuffer::D3DHost_FrameBuffer() D3DHost_FrameBuffer::D3DHost_FrameBuffer()
: OpenGl_FrameBuffer(), : myD3dSurf (NULL),
myD3dSurf (NULL),
myD3dSurfShare (NULL), myD3dSurfShare (NULL),
myGlD3dDevice (NULL), myGlD3dDevice (NULL),
myGlD3dSurf (NULL) myGlD3dSurf (NULL),
myLockCount (0)
{ {
// //
} }
@ -53,6 +53,7 @@ D3DHost_FrameBuffer::~D3DHost_FrameBuffer()
// ======================================================================= // =======================================================================
void D3DHost_FrameBuffer::Release (OpenGl_Context* theCtx) void D3DHost_FrameBuffer::Release (OpenGl_Context* theCtx)
{ {
#if !defined(GL_ES_VERSION_2_0)
if (myGlD3dDevice != NULL) if (myGlD3dDevice != NULL)
{ {
const OpenGl_GlFunctions* aFuncs = (theCtx != NULL && theCtx->IsValid()) const OpenGl_GlFunctions* aFuncs = (theCtx != NULL && theCtx->IsValid())
@ -73,6 +74,7 @@ void D3DHost_FrameBuffer::Release (OpenGl_Context* theCtx)
} }
myGlD3dDevice = NULL; myGlD3dDevice = NULL;
} }
#endif
if (myD3dSurf != NULL) if (myD3dSurf != NULL)
{ {
@ -95,7 +97,7 @@ Standard_Boolean D3DHost_FrameBuffer::Init (const Handle(OpenGl_Context)& theCtx
const Standard_Integer theSizeY) const Standard_Integer theSizeY)
{ {
Release (theCtx.operator->()); Release (theCtx.operator->());
#if !defined(GL_ES_VERSION_2_0)
myVPSizeX = theSizeX; myVPSizeX = theSizeX;
myVPSizeY = theSizeY; myVPSizeY = theSizeY;
myInitVPSizeX = theSizeX; myInitVPSizeX = theSizeX;
@ -103,22 +105,6 @@ Standard_Boolean D3DHost_FrameBuffer::Init (const Handle(OpenGl_Context)& theCtx
const Standard_Integer aSizeX = theSizeX > 0 ? theSizeX : 2; const Standard_Integer aSizeX = theSizeX > 0 ? theSizeX : 2;
const Standard_Integer aSizeY = theSizeY > 0 ? theSizeY : 2; const Standard_Integer aSizeY = theSizeY > 0 ? theSizeY : 2;
// Render target surface should be lockable on
// Windows XP and non-lockable on Windows Vista or higher
if (theD3DDevice->CreateRenderTarget (aSizeX, aSizeY,
D3DFMT_X8R8G8B8, D3DMULTISAMPLE_NONE, 0, theIsD3dEx ? TRUE : FALSE,
&myD3dSurf, theIsD3dEx ? &myD3dSurfShare : NULL) != D3D_OK)
{
TCollection_ExtendedString aMsg = TCollection_ExtendedString()
+ "D3DHost_FrameBuffer, could not D3DFMT_X8R8G8B8 render target " + aSizeX + "x" + aSizeY;
theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB,
GL_DEBUG_TYPE_ERROR_ARB,
0,
GL_DEBUG_SEVERITY_HIGH_ARB,
aMsg);
return Standard_False;
}
const OpenGl_GlFunctions* aFuncs = theCtx->Functions(); const OpenGl_GlFunctions* aFuncs = theCtx->Functions();
if (aFuncs->wglDXOpenDeviceNV == NULL) if (aFuncs->wglDXOpenDeviceNV == NULL)
{ {
@ -130,39 +116,54 @@ Standard_Boolean D3DHost_FrameBuffer::Init (const Handle(OpenGl_Context)& theCtx
return Standard_False; return Standard_False;
} }
// Render target surface should be lockable on
// Windows XP and non-lockable on Windows Vista or higher
if (theD3DDevice->CreateRenderTarget (aSizeX, aSizeY,
D3DFMT_X8R8G8B8, D3DMULTISAMPLE_NONE, 0, theIsD3dEx ? TRUE : FALSE,
&myD3dSurf, theIsD3dEx ? &myD3dSurfShare : NULL) != D3D_OK)
{
Release (theCtx.operator->());
theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH,
TCollection_AsciiString ("D3DHost_FrameBuffer, could not D3DFMT_X8R8G8B8 render target ") + aSizeX + "x" + aSizeY);
return Standard_False;
}
myGlD3dDevice = aFuncs->wglDXOpenDeviceNV (theD3DDevice); myGlD3dDevice = aFuncs->wglDXOpenDeviceNV (theD3DDevice);
if (myGlD3dDevice == NULL) if (myGlD3dDevice == NULL)
{ {
theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB, Release (theCtx.operator->());
GL_DEBUG_TYPE_ERROR_ARB, theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH,
0,
GL_DEBUG_SEVERITY_HIGH_ARB,
"D3DHost_FrameBuffer, could not create the GL <-> DirectX Interop using wglDXOpenDeviceNV()"); "D3DHost_FrameBuffer, could not create the GL <-> DirectX Interop using wglDXOpenDeviceNV()");
return Standard_False; return Standard_False;
} }
if (!registerD3dBuffer (theCtx)) if (!registerD3dBuffer (theCtx))
{ {
Release (theCtx.operator->());
return Standard_False; return Standard_False;
} }
myIsOwnBuffer = true;
myIsOwnDepth = true;
theCtx->arbFBO->glGenFramebuffers (1, &myGlFBufferId); theCtx->arbFBO->glGenFramebuffers (1, &myGlFBufferId);
if (!myDepthStencilTexture->Init (theCtx, GL_DEPTH24_STENCIL8, if (!myDepthStencilTexture->Init (theCtx, GL_DEPTH24_STENCIL8,
GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8,
aSizeX, aSizeY, Graphic3d_TOT_2D)) aSizeX, aSizeY, Graphic3d_TOT_2D))
{ {
TCollection_ExtendedString aMsg = TCollection_ExtendedString() Release (theCtx.operator->());
+ "D3DHost_FrameBuffer, could not initialize GL_DEPTH24_STENCIL8 texture " + aSizeX + "x" + aSizeY; theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH,
theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB, TCollection_AsciiString("D3DHost_FrameBuffer, could not initialize GL_DEPTH24_STENCIL8 texture ") + aSizeX + "x" + aSizeY);
GL_DEBUG_TYPE_ERROR_ARB,
0,
GL_DEBUG_SEVERITY_HIGH_ARB,
aMsg);
return Standard_False; return Standard_False;
} }
return Standard_True; return Standard_True;
#else
(void )theD3DDevice;
(void )theIsD3dEx;
(void )theSizeX;
(void )theSizeY;
return Standard_False;
#endif
} }
// ======================================================================= // =======================================================================
@ -171,15 +172,16 @@ Standard_Boolean D3DHost_FrameBuffer::Init (const Handle(OpenGl_Context)& theCtx
// ======================================================================= // =======================================================================
Standard_Boolean D3DHost_FrameBuffer::registerD3dBuffer (const Handle(OpenGl_Context)& theCtx) Standard_Boolean D3DHost_FrameBuffer::registerD3dBuffer (const Handle(OpenGl_Context)& theCtx)
{ {
#if defined(GL_ES_VERSION_2_0)
(void )theCtx;
return Standard_False;
#else
const OpenGl_GlFunctions* aFuncs = theCtx->Functions(); const OpenGl_GlFunctions* aFuncs = theCtx->Functions();
if (myGlD3dSurf != NULL) if (myGlD3dSurf != NULL)
{ {
if (!aFuncs->wglDXUnregisterObjectNV (myGlD3dDevice, myGlD3dSurf)) if (!aFuncs->wglDXUnregisterObjectNV (myGlD3dDevice, myGlD3dSurf))
{ {
theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB, theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH,
GL_DEBUG_TYPE_ERROR_ARB,
0,
GL_DEBUG_SEVERITY_HIGH_ARB,
"D3DHost_FrameBuffer, can not unregister color buffer"); "D3DHost_FrameBuffer, can not unregister color buffer");
return Standard_False; return Standard_False;
} }
@ -188,10 +190,7 @@ Standard_Boolean D3DHost_FrameBuffer::registerD3dBuffer (const Handle(OpenGl_Con
if (!aFuncs->wglDXSetResourceShareHandleNV (myD3dSurf, myD3dSurfShare)) if (!aFuncs->wglDXSetResourceShareHandleNV (myD3dSurf, myD3dSurfShare))
{ {
theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB, theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH,
GL_DEBUG_TYPE_ERROR_ARB,
0,
GL_DEBUG_SEVERITY_HIGH_ARB,
"D3DHost_FrameBuffer, wglDXSetResourceShareHandleNV() has failed"); "D3DHost_FrameBuffer, wglDXSetResourceShareHandleNV() has failed");
return Standard_False; return Standard_False;
} }
@ -207,15 +206,13 @@ Standard_Boolean D3DHost_FrameBuffer::registerD3dBuffer (const Handle(OpenGl_Con
if (myGlD3dSurf == NULL) if (myGlD3dSurf == NULL)
{ {
theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB, theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH,
GL_DEBUG_TYPE_ERROR_ARB,
0,
GL_DEBUG_SEVERITY_HIGH_ARB,
"D3DHost_FrameBuffer, can not register color buffer"); "D3DHost_FrameBuffer, can not register color buffer");
return Standard_False; return Standard_False;
} }
return Standard_True; return Standard_True;
#endif
} }
// ======================================================================= // =======================================================================
@ -228,15 +225,19 @@ void D3DHost_FrameBuffer::BindBuffer (const Handle(OpenGl_Context)& theCtx)
OpenGl_FrameBuffer::BindBuffer (theCtx); OpenGl_FrameBuffer::BindBuffer (theCtx);
theCtx->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, theCtx->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D, myColorTextures (0)->TextureId(), 0); myColorTextures (0)->GetTarget(), myColorTextures (0)->TextureId(), 0);
#ifdef GL_DEPTH_STENCIL_ATTACHMENT
theCtx->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, theCtx->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
GL_TEXTURE_2D, myDepthStencilTexture->TextureId(), 0); myDepthStencilTexture->GetTarget(), myDepthStencilTexture->TextureId(), 0);
#else
theCtx->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
myDepthStencilTexture->GetTarget(), myDepthStencilTexture->TextureId(), 0);
theCtx->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
myDepthStencilTexture->GetTarget(), myDepthStencilTexture->TextureId(), 0);
#endif
if (theCtx->arbFBO->glCheckFramebufferStatus (GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) if (theCtx->arbFBO->glCheckFramebufferStatus (GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
{ {
theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB, theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH,
GL_DEBUG_TYPE_ERROR_ARB,
0,
GL_DEBUG_SEVERITY_HIGH_ARB,
"D3DHost_FrameBuffer, OpenGL FBO is incomplete!"); "D3DHost_FrameBuffer, OpenGL FBO is incomplete!");
Release (theCtx.operator->()); Release (theCtx.operator->());
} }
@ -248,25 +249,25 @@ void D3DHost_FrameBuffer::BindBuffer (const Handle(OpenGl_Context)& theCtx)
// ======================================================================= // =======================================================================
void D3DHost_FrameBuffer::LockSurface (const Handle(OpenGl_Context)& theCtx) void D3DHost_FrameBuffer::LockSurface (const Handle(OpenGl_Context)& theCtx)
{ {
if (++myLockCount > 1)
{
return;
}
if (myGlD3dSurf == NULL) if (myGlD3dSurf == NULL)
{ {
return; return;
} }
if (++myLockCount > 1) #if !defined(GL_ES_VERSION_2_0)
{
return;
}
const OpenGl_GlFunctions* aFuncs = theCtx->Functions(); const OpenGl_GlFunctions* aFuncs = theCtx->Functions();
if (!aFuncs->wglDXLockObjectsNV (myGlD3dDevice, 1, &myGlD3dSurf)) if (!aFuncs->wglDXLockObjectsNV (myGlD3dDevice, 1, &myGlD3dSurf))
{ {
theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB, theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH,
GL_DEBUG_TYPE_ERROR_ARB,
0,
GL_DEBUG_SEVERITY_HIGH_ARB,
"D3DHost_FrameBuffer::LockSurface(), lock failed!"); "D3DHost_FrameBuffer::LockSurface(), lock failed!");
} }
#else
(void )theCtx;
#endif
} }
// ======================================================================= // =======================================================================
@ -275,16 +276,17 @@ void D3DHost_FrameBuffer::LockSurface (const Handle(OpenGl_Context)& theCtx)
// ======================================================================= // =======================================================================
void D3DHost_FrameBuffer::UnlockSurface (const Handle(OpenGl_Context)& theCtx) void D3DHost_FrameBuffer::UnlockSurface (const Handle(OpenGl_Context)& theCtx)
{ {
if (--myLockCount != 0)
{
return;
}
if (myGlD3dSurf == NULL) if (myGlD3dSurf == NULL)
{ {
return; return;
} }
if (--myLockCount != 0) #if !defined(GL_ES_VERSION_2_0)
{
return;
}
const OpenGl_GlFunctions* aFuncs = theCtx->Functions(); const OpenGl_GlFunctions* aFuncs = theCtx->Functions();
aFuncs->wglDXUnlockObjectsNV (myGlD3dDevice, 1, &myGlD3dSurf); aFuncs->wglDXUnlockObjectsNV (myGlD3dDevice, 1, &myGlD3dSurf);
#endif
} }