#include <OpenGl_tgl_funcs.hxx>
#include <OpenGl_LightBox.hxx>
#include <OpenGl_TextureBox.hxx>
+#include <OpenGl_ResourceCleaner.hxx>
+#include <OpenGl_ResourceVBO.hxx>
#include <InterfaceGraphic_PrimitiveArray.hxx>
#include <OpenGl_Memory.hxx>
#include <Standard.hxx>
if( p->flagBufferVBO == VBO_OK )
clearRAMMemory(p);
+
+ //specify context for VBO resource
+ p->contextId = (Standard_Address)GET_GL_CONTEXT();
+
}
/*----------------------------------------------------------------------*/
static TStatus
ParrayDelete( TSM_ELEM_DATA data, Tint n, cmn_key *k )
{
+ call_def_parray p = (call_def_parray)data.pdata;
+ if( p->VBOEnabled == VBO_OK ) {
+ OpenGl_ResourceCleaner* resCleaner = OpenGl_ResourceCleaner::GetInstance();
+ if( p->bufferVBO[VBOEdges] )
+ resCleaner->AddResource( (GLCONTEXT)p->contextId, new OpenGl_ResourceVBO(p->bufferVBO[VBOEdges]) );
+ if( p->bufferVBO[VBOVertices] )
+ resCleaner->AddResource( (GLCONTEXT)p->contextId, new OpenGl_ResourceVBO(p->bufferVBO[VBOVertices]) );
+ if( p->bufferVBO[VBOVcolours] )
+ resCleaner->AddResource( (GLCONTEXT)p->contextId, new OpenGl_ResourceVBO(p->bufferVBO[VBOVcolours]) );
+ if( p->bufferVBO[VBOVnormals] )
+ resCleaner->AddResource( (GLCONTEXT)p->contextId, new OpenGl_ResourceVBO(p->bufferVBO[VBOVnormals]) );
+ if( p->bufferVBO[VBOVtexels] )
+ resCleaner->AddResource( (GLCONTEXT)p->contextId, new OpenGl_ResourceVBO(p->bufferVBO[VBOVtexels]) );
+ }
+
return TSuccess;
}
TsmGetAttri( 1, &keyZoom );
zoom = keyZoom.data.ldata;
- CMN_KEY keyfontName;
- keyfontName.id = TelTextFont;//This flag responding about TextFontName
- TsmGetAttri( 1, &keyfontName );
- char *fontName = new char[strlen((char*)keyfontName.data.pdata) + 1];
- strcpy(fontName,(char*)keyfontName.data.pdata);
-
OpenGl_TextRender* textRender = OpenGl_TextRender::instance();
int vh = 2 ;
int vv = 2 ;
if ( renderMode == GL_FEEDBACK )
{
#ifdef HAVE_GL2PS
+ CMN_KEY keyfontName;
+ keyfontName.id = TelTextFont;//This flag responding about TextFontName
+ TsmGetAttri( 1, &keyfontName );
+ char *fontName = new char[strlen((char*)keyfontName.data.pdata) + 1];
+ strcpy(fontName,(char*)keyfontName.data.pdata);
+
export_h = (GLdouble)fnt->FaceSize() / export_h;
int aligment = alignmentforgl2ps( vh, vv );
glPopMatrix();
ExportText( str, fontName, export_h, angle, aligment, x, y, z, is2d!=0 );
+ delete [] fontName;
#endif
}
else
glPopMatrix();
}
glPopAttrib();
- delete [] fontName;
return;
}
#include <OpenGl_tgl_funcs.hxx>
#include <OpenGl_tgl_subrvis.hxx>
#include <OpenGl_FrameBuffer.hxx>
+#include <OpenGl_ResourceCleaner.hxx>
#include <InterfaceGraphic_Graphic3d.hxx>
#include <InterfaceGraphic_Visual3d.hxx>
aFrameBuffer->BindBuffer();
swap = 0; // no need to swap buffers
}
-
+ OpenGl_ResourceCleaner::GetInstance()->Cleanup();
call_func_redraw_all_structs_begin (aview->WsId);
- call_togl_setplane( aview ); /* apl - OCC22108: update clipping planes */
+ call_togl_setplane( aview );
if (anunderlayer->ptrLayer)
{
call_togl_redraw_layer2d (aview, anunderlayer);
glScissor ((GLint )x,
(GLint )((int )aview->DefWindow.dy - (y + height)),
(GLsizei )width, (GLsizei )height);
+ OpenGl_ResourceCleaner::GetInstance()->Cleanup();
call_func_redraw_all_structs_begin (aview->WsId);
- call_togl_setplane( aview ); /* apl - OCC22108: update clipping planes */
+ call_togl_setplane( aview );
if (anunderlayer->ptrLayer)
{
call_togl_redraw_layer2d (aview, anunderlayer);
#include <stdio.h>
#include <OpenGl_Memory.hxx>
+#include <OpenGl_ResourceCleaner.hxx>
#ifdef WNT
if( !ctx) return TFailure;
+ OpenGl_ResourceCleaner::GetInstance()->AppendContext( ctx, true );
+
cmap = XCreateColormap( disp, par, vis->visual, AllocNone );
color.red = (unsigned short) (bgcolr * 0xFFFF);
return 0;
}
- if (previous_ctx == 0 )
- {
+ Standard_Boolean isShared = Standard_True;
+
+ if (previous_ctx == 0 )
previous_ctx = hte -> hGLRC;
- } else
- wglShareLists(previous_ctx, hte -> hGLRC);
+ // if we already have some shared context
+ else
+ {
+ // try to share context with one from resource cleaner list
+ GLCONTEXT shareCtx = OpenGl_ResourceCleaner::GetInstance()->GetSharedContext();
+
+ if (shareCtx != 0)
+ isShared = (Standard_Boolean)wglShareLists(shareCtx, hte -> hGLRC);
+ else
+ {
+ isShared = (Standard_Boolean)wglShareLists(previous_ctx, hte -> hGLRC);
+ // add shared previous_ctx to a control list if it's not there
+ if (isShared)
+ OpenGl_ResourceCleaner::GetInstance()->AppendContext(previous_ctx, isShared);
+ }
+ }
+ // add the context to OpenGl_ResourceCleaner control list
+ OpenGl_ResourceCleaner::GetInstance()->AppendContext( hte -> hGLRC, isShared);
_Txgl_Map.Bind( (Tint)par, hte );
return par;
/* FSXXX sync necessary if non-direct rendering */
glXWaitGL();
+ OpenGl_ResourceCleaner::GetInstance()->RemoveContext( ctx );
_Txgl_Map.UnBind( win );
if (previous_ctx == ctx) {
if ( --hte -> nUsed == 0 )
{
+ OpenGl_ResourceCleaner::GetInstance()->RemoveContext( hte -> hGLRC );
#ifdef OCC954
if ( wglGetCurrentContext() != NULL )
#endif
wglDeleteContext ( hte -> hGLRC );
ReleaseDC ( win, hte -> hDC );
_Txgl_Map.UnBind( (Tint ) win );
+ if( _Txgl_Map.Size() == 0 ) {
+ previous_ctx = 0;
+ }
delete hte;
}