0023022: This is desirable to access OpenGl extensions and core API (1.2+) in one...
[occt.git] / src / OpenGl / OpenGl_ResourceCleaner.hxx
1 // File:      OpenGl_ResourceCleaner.hxx
2 // Created:   18.03.11 9:30:00
3 // Author:    Anton POLETAEV
4
5 #ifndef _OPENGL_RESOURCECLEANER_H
6 #define _OPENGL_RESOURCECLEANER_H
7
8 #include <OpenGl_GlCore11.hxx>
9 #include <NCollection_Queue.hxx>
10 #include <NCollection_List.hxx>
11 #include <NCollection_Map.hxx>
12 #include <NCollection_DataMap.hxx>
13 #include <OpenGl_Resource.hxx>
14
15 class OpenGl_Resource;
16 class Handle(OpenGl_Resource);
17 class Handle(OpenGl_Context);
18
19 typedef NCollection_Queue<Handle_OpenGl_Resource> QueueOfResources;
20 typedef NCollection_DataMap<GLCONTEXT, QueueOfResources> DataMapOfContextsResources;
21 typedef NCollection_Map<GLCONTEXT> MapOfContexts;
22
23 //! OpenGl_ResourceCleaner should be used to clean OpenGl memory resources;
24 //! The reason is that the resources might be shared between the contexts and
25 //! should be cleaned up only while suitable context is active;
26 class OpenGl_ResourceCleaner
27 {
28
29 public:
30         
31   //! Constructor
32   OpenGl_ResourceCleaner();
33
34   //! Destructor
35   virtual ~OpenGl_ResourceCleaner() { }
36
37   //! Append OpenGl context to the OpenGl_ResourceCleaner
38   //! control list.
39   void AppendContext(GLCONTEXT theContext, Standard_Boolean isShared);  
40   
41   //! Tell the OpenGl_ResourceCleaner to clean up the OpenGl memory resource
42   //! which has been created by the specified OpenGl context;
43   //! The context should be in the OpenGl_ResourceCleaner control list.
44   Standard_Boolean AddResource(GLCONTEXT theContext, Handle_OpenGl_Resource theResource);
45
46   //! Cancel clean procedure for all the resources added to the OpenGl_ResourceCleaner.
47   void Clear();
48
49   //! Cancel clean procedure for all the resources of the specific OpenGl context 
50   //! which were added to the OpenGl_ResourceCleaner.
51   Standard_Boolean Clear(GLCONTEXT theContext);
52
53   //! Cancel clean procedure for all of the shared resources.
54   void ClearShared();
55
56   //! Clear the unused resources for active OpenGl context;
57   //! You should add the cleaner resources by AddResources method;
58   //! It is suggested to call this method right before the OpenGl
59   //! new frame drawing procedure starts.
60   void Cleanup (const Handle(OpenGl_Context)& theGlContext);
61
62   //! Remove the OpenGl context from the OpenGl_ResourceCleaner control list.
63   void RemoveContext(GLCONTEXT theContext);
64
65   //! Get any of shared contexts from the OpenGl_ResourceCleaner list 
66   //! to share resources with a new one
67   GLCONTEXT GetSharedContext() const;
68
69   //! Get the global instance of OpenGl_ResourceCleaner
70   static OpenGl_ResourceCleaner* GetInstance();
71
72 private:
73
74   DataMapOfContextsResources myInstanceQueue;  // map for queues of non-shared context's resources
75   QueueOfResources mySharedQueue;              // queue of shared context's resources
76   MapOfContexts mySharedContexts;              // the control list of shared contexts
77
78 };
79
80 #endif