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:
parent
6a657c9247
commit
c98fcb6456
@ -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
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user