@@ -85,6 +85,11 @@ void ResourceRequirements::apply(const ResourceHints& resourceHints)
8585
8686 dataTransferHint = resourceHints.dataTransferHint ;
8787 viewportStateHint = resourceHints.viewportStateHint ;
88+
89+ bufferMemoryRequirements += resourceHints.bufferMemoryRequirements ;
90+ imageMemoryRequirements += resourceHints.imageMemoryRequirements ;
91+ dynamicData.add (resourceHints.dynamicData );
92+ containsPagedLOD = containsPagedLOD | resourceHints.containsPagedLOD ;
8893}
8994
9095// ////////////////////////////////////////////////////////////////////
@@ -104,6 +109,13 @@ ref_ptr<ResourceHints> CollectResourceRequirements::createResourceHints(uint32_t
104109 poolSize.descriptorCount = poolSize.descriptorCount * tileMultiplier;
105110 }
106111
112+ resourceHints->bufferMemoryRequirements = requirements.bufferMemoryRequirements ;
113+ resourceHints->imageMemoryRequirements = requirements.imageMemoryRequirements ;
114+ resourceHints->dynamicData = requirements.dynamicData ;
115+ resourceHints->containsPagedLOD = requirements.containsPagedLOD ;
116+
117+ resourceHints->noTraverseBelowResourceHints = true ;
118+
107119 return resourceHints;
108120}
109121
@@ -118,7 +130,7 @@ bool CollectResourceRequirements::checkForResourceHints(const Object& object)
118130 if (resourceHints)
119131 {
120132 apply (*resourceHints);
121- return true ;
133+ return resourceHints-> noTraverseBelowResourceHints ;
122134 }
123135 else
124136 {
@@ -133,23 +145,24 @@ void CollectResourceRequirements::apply(const ResourceHints& resourceHints)
133145
134146void CollectResourceRequirements::apply (const Node& node)
135147{
136- bool hasResourceHints = checkForResourceHints (node);
137- if (hasResourceHints) ++_numResourceHintsAbove;
148+ if (checkForResourceHints (node))
149+ {
150+ return ;
151+ }
138152
139153 node.traverse (*this );
140-
141- if (hasResourceHints) --_numResourceHintsAbove;
142154}
143155
144156void CollectResourceRequirements::apply (const PagedLOD& plod)
145157{
146- bool hasResourceHints = checkForResourceHints (plod);
147- if (hasResourceHints) ++_numResourceHintsAbove;
148-
149158 requirements.containsPagedLOD = true ;
150- plod.traverse (*this );
151159
152- if (hasResourceHints) --_numResourceHintsAbove;
160+ if (checkForResourceHints (plod))
161+ {
162+ return ;
163+ }
164+
165+ plod.traverse (*this );
153166}
154167
155168void CollectResourceRequirements::apply (const StateCommand& stateCommand)
@@ -302,21 +315,41 @@ void CollectResourceRequirements::apply(const BindIndexBuffer& bib)
302315
303316void CollectResourceRequirements::apply (ref_ptr<BufferInfo> bufferInfo)
304317{
305- if (bufferInfo && bufferInfo-> data && bufferInfo-> data -> dynamic () )
318+ if (bufferInfo && requirements. bufferInfos . count (bufferInfo)== 0 )
306319 {
307- requirements.dynamicData .bufferInfos .push_back (bufferInfo);
320+ requirements.bufferInfos .insert (bufferInfo);
321+
322+ if (bufferInfo->data )
323+ {
324+ if (bufferInfo->data ->dynamic ())
325+ {
326+ requirements.dynamicData .bufferInfos .push_back (bufferInfo);
327+ }
328+
329+ requirements.bufferMemoryRequirements += bufferInfo->data ->dataSize ();
330+ }
308331 }
309332}
310333
311334void CollectResourceRequirements::apply (ref_ptr<ImageInfo> imageInfo)
312335{
313- if (imageInfo && imageInfo-> imageView && imageInfo-> imageView -> image )
336+ if (imageInfo && requirements. imageInfos . count ( imageInfo)== 0 )
314337 {
315- // check for dynamic data
316- auto & data = imageInfo->imageView ->image ->data ;
317- if (data && data->dynamic ())
338+ if (imageInfo->imageView && imageInfo->imageView ->image )
318339 {
319- requirements.dynamicData .imageInfos .push_back (imageInfo);
340+ requirements.imageInfos .insert (imageInfo);
341+
342+ // check for dynamic data
343+ auto & data = imageInfo->imageView ->image ->data ;
344+ if (data)
345+ {
346+ if (data->dynamic ())
347+ {
348+ requirements.dynamicData .imageInfos .push_back (imageInfo);
349+ }
350+
351+ requirements.imageMemoryRequirements += data->dataSize ();
352+ }
320353 }
321354 }
322355}
0 commit comments