Loading...
Searching...
No Matches
vboMemoryManager.h
1//
2// Copyright 2016 Pixar
3//
4// Licensed under the terms set forth in the LICENSE.txt file available at
5// https://openusd.org/license.
6//
7#ifndef PXR_IMAGING_HD_ST_VBO_MEMORY_MANAGER_H
8#define PXR_IMAGING_HD_ST_VBO_MEMORY_MANAGER_H
9
10#include "pxr/pxr.h"
11
13
14#include "pxr/imaging/hdSt/api.h"
15#include "pxr/imaging/hdSt/strategyBase.h"
16#include "pxr/imaging/hdSt/bufferArrayRange.h"
17
18#include "pxr/imaging/hgi/enums.h"
19
20#include "pxr/imaging/hd/bufferArray.h"
21#include "pxr/imaging/hd/bufferSpec.h"
22#include "pxr/imaging/hd/bufferSource.h"
23
24#include <list>
25#include <memory>
26
27PXR_NAMESPACE_OPEN_SCOPE
28
29HDST_API
30extern TfEnvSetting<int> HD_MAX_VBO_SIZE;
31
33
39{
40public:
43 , _resourceRegistry(resourceRegistry) {}
44
47 HDST_API
48 virtual HdBufferArraySharedPtr CreateBufferArray(
49 TfToken const &role,
50 HdBufferSpecVector const &bufferSpecs,
51 HdBufferArrayUsageHint usageHint);
52
55 HDST_API
56 virtual HdBufferArrayRangeSharedPtr CreateBufferArrayRange();
57
59 HDST_API
61 HdBufferSpecVector const &bufferSpecs,
62 HdBufferArrayUsageHint usageHint) const;
63
65 virtual HdBufferSpecVector GetBufferSpecs(
66 HdBufferArraySharedPtr const &bufferArray) const;
67
69 virtual size_t GetResourceAllocation(
70 HdBufferArraySharedPtr const &bufferArray,
71 VtDictionary &result) const;
72
73protected:
75
78 {
79 public:
82 : HdStBufferArrayRange(resourceRegistry),
83 _stripedBufferArray(nullptr),
84 _elementOffset(0),
85 _numElements(0),
86 _capacity(0)
87 {
88 }
89
91 HDST_API
93
95 bool IsValid() const override {
96 return (bool)_stripedBufferArray;
97 }
98
100 HDST_API
101 bool IsAssigned() const override;
102
104 bool IsImmutable() const override;
105
107 bool RequiresStaging() const override;
108
111 HDST_API
112 bool Resize(int numElements) override;
113
115 HDST_API
116 void CopyData(HdBufferSourceSharedPtr const &bufferSource) override;
117
119 HDST_API
120 VtValue ReadData(TfToken const &name) const override;
121
123 int GetElementOffset() const override {
124 return _elementOffset;
125 }
126
129 int GetByteOffset(TfToken const& resourceName) const override;
130
132 size_t GetNumElements() const override {
133 return _numElements;
134 }
135
137 size_t GetVersion() const override {
138 return _stripedBufferArray->GetVersion();
139 }
140
142 void IncrementVersion() override {
143 _stripedBufferArray->IncrementVersion();
144 }
145
147 HDST_API
148 size_t GetMaxNumElements() const override;
149
151 HDST_API
152 HdBufferArrayUsageHint GetUsageHint() const override;
153
156 HDST_API
157 HdStBufferResourceSharedPtr GetResource() const override;
158
160 HDST_API
161 HdStBufferResourceSharedPtr GetResource(TfToken const& name) override;
162
164 HDST_API
165 HdStBufferResourceNamedList const& GetResources() const override;
166
168 HDST_API
169 void SetBufferArray(HdBufferArray *bufferArray) override;
170
172 HDST_API
173 void DebugDump(std::ostream &out) const override;
174
176 void SetElementOffset(int offset) {
177 _elementOffset = offset;
178 }
179
181 void SetNumElements(int numElements) {
182 _numElements = numElements;
183 }
184
186 int GetCapacity() const {
187 return _capacity;
188 }
189
191 void SetCapacity(int capacity) {
192 _capacity = capacity;
193 }
194
196 void Invalidate() {
197 _stripedBufferArray = NULL;
198 }
199
200 protected:
202 HDST_API
203 const void *_GetAggregation() const override;
204
205 private:
206 // Returns the byte offset at which the BAR begins for the resource.
207 size_t _GetByteOffset(HdStBufferResourceSharedPtr const& resource)
208 const;
209
210 // holding a weak reference to container.
211 // this pointer becomes null when the StripedBufferArray gets destructed,
212 // in case if any drawItem still holds this bufferRange.
213 _StripedBufferArray *_stripedBufferArray;
214 int _elementOffset;
215 size_t _numElements;
216 int _capacity;
217 };
218
219 using _StripedBufferArraySharedPtr =
220 std::shared_ptr<_StripedBufferArray>;
221 using _StripedBufferArrayRangeSharedPtr =
222 std::shared_ptr<_StripedBufferArrayRange>;
223 using _StripedBufferArrayRangePtr =
224 std::weak_ptr<_StripedBufferArrayRange>;
225
228 {
229 public:
231 HDST_API
233 TfToken const &role,
234 HdBufferSpecVector const &bufferSpecs,
235 HdBufferArrayUsageHint usageHint);
236
238 HDST_API
240
243 HDST_API
244 bool GarbageCollect() override;
245
247 HDST_API
248 void DebugDump(std::ostream &out) const override;
249
252 HDST_API
254 std::vector<HdBufferArrayRangeSharedPtr> const &ranges,
255 HdBufferArraySharedPtr const &curRangeOwner) override;
256
258 HDST_API
259 size_t GetMaxNumElements() const override;
260
263 _needsReallocation = true;
264 }
265
268 _needsCompaction = true;
269 }
270
273 HDST_API
274 HdStBufferResourceSharedPtr GetResource() const;
275
280 HDST_API
281 HdStBufferResourceSharedPtr GetResource(TfToken const& name);
282
284 HdStBufferResourceNamedList const& GetResources() const
285 {return _resourceList;}
286
288 HDST_API
289 HdBufferSpecVector GetBufferSpecs() const;
290
291 protected:
292 HDST_API
293 void _DeallocateResources();
294
296 HDST_API
297 HdStBufferResourceSharedPtr _AddResource(TfToken const& name,
298 HdTupleType tupleType,
299 int offset,
300 int stride);
301
302 private:
303
304 HdStResourceRegistry* _resourceRegistry;
305 bool _needsCompaction;
306 int _totalCapacity;
307 size_t _maxBytesPerElement;
308 HgiBufferUsage _bufferUsage;
309
310 HdStBufferResourceNamedList _resourceList;
311
312 // Helper routine to cast the range shared pointer.
313 _StripedBufferArrayRangeSharedPtr _GetRangeSharedPtr(size_t idx) const {
314 return std::static_pointer_cast<_StripedBufferArrayRange>(GetRange(idx).lock());
315 }
316 };
317
318 HdStResourceRegistry* _resourceRegistry;
319};
320
321PXR_NAMESPACE_CLOSE_SCOPE
322
323#endif // PXR_IMAGING_HD_ST_VBO_MEMORY_MANAGER_H
Similar to a VAO, this object is a bundle of coherent buffers.
Definition: bufferArray.h:69
bool _needsReallocation
Dirty bit to set when the ranges attached to the buffer changes.
Definition: bufferArray.h:147
HD_API void IncrementVersion()
Increments the version of this buffer array.
HD_API HdBufferArrayRangePtr GetRange(size_t idx) const
Get the attached range at the specified index.
size_t GetVersion() const
Returns the version of this buffer array.
Definition: bufferArray.h:84
Aggregation strategy base class.
Definition: strategyBase.h:31
size_t AggregationId
Aggregation ID.
Definition: strategyBase.h:34
Interface class for representing range (subset) locator of HdBufferArray.
A central registry of all GPU resources.
void SetNeedsCompaction()
Mark to perform compaction on GarbageCollect()
HDST_API ~_StripedBufferArray() override
Destructor. It invalidates _rangeList.
HDST_API HdStBufferResourceSharedPtr _AddResource(TfToken const &name, HdTupleType tupleType, int offset, int stride)
Adds a new, named GPU resource and returns it.
HDST_API HdStBufferResourceSharedPtr GetResource(TfToken const &name)
Returns the named GPU resource.
void SetNeedsReallocation()
Mark to perform reallocation on Reallocate()
HDST_API HdStBufferResourceSharedPtr GetResource() const
Returns the GPU resource.
HDST_API void Reallocate(std::vector< HdBufferArrayRangeSharedPtr > const &ranges, HdBufferArraySharedPtr const &curRangeOwner) override
Performs reallocation.
HDST_API bool GarbageCollect() override
perform compaction if necessary.
HDST_API void DebugDump(std::ostream &out) const override
Debug output.
HdStBufferResourceNamedList const & GetResources() const
Returns the list of all named GPU resources for this bufferArray.
HDST_API _StripedBufferArray(HdStResourceRegistry *resourceRegistry, TfToken const &role, HdBufferSpecVector const &bufferSpecs, HdBufferArrayUsageHint usageHint)
Constructor.
HDST_API size_t GetMaxNumElements() const override
Returns the maximum number of elements capacity.
HDST_API HdBufferSpecVector GetBufferSpecs() const
Reconstructs the bufferspecs and returns it (for buffer splitting)
HDST_API void CopyData(HdBufferSourceSharedPtr const &bufferSource) override
Copy source data into buffer.
size_t GetNumElements() const override
Returns the number of elements.
HDST_API HdBufferArrayUsageHint GetUsageHint() const override
Returns the usage hint from the underlying buffer array.
HDST_API void SetBufferArray(HdBufferArray *bufferArray) override
Sets the buffer array associated with this buffer;.
int GetCapacity() const
Returns the capacity of allocated area.
void SetNumElements(int numElements)
Set the number of elements for this range.
void IncrementVersion() override
Increment the version of the buffer array.
bool IsValid() const override
Returns true if this range is valid.
_StripedBufferArrayRange(HdStResourceRegistry *resourceRegistry)
Constructor.
HDST_API bool IsAssigned() const override
Returns true is the range has been assigned to a buffer.
int GetElementOffset() const override
Returns the relative element offset in aggregated buffer.
HDST_API void DebugDump(std::ostream &out) const override
Debug dump.
bool IsImmutable() const override
Returns true if this bar is marked as immutable.
HDST_API ~_StripedBufferArrayRange() override
Destructor.
HDST_API size_t GetMaxNumElements() const override
Returns the max number of elements.
HDST_API HdStBufferResourceNamedList const & GetResources() const override
Returns the list of all named GPU resources for this bufferArrayRange.
void SetElementOffset(int offset)
Set the relative offset for this range.
size_t GetVersion() const override
Returns the version of the buffer array.
bool RequiresStaging() const override
Returns true if this needs a staging buffer for CPU to GPU copies.
HDST_API HdStBufferResourceSharedPtr GetResource(TfToken const &name) override
Returns the named GPU resource.
HDST_API HdStBufferResourceSharedPtr GetResource() const override
Returns the GPU resource.
HDST_API VtValue ReadData(TfToken const &name) const override
Read back the buffer content.
void SetCapacity(int capacity)
Set the capacity of allocated area for this range.
HDST_API const void * _GetAggregation() const override
Returns the aggregation container.
HDST_API bool Resize(int numElements) override
Resize memory area for this range.
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...
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.
virtual HDST_API HdBufferArraySharedPtr CreateBufferArray(TfToken const &role, HdBufferSpecVector const &bufferSpecs, HdBufferArrayUsageHint usageHint)
Factory for creating HdBufferArray managed by HdStVBOMemoryManager aggregation.
virtual HDST_API HdBufferArrayRangeSharedPtr CreateBufferArrayRange()
Factory for creating HdBufferArrayRange managed by HdStVBOMemoryManager aggregation.
virtual HDST_API AggregationId ComputeAggregationId(HdBufferSpecVector const &bufferSpecs, HdBufferArrayUsageHint usageHint) const
Returns id for given bufferSpecs to be used for aggregation.
virtual HdBufferSpecVector GetBufferSpecs(HdBufferArraySharedPtr const &bufferArray) const
Returns the buffer specs from a given buffer array.
Token for efficient comparison, assignment, and hashing of known strings.
Definition: token.h:71
A map with string keys and VtValue values.
Definition: dictionary.h:43
Provides a container which may hold any type, and provides introspection and iteration over array typ...
Definition: value.h:152
Environment setting variable.
HdTupleType represents zero, one, or more values of the same HdType.
Definition: types.h:343