HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
garbageCollector.h
Go to the documentation of this file.
1 //
2 // Copyright 2020 Pixar
3 //
4 // Licensed under the Apache License, Version 2.0 (the "Apache License")
5 // with the following modification; you may not use this file except in
6 // compliance with the Apache License and the following modification to it:
7 // Section 6. Trademarks. is deleted and replaced with:
8 //
9 // 6. Trademarks. This License does not grant permission to use the trade
10 // names, trademarks, service marks, or product names of the Licensor
11 // and its affiliates, except as required to comply with Section 4(c) of
12 // the License and to reproduce the content of the NOTICE file.
13 //
14 // You may obtain a copy of the Apache License at
15 //
16 // http://www.apache.org/licenses/LICENSE-2.0
17 //
18 // Unless required by applicable law or agreed to in writing, software
19 // distributed under the Apache License with the above modification is
20 // distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
21 // KIND, either express or implied. See the Apache License for the specific
22 // language governing permissions and limitations under the Apache License.
23 //
24 #ifndef PXR_IMAGING_HGI_GL_GARBAGE_COLLECTOR_H
25 #define PXR_IMAGING_HGI_GL_GARBAGE_COLLECTOR_H
26 
27 #include "pxr/pxr.h"
28 #include "pxr/base/tf/diagnostic.h"
29 
30 #include "pxr/imaging/hgi/hgi.h"
31 #include "pxr/imaging/hgiGL/api.h"
32 
33 #include <mutex>
34 #include <vector>
35 
37 
38 class HgiGL;
39 
40 /// \class HgiGLGarbageCollector
41 ///
42 /// Handles garbage collection of opengl objects by delaying their destruction
43 /// until those objects are no longer used.
44 ///
46 {
47 public:
48  HGIGL_API
50 
51  HGIGL_API
53 
54  /// Destroys the objects inside the garbage collector.
55  /// Thread safety: This call is not thread safe and must be called from
56  /// the thread that has the opengl context bound while no other threads are
57  /// destroying objects (e.g. during EndFrame).
58  HGIGL_API
60 
61  /// Returns a garbage collection vector for a type of handle.
62  /// Thread safety: The returned vector is a thread_local vector so this call
63  /// is thread safe as long as the vector is only used by the calling thread.
72 
73 private:
74  HgiGLGarbageCollector & operator =
75  (const HgiGLGarbageCollector&) = delete;
76  HgiGLGarbageCollector(const HgiGLGarbageCollector&) = delete;
77 
78  /// Returns a thread_local vector in which to store a object handle.
79  /// Thread safety: The returned vector is a thread_local vector so this call
80  /// is thread safe as long as the vector is only used by the calling thread.
81  template<class T>
82  T* _GetThreadLocalStorageList(std::vector<T*>* collector);
83 
84  HgiGL* _hgi;
85 
86  // List of all the per-thread-vectors of objects that need to be destroyed.
87  // The vectors are static (shared across HGIs), because we use thread_local
88  // in _GetThreadLocalStorageList which makes us share the garbage collector
89  // vectors across Hgi instances.
90  static std::vector<HgiBufferHandleVector*> _bufferList;
91  static std::vector<HgiTextureHandleVector*> _textureList;
92  static std::vector<HgiSamplerHandleVector*> _samplerList;
93  static std::vector<HgiShaderFunctionHandleVector*> _shaderFunctionList;
94  static std::vector<HgiShaderProgramHandleVector*> _shaderProgramList;
95  static std::vector<HgiResourceBindingsHandleVector*> _resourceBindingsList;
96  static std::vector<HgiGraphicsPipelineHandleVector*> _graphicsPipelineList;
97  static std::vector<HgiComputePipelineHandleVector*> _computePipelineList;
98 
99  bool _isDestroying;
100 };
101 
102 
104 
105 #endif
HgiBufferHandleVector * GetBufferList()
HGIGL_API void PerformGarbageCollection()
std::vector< HgiShaderProgramHandle > HgiShaderProgramHandleVector
std::vector< HgiTextureHandle > HgiTextureHandleVector
Definition: texture.h:207
std::vector< HgiShaderFunctionHandle > HgiShaderFunctionHandleVector
HgiGraphicsPipelineHandleVector * GetGraphicsPipelineList()
std::vector< HgiGraphicsPipelineHandle > HgiGraphicsPipelineHandleVector
HGIGL_API HgiGLGarbageCollector(HgiGL *hgi)
Definition: hgi.h:53
std::vector< HgiBufferHandle > HgiBufferHandleVector
Definition: buffer.h:152
HgiTextureHandleVector * GetTextureList()
std::vector< HgiResourceBindingsHandle > HgiResourceBindingsHandleVector
#define HGIGL_API
Definition: api.h:40
HGIGL_API ~HgiGLGarbageCollector()
HgiComputePipelineHandleVector * GetComputePipelineList()
PXR_NAMESPACE_CLOSE_SCOPE PXR_NAMESPACE_OPEN_SCOPE
Definition: path.h:1375
#define PXR_NAMESPACE_CLOSE_SCOPE
Definition: pxr.h:91
std::vector< HgiComputePipelineHandle > HgiComputePipelineHandleVector
HgiSamplerHandleVector * GetSamplerList()
std::vector< HgiSamplerHandle > HgiSamplerHandleVector
Definition: sampler.h:132
HgiResourceBindingsHandleVector * GetResourceBindingsList()
HgiShaderProgramHandleVector * GetShaderProgramList()
HgiShaderFunctionHandleVector * GetShaderFunctionList()