HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
vboMemoryManager.h
Go to the documentation of this file.
1 //
2 // Copyright 2016 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_HD_ST_VBO_MEMORY_MANAGER_H
25 #define PXR_IMAGING_HD_ST_VBO_MEMORY_MANAGER_H
26 
27 #include "pxr/pxr.h"
28 #include "pxr/imaging/hdSt/api.h"
30 
35 
36 #include "pxr/base/tf/mallocTag.h"
37 #include "pxr/base/tf/token.h"
38 
39 #include <list>
40 #include <memory>
41 
43 
45 
46 /// \class HdStVBOMemoryManager
47 ///
48 /// VBO memory manager.
49 ///
51 {
52 public:
55  , _resourceRegistry(resourceRegistry) {}
56 
57  /// Factory for creating HdBufferArray managed by
58  /// HdStVBOMemoryManager aggregation.
59  HDST_API
61  TfToken const &role,
62  HdBufferSpecVector const &bufferSpecs,
63  HdBufferArrayUsageHint usageHint);
64 
65  /// Factory for creating HdBufferArrayRange managed by
66  /// HdStVBOMemoryManager aggregation.
67  HDST_API
69 
70  /// Returns id for given bufferSpecs to be used for aggregation
71  HDST_API
73  HdBufferSpecVector const &bufferSpecs,
74  HdBufferArrayUsageHint usageHint) const;
75 
76  /// Returns the buffer specs from a given buffer array
78  HdBufferArraySharedPtr const &bufferArray) const;
79 
80  /// Returns the size of the GPU memory used by the passed buffer array
81  virtual size_t GetResourceAllocation(
82  HdBufferArraySharedPtr const &bufferArray,
83  VtDictionary &result) const;
84 
85 protected:
86  class _StripedBufferArray;
87 
88  /// specialized buffer array range
90  {
91  public:
92  /// Constructor.
94  : HdStBufferArrayRange(resourceRegistry),
95  _stripedBufferArray(nullptr),
96  _elementOffset(0),
97  _numElements(0),
98  _capacity(0)
99  {
100  }
101 
102  /// Destructor.
103  HDST_API
104  ~_StripedBufferArrayRange() override;
105 
106  /// Returns true if this range is valid
107  bool IsValid() const override {
108  return (bool)_stripedBufferArray;
109  }
110 
111  /// Returns true is the range has been assigned to a buffer
112  HDST_API
113  bool IsAssigned() const override;
114 
115  /// Returns true if this bar is marked as immutable.
116  bool IsImmutable() const override;
117 
118  /// Returns true if this needs a staging buffer for CPU to GPU copies.
119  bool RequiresStaging() const override;
120 
121  /// Resize memory area for this range. Returns true if it causes container
122  /// buffer reallocation.
123  HDST_API
124  bool Resize(int numElements) override;
125 
126  /// Copy source data into buffer
127  HDST_API
128  void CopyData(HdBufferSourceSharedPtr const &bufferSource) override;
129 
130  /// Read back the buffer content
131  HDST_API
132  VtValue ReadData(TfToken const &name) const override;
133 
134  /// Returns the relative element offset in aggregated buffer
135  int GetElementOffset() const override {
136  return _elementOffset;
137  }
138 
139  /// Returns the byte offset at which this range begins in the underlying
140  /// buffer array for the given resource.
141  int GetByteOffset(TfToken const& resourceName) const override;
142 
143  /// Returns the number of elements
144  size_t GetNumElements() const override {
145  return _numElements;
146  }
147 
148  /// Returns the version of the buffer array.
149  size_t GetVersion() const override {
150  return _stripedBufferArray->GetVersion();
151  }
152 
153  /// Increment the version of the buffer array.
154  void IncrementVersion() override {
155  _stripedBufferArray->IncrementVersion();
156  }
157 
158  /// Returns the max number of elements
159  HDST_API
160  size_t GetMaxNumElements() const override;
161 
162  /// Returns the usage hint from the underlying buffer array
163  HDST_API
164  HdBufferArrayUsageHint GetUsageHint() const override;
165 
166  /// Returns the GPU resource. If the buffer array contains more than one
167  /// resource, this method raises a coding error.
168  HDST_API
169  HdStBufferResourceSharedPtr GetResource() const override;
170 
171  /// Returns the named GPU resource.
172  HDST_API
174 
175  /// Returns the list of all named GPU resources for this bufferArrayRange.
176  HDST_API
177  HdStBufferResourceNamedList const& GetResources() const override;
178 
179  /// Sets the buffer array associated with this buffer;
180  HDST_API
181  void SetBufferArray(HdBufferArray *bufferArray) override;
182 
183  /// Debug dump
184  HDST_API
185  void DebugDump(std::ostream &out) const override;
186 
187  /// Set the relative offset for this range.
189  _elementOffset = offset;
190  }
191 
192  /// Set the number of elements for this range.
193  void SetNumElements(int numElements) {
194  _numElements = numElements;
195  }
196 
197  /// Returns the capacity of allocated area
198  int GetCapacity() const {
199  return _capacity;
200  }
201 
202  /// Set the capacity of allocated area for this range.
203  void SetCapacity(int capacity) {
204  _capacity = capacity;
205  }
206 
207  /// Make this range invalid
208  void Invalidate() {
209  _stripedBufferArray = NULL;
210  }
211 
212  protected:
213  /// Returns the aggregation container
214  HDST_API
215  const void *_GetAggregation() const override;
216 
217  private:
218  // Returns the byte offset at which the BAR begins for the resource.
219  size_t _GetByteOffset(HdStBufferResourceSharedPtr const& resource)
220  const;
221 
222  // holding a weak reference to container.
223  // this pointer becomes null when the StripedBufferArray gets destructed,
224  // in case if any drawItem still holds this bufferRange.
225  _StripedBufferArray *_stripedBufferArray;
226  int _elementOffset;
227  size_t _numElements;
228  int _capacity;
229  };
230 
232  std::shared_ptr<_StripedBufferArray>;
234  std::shared_ptr<_StripedBufferArrayRange>;
236  std::weak_ptr<_StripedBufferArrayRange>;
237 
238  /// striped buffer array
240  {
241  public:
242  /// Constructor.
243  HDST_API
244  _StripedBufferArray(HdStResourceRegistry* resourceRegistry,
245  TfToken const &role,
246  HdBufferSpecVector const &bufferSpecs,
247  HdBufferArrayUsageHint usageHint);
248 
249  /// Destructor. It invalidates _rangeList
250  HDST_API
251  ~_StripedBufferArray() override;
252 
253  /// perform compaction if necessary. If it becomes empty, release all
254  /// resources and returns true
255  HDST_API
256  bool GarbageCollect() override;
257 
258  /// Debug output
259  HDST_API
260  void DebugDump(std::ostream &out) const override;
261 
262  /// Performs reallocation.
263  /// GLX context has to be set when calling this function.
264  HDST_API
265  void Reallocate(
266  std::vector<HdBufferArrayRangeSharedPtr> const &ranges,
267  HdBufferArraySharedPtr const &curRangeOwner) override;
268 
269  /// Returns the maximum number of elements capacity.
270  HDST_API
271  size_t GetMaxNumElements() const override;
272 
273  /// Mark to perform reallocation on Reallocate()
275  _needsReallocation = true;
276  }
277 
278  /// Mark to perform compaction on GarbageCollect()
280  _needsCompaction = true;
281  }
282 
283  /// Returns the GPU resource. If the buffer array contains more
284  /// than one resource, this method raises a coding error.
285  HDST_API
287 
288  /// Returns the named GPU resource. This method returns the first found
289  /// resource. In HD_SAFE_MODE it checks all underlying GL buffers
290  /// in _resourceMap and raises a coding error if there are more than
291  /// one GL buffers exist.
292  HDST_API
294 
295  /// Returns the list of all named GPU resources for this bufferArray.
297  {return _resourceList;}
298 
299  /// Reconstructs the bufferspecs and returns it (for buffer splitting)
300  HDST_API
302 
303  protected:
304  HDST_API
305  void _DeallocateResources();
306 
307  /// Adds a new, named GPU resource and returns it.
308  HDST_API
310  HdTupleType tupleType,
311  int offset,
312  int stride);
313 
314  private:
315 
316  HdStResourceRegistry* _resourceRegistry;
317  bool _needsCompaction;
318  int _totalCapacity;
319  size_t _maxBytesPerElement;
320 
321  HdStBufferResourceNamedList _resourceList;
322 
323  // Helper routine to cast the range shared pointer.
324  _StripedBufferArrayRangeSharedPtr _GetRangeSharedPtr(size_t idx) const {
325  return std::static_pointer_cast<_StripedBufferArrayRange>(GetRange(idx).lock());
326  }
327  };
328 
330 };
331 
333 
334 #endif // PXR_IMAGING_HD_ST_VBO_MEMORY_MANAGER_H
int GetByteOffset(TfToken const &resourceName) const override
HDST_API const void * _GetAggregation() const override
Returns the aggregation container.
bool IsImmutable() const override
Returns true if this bar is marked as immutable.
bool _needsReallocation
Definition: bufferArray.h:166
bool IsValid() const override
Returns true if this range is valid.
std::shared_ptr< class HdBufferArray > HdBufferArraySharedPtr
Definition: bufferArray.h:43
void SetNeedsCompaction()
Mark to perform compaction on GarbageCollect()
_StripedBufferArrayRange(HdStResourceRegistry *resourceRegistry)
Constructor.
HDST_API void CopyData(HdBufferSourceSharedPtr const &bufferSource) override
Copy source data into buffer.
virtual HDST_API HdBufferArrayRangeSharedPtr CreateBufferArrayRange()
std::vector< std::pair< TfToken, HdStBufferResourceSharedPtr > > HdStBufferResourceNamedList
HDST_API VtValue ReadData(TfToken const &name) const override
Read back the buffer content.
void IncrementVersion() override
Increment the version of the buffer array.
HDST_API bool GarbageCollect() override
HDST_API ~_StripedBufferArray() override
Destructor. It invalidates _rangeList.
HDST_API ~_StripedBufferArrayRange() override
Destructor.
**But if you need a result
Definition: thread.h:613
HDST_API bool Resize(int numElements) override
HDST_API size_t GetMaxNumElements() const override
Returns the maximum number of elements capacity.
HD_API HdBufferArrayRangePtr GetRange(size_t idx) const
Get the attached range at the specified index.
size_t AggregationId
Aggregation ID.
Definition: strategyBase.h:51
HdStBufferResourceNamedList const & GetResources() const
Returns the list of all named GPU resources for this bufferArray.
Definition: token.h:87
GLintptr offset
Definition: glcorearb.h:665
HDST_API void Reallocate(std::vector< HdBufferArrayRangeSharedPtr > const &ranges, HdBufferArraySharedPtr const &curRangeOwner) override
HD_API void IncrementVersion()
Increments the version of this buffer array.
HdStVBOMemoryManager(HdStResourceRegistry *resourceRegistry)
bool RequiresStaging() const override
Returns true if this needs a staging buffer for CPU to GPU copies.
virtual size_t GetResourceAllocation(HdBufferArraySharedPtr const &bufferArray, VtDictionary &result) const
Returns the size of the GPU memory used by the passed buffer array.
int GetElementOffset() const override
Returns the relative element offset in aggregated buffer.
size_t GetNumElements() const override
Returns the number of elements.
std::weak_ptr< _StripedBufferArrayRange > _StripedBufferArrayRangePtr
GLint GLenum GLboolean GLsizei stride
Definition: glcorearb.h:872
HDST_API bool IsAssigned() const override
Returns true is the range has been assigned to a buffer.
HDST_API _StripedBufferArray(HdStResourceRegistry *resourceRegistry, TfToken const &role, HdBufferSpecVector const &bufferSpecs, HdBufferArrayUsageHint usageHint)
Constructor.
HDST_API void DebugDump(std::ostream &out) const override
Debug output.
HDST_API HdStBufferResourceSharedPtr _AddResource(TfToken const &name, HdTupleType tupleType, int offset, int stride)
Adds a new, named GPU resource and returns it.
void SetElementOffset(int offset)
Set the relative offset for this range.
std::shared_ptr< _StripedBufferArray > _StripedBufferArraySharedPtr
GLuint const GLchar * name
Definition: glcorearb.h:786
std::vector< struct HdBufferSpec > HdBufferSpecVector
int GetCapacity() const
Returns the capacity of allocated area.
std::shared_ptr< class HdStBufferResource > HdStBufferResourceSharedPtr
HDST_API HdStBufferResourceNamedList const & GetResources() const override
Returns the list of all named GPU resources for this bufferArrayRange.
size_t GetVersion() const
Definition: bufferArray.h:103
HDST_API void DebugDump(std::ostream &out) const override
Debug dump.
HDST_API HdBufferArrayUsageHint GetUsageHint() const override
Returns the usage hint from the underlying buffer array.
void Invalidate()
Make this range invalid.
PXR_NAMESPACE_CLOSE_SCOPE PXR_NAMESPACE_OPEN_SCOPE
Definition: path.h:1441
HDST_API HdBufferSpecVector GetBufferSpecs() const
Reconstructs the bufferspecs and returns it (for buffer splitting)
void SetNumElements(int numElements)
Set the number of elements for this range.
#define HDST_API
Definition: api.h:40
size_t GetVersion() const override
Returns the version of the buffer array.
#define PXR_NAMESPACE_CLOSE_SCOPE
Definition: pxr.h:91
std::shared_ptr< HdBufferArrayRange > HdBufferArrayRangeSharedPtr
Definition: bufferArray.h:44
void SetNeedsReallocation()
Mark to perform reallocation on Reallocate()
HDST_API size_t GetMaxNumElements() const override
Returns the max number of elements.
HDST_API HdStBufferResourceSharedPtr GetResource() const
virtual HDST_API AggregationId ComputeAggregationId(HdBufferSpecVector const &bufferSpecs, HdBufferArrayUsageHint usageHint) const
Returns id for given bufferSpecs to be used for aggregation.
HDST_API void SetBufferArray(HdBufferArray *bufferArray) override
Sets the buffer array associated with this buffer;.
void SetCapacity(int capacity)
Set the capacity of allocated area for this range.
std::shared_ptr< class HdBufferSource > HdBufferSourceSharedPtr
HDST_API HdStBufferResourceSharedPtr GetResource() const override
HdStResourceRegistry * _resourceRegistry
std::shared_ptr< _StripedBufferArrayRange > _StripedBufferArrayRangeSharedPtr
virtual HDST_API HdBufferArraySharedPtr CreateBufferArray(TfToken const &role, HdBufferSpecVector const &bufferSpecs, HdBufferArrayUsageHint usageHint)
virtual HdBufferSpecVector GetBufferSpecs(HdBufferArraySharedPtr const &bufferArray) const
Returns the buffer specs from a given buffer array.
Definition: value.h:167