All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
vboMemoryManager.h
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"
29 #include "pxr/imaging/hd/version.h"
30 #include "pxr/imaging/hd/bufferArray.h"
31 #include "pxr/imaging/hdSt/bufferArrayRange.h"
32 #include "pxr/imaging/hd/bufferSpec.h"
33 #include "pxr/imaging/hd/bufferSource.h"
34 #include "pxr/imaging/hd/strategyBase.h"
35 
36 #include "pxr/base/tf/mallocTag.h"
37 #include "pxr/base/tf/token.h"
38 
39 #include <list>
40 #include <memory>
41 
42 PXR_NAMESPACE_OPEN_SCOPE
43 
45 
51 {
52 public:
55  , _resourceRegistry(resourceRegistry) {}
56 
59  HDST_API
60  virtual HdBufferArraySharedPtr CreateBufferArray(
61  TfToken const &role,
62  HdBufferSpecVector const &bufferSpecs,
63  HdBufferArrayUsageHint usageHint);
64 
67  HDST_API
68  virtual HdBufferArrayRangeSharedPtr CreateBufferArrayRange();
69 
71  HDST_API
73  HdBufferSpecVector const &bufferSpecs,
74  HdBufferArrayUsageHint usageHint) const;
75 
77  virtual HdBufferSpecVector GetBufferSpecs(
78  HdBufferArraySharedPtr const &bufferArray) const;
79 
81  virtual size_t GetResourceAllocation(
82  HdBufferArraySharedPtr const &bufferArray,
83  VtDictionary &result) const;
84 
85 protected:
86  class _StripedBufferArray;
87 
90  {
91  public:
94  : HdStBufferArrayRange(resourceRegistry),
95  _stripedBufferArray(nullptr),
96  _elementOffset(0),
97  _numElements(0),
98  _capacity(0)
99  {
100  }
101 
103  HDST_API
104  ~_StripedBufferArrayRange() override;
105 
107  bool IsValid() const override {
108  return (bool)_stripedBufferArray;
109  }
110 
112  HDST_API
113  bool IsAssigned() const override;
114 
116  bool IsImmutable() const override;
117 
120  HDST_API
121  bool Resize(int numElements) override;
122 
124  HDST_API
125  void CopyData(HdBufferSourceSharedPtr const &bufferSource) override;
126 
128  HDST_API
129  VtValue ReadData(TfToken const &name) const override;
130 
132  int GetElementOffset() const override {
133  return _elementOffset;
134  }
135 
138  int GetByteOffset(TfToken const& resourceName) const override;
139 
141  size_t GetNumElements() const override {
142  return _numElements;
143  }
144 
146  size_t GetVersion() const override {
147  return _stripedBufferArray->GetVersion();
148  }
149 
151  void IncrementVersion() override {
152  _stripedBufferArray->IncrementVersion();
153  }
154 
156  HDST_API
157  size_t GetMaxNumElements() const override;
158 
160  HDST_API
161  HdBufferArrayUsageHint GetUsageHint() const override;
162 
165  HDST_API
166  HdStBufferResourceSharedPtr GetResource() const override;
167 
169  HDST_API
170  HdStBufferResourceSharedPtr GetResource(TfToken const& name) override;
171 
173  HDST_API
174  HdStBufferResourceNamedList const& GetResources() const override;
175 
177  HDST_API
178  void SetBufferArray(HdBufferArray *bufferArray) override;
179 
181  HDST_API
182  void DebugDump(std::ostream &out) const override;
183 
185  void SetElementOffset(int offset) {
186  _elementOffset = offset;
187  }
188 
190  void SetNumElements(int numElements) {
191  _numElements = numElements;
192  }
193 
195  int GetCapacity() const {
196  return _capacity;
197  }
198 
200  void SetCapacity(int capacity) {
201  _capacity = capacity;
202  }
203 
205  void Invalidate() {
206  _stripedBufferArray = NULL;
207  }
208 
209  protected:
211  HDST_API
212  const void *_GetAggregation() const override;
213 
214  private:
215  // Returns the byte offset at which the BAR begins for the resource.
216  size_t _GetByteOffset(HdStBufferResourceSharedPtr const& resource)
217  const;
218 
219  // holding a weak reference to container.
220  // this pointer becomes null when the StripedBufferArray gets destructed,
221  // in case if any drawItem still holds this bufferRange.
222  _StripedBufferArray *_stripedBufferArray;
223  int _elementOffset;
224  size_t _numElements;
225  int _capacity;
226  };
227 
228  using _StripedBufferArraySharedPtr =
229  std::shared_ptr<_StripedBufferArray>;
230  using _StripedBufferArrayRangeSharedPtr =
231  std::shared_ptr<_StripedBufferArrayRange>;
232  using _StripedBufferArrayRangePtr =
233  std::weak_ptr<_StripedBufferArrayRange>;
234 
237  {
238  public:
240  HDST_API
241  _StripedBufferArray(HdStResourceRegistry* resourceRegistry,
242  TfToken const &role,
243  HdBufferSpecVector const &bufferSpecs,
244  HdBufferArrayUsageHint usageHint);
245 
247  HDST_API
248  ~_StripedBufferArray() override;
249 
252  HDST_API
253  bool GarbageCollect() override;
254 
256  HDST_API
257  void DebugDump(std::ostream &out) const override;
258 
261  HDST_API
262  void Reallocate(
263  std::vector<HdBufferArrayRangeSharedPtr> const &ranges,
264  HdBufferArraySharedPtr const &curRangeOwner) override;
265 
267  HDST_API
268  size_t GetMaxNumElements() const override;
269 
272  _needsReallocation = true;
273  }
274 
277  _needsCompaction = true;
278  }
279 
284 
287  HDST_API
288  HdStBufferResourceSharedPtr GetResource() const;
289 
294  HDST_API
295  HdStBufferResourceSharedPtr GetResource(TfToken const& name);
296 
298  HdStBufferResourceNamedList const& GetResources() const
299  {return _resourceList;}
300 
302  HDST_API
303  HdBufferSpecVector GetBufferSpecs() const;
304 
305  protected:
306  HDST_API
307  void _DeallocateResources();
308 
310  HDST_API
311  HdStBufferResourceSharedPtr _AddResource(TfToken const& name,
312  HdTupleType tupleType,
313  int offset,
314  int stride);
315 
316  private:
317 
318  HdStResourceRegistry* _resourceRegistry;
319  bool _needsCompaction;
320  int _totalCapacity;
321  size_t _maxBytesPerElement;
322 
323  HdStBufferResourceNamedList _resourceList;
324 
325  // Helper routine to cast the range shared pointer.
326  _StripedBufferArrayRangeSharedPtr _GetRangeSharedPtr(size_t idx) const {
327  return std::static_pointer_cast<_StripedBufferArrayRange>(GetRange(idx).lock());
328  }
329  };
330 
331  HdStResourceRegistry* _resourceRegistry;
332 };
333 
334 PXR_NAMESPACE_CLOSE_SCOPE
335 
336 #endif // PXR_IMAGING_HD_ST_VBO_MEMORY_MANAGER_H
size_t AggregationId
Aggregation ID.
Definition: strategyBase.h:51
The union provides a set of flags that provide hints to the memory management system about the proper...
Definition: bufferArray.h:70
HDST_API _StripedBufferArray(HdStResourceRegistry *resourceRegistry, TfToken const &role, HdBufferSpecVector const &bufferSpecs, HdBufferArrayUsageHint usageHint)
Constructor.
HDST_API void DebugDump(std::ostream &out) const override
Debug dump.
HDST_API HdStBufferResourceNamedList const & GetResources() const override
Returns the list of all named GPU resources for this bufferArrayRange.
HDST_API size_t GetMaxNumElements() const override
Returns the max number of elements.
void SetElementOffset(int offset)
Set the relative offset for this range.
HdStBufferResourceNamedList const & GetResources() const
Returns the list of all named GPU resources for this bufferArray.
HDST_API void SetBufferArray(HdBufferArray *bufferArray) override
Sets the buffer array associated with this buffer;.
Similar to a VAO, this object is a bundle of coherent buffers.
Definition: bufferArray.h:88
HDST_API bool Resize(int numElements) override
Resize memory area for this range.
Aggregation strategy base class.
Definition: strategyBase.h:48
HD_API void IncrementVersion()
Increments the version of this buffer array.
HDST_API bool GarbageCollect() override
perform compaction if necessary.
HDST_API HdBufferSpecVector GetBufferSpecs() const
Reconstructs the bufferspecs and returns it (for buffer splitting)
Interface class for representing range (subset) locator of HdBufferArray.
virtual HDST_API HdBufferArraySharedPtr CreateBufferArray(TfToken const &role, HdBufferSpecVector const &bufferSpecs, HdBufferArrayUsageHint usageHint)
Factory for creating HdBufferArray managed by HdStVBOMemoryManager aggregation.
HdTupleType represents zero, one, or more values of the same HdType.
Definition: types.h:325
A map with string keys and VtValue values.
Definition: dictionary.h:63
bool IsImmutable() const override
Returns true if this bar is marked as immutable.
HDST_API HdStBufferResourceSharedPtr GetResource() const override
Returns the GPU resource.
virtual HdBufferSpecVector GetBufferSpecs(HdBufferArraySharedPtr const &bufferArray) const
Returns the buffer specs from a given buffer array.
int GetCapacity() const
Returns the capacity of allocated area.
HDST_API void DebugDump(std::ostream &out) const override
Debug output.
HD_API HdBufferArrayRangePtr GetRange(size_t idx) const
Get the attached range at the specified index.
bool IsValid() const override
Returns true if this range is valid.
Token for efficient comparison, assignment, and hashing of known strings.
Definition: token.h:87
HDST_API HdBufferArrayUsageHint GetUsageHint() const override
Returns the usage hint from the underlying buffer array.
void SetCapacity(int capacity)
Set the capacity of allocated area for this range.
HDST_API ~_StripedBufferArray() override
Destructor. It invalidates _rangeList.
void SetNumElements(int numElements)
Set the number of elements for this range.
A central registry of all GPU resources.
HDST_API HdStBufferResourceSharedPtr _AddResource(TfToken const &name, HdTupleType tupleType, int offset, int stride)
Adds a new, named GPU resource and returns it.
int GetByteOffset(TfToken const &resourceName) const override
Returns the byte offset at which this range begins in the underlying buffer array for the given resou...
void Invalidate()
Make this range invalid.
void SetNeedsReallocation()
Mark to perform reallocation on Reallocate()
HDST_API size_t GetMaxNumElements() const override
Returns the maximum number of elements capacity.
virtual HDST_API AggregationId ComputeAggregationId(HdBufferSpecVector const &bufferSpecs, HdBufferArrayUsageHint usageHint) const
Returns id for given bufferSpecs to be used for aggregation.
HDST_API void Reallocate(std::vector< HdBufferArrayRangeSharedPtr > const &ranges, HdBufferArraySharedPtr const &curRangeOwner) override
Performs reallocation.
_StripedBufferArrayRange(HdStResourceRegistry *resourceRegistry)
Constructor.
void IncrementVersion() override
Increment the version of the buffer array.
void SetNeedsCompaction()
Mark to perform compaction on GarbageCollect()
size_t GetVersion() const
Returns the version of this buffer array.
Definition: bufferArray.h:104
HDST_API const void * _GetAggregation() const override
Returns the aggregation container.
HDST_API VtValue ReadData(TfToken const &name) const override
Read back the buffer content.
virtual HDST_API HdBufferArrayRangeSharedPtr CreateBufferArrayRange()
Factory for creating HdBufferArrayRange managed by HdStVBOMemoryManager aggregation.
HDST_API void CopyData(HdBufferSourceSharedPtr const &bufferSource) override
Copy source data into buffer.
HDST_API HdStBufferResourceSharedPtr GetResource() const
TODO: We need to distinguish between the primvar types here, we should tag each HdBufferSource and Hd...
size_t GetVersion() const override
Returns the version of the buffer array.
bool _needsReallocation
Dirty bit to set when the ranges attached to the buffer changes.
Definition: bufferArray.h:167
HDST_API bool IsAssigned() const override
Returns true is the range has been assigned to a buffer.
HDST_API ~_StripedBufferArrayRange() override
Destructor.
int GetElementOffset() const override
Returns the relative element offset in aggregated buffer.
size_t GetNumElements() const override
Returns the number of elements.
VBO memory manager.
virtual size_t GetResourceAllocation(HdBufferArraySharedPtr const &bufferArray, VtDictionary &result) const
Returns the size of the GPU memory used by the passed buffer array.
Provides a container which may hold any type, and provides introspection and iteration over array typ...
Definition: value.h:168
TfToken class for efficient string referencing and hashing, plus conversions to and from stl string c...