Skip to content

Commit bcf5e78

Browse files
committed
Moved DynamicData into ResourceHints.
1 parent f329721 commit bcf5e78

File tree

8 files changed

+119
-44
lines changed

8 files changed

+119
-44
lines changed

CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
cmake_minimum_required(VERSION 3.10)
22

33
project(vsg
4-
VERSION 1.1.13
4+
VERSION 1.1.14
55
DESCRIPTION "VulkanSceneGraph library"
66
LANGUAGES CXX
77
)
8-
set(VSG_SOVERSION 15)
8+
set(VSG_SOVERSION 16)
99
SET(VSG_RELEASE_CANDIDATE 0)
1010
set(Vulkan_MIN_VERSION 1.1.70.0)
1111

include/vsg/app/CompileManager.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ namespace vsg
3030
Slots maxSlots;
3131
bool containsPagedLOD = false;
3232
ResourceRequirements::Views views;
33-
ResourceRequirements::DynamicData dynamicData;
33+
DynamicData dynamicData;
3434

3535
explicit operator bool() const noexcept { return result == VK_SUCCESS; }
3636

include/vsg/app/TransferTask.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ namespace vsg
5151

5252
ref_ptr<Device> device;
5353

54-
void assign(const ResourceRequirements::DynamicData& dynamicData);
54+
void assign(const DynamicData& dynamicData);
5555
void assign(const BufferInfoList& bufferInfoList);
5656
void assign(const ImageInfoList& imageInfoList);
5757

include/vsg/state/ResourceHints.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
1414

1515
#include <vsg/maths/vec2.h>
1616
#include <vsg/vk/DescriptorPool.h>
17+
#include <vsg/state/BufferInfo.h>
18+
#include <vsg/state/ImageInfo.h>
1719

1820
namespace vsg
1921
{
@@ -30,6 +32,26 @@ namespace vsg
3032
DYNAMIC_VIEWPORTSTATE = 1 << 1
3133
};
3234

35+
struct DynamicData
36+
{
37+
BufferInfoList bufferInfos;
38+
ImageInfoList imageInfos;
39+
40+
explicit operator bool() const noexcept { return !bufferInfos.empty() || !imageInfos.empty(); }
41+
42+
void clear()
43+
{
44+
bufferInfos.clear();
45+
imageInfos.clear();
46+
}
47+
48+
void add(const DynamicData& dd)
49+
{
50+
bufferInfos.insert(bufferInfos.end(), dd.bufferInfos.begin(), dd.bufferInfos.end());
51+
imageInfos.insert(imageInfos.end(), dd.imageInfos.begin(), dd.imageInfos.end());
52+
}
53+
};
54+
3355
/// ResourceHints provides settings that help preallocation of Vulkan resources and memory.
3456
class VSG_DECLSPEC ResourceHints : public Inherit<Object, ResourceHints>
3557
{
@@ -56,6 +78,16 @@ namespace vsg
5678
DataTransferHint dataTransferHint = COMPILE_TRAVERSAL_USE_TRANSFER_TASK;
5779
uint32_t viewportStateHint = DYNAMIC_VIEWPORTSTATE;
5880

81+
VkDeviceSize bufferMemoryRequirements = 0;
82+
VkDeviceSize imageMemoryRequirements = 0;
83+
84+
DynamicData dynamicData;
85+
86+
bool containsPagedLOD = false;
87+
88+
/// hint whether CollectResourceRequirements visitor should traverse the subgraph below a node that has a "ResourceHints" assignd as meta data.
89+
bool noTraverseBelowResourceHints = false;
90+
5991
public:
6092
void read(Input& input) override;
6193
void write(Output& output) const override;

include/vsg/vk/ResourceRequirements.h

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -60,26 +60,6 @@ namespace vsg
6060
using Views = std::map<const View*, ViewDetails>;
6161
using ViewDetailStack = std::stack<ViewDetails>;
6262

63-
struct DynamicData
64-
{
65-
BufferInfoList bufferInfos;
66-
ImageInfoList imageInfos;
67-
68-
explicit operator bool() const noexcept { return !bufferInfos.empty() || !imageInfos.empty(); }
69-
70-
void clear()
71-
{
72-
bufferInfos.clear();
73-
imageInfos.clear();
74-
}
75-
76-
void add(const DynamicData& dd)
77-
{
78-
bufferInfos.insert(bufferInfos.end(), dd.bufferInfos.begin(), dd.bufferInfos.end());
79-
imageInfos.insert(imageInfos.end(), dd.imageInfos.begin(), dd.imageInfos.end());
80-
}
81-
};
82-
8363
DynamicData dynamicData;
8464

8565
Descriptors descriptors;
@@ -92,6 +72,12 @@ namespace vsg
9272
uint32_t externalNumDescriptorSets = 0;
9373
bool containsPagedLOD = false;
9474

75+
std::set<ref_ptr<BufferInfo>> bufferInfos;
76+
std::set<ref_ptr<ImageInfo>> imageInfos;
77+
78+
VkDeviceSize bufferMemoryRequirements = 0;
79+
VkDeviceSize imageMemoryRequirements = 0;
80+
9581
VkDeviceSize minimumBufferSize = 16 * 1024 * 1024;
9682
VkDeviceSize minimumDeviceMemorySize = 16 * 1024 * 1024;
9783

@@ -146,8 +132,6 @@ namespace vsg
146132
virtual void apply(ref_ptr<ImageInfo> imageInfo);
147133

148134
protected:
149-
uint32_t _numResourceHintsAbove = 0;
150-
151135
bool registerDescriptor(const Descriptor& descriptor);
152136
};
153137
VSG_type_name(vsg::CollectResourceRequirements);

src/vsg/app/TransferTask.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ void TransferTask::assignTransferConsumedCompletedSemaphore(TransferMask transfe
5151
if ((transferMask & TRANSFER_AFTER_RECORD_TRAVERSAL) != 0) _lateDataToCopy.transferConsumerCompletedSemaphore = semaphore;
5252
}
5353

54-
void TransferTask::assign(const ResourceRequirements::DynamicData& dynamicData)
54+
void TransferTask::assign(const DynamicData& dynamicData)
5555
{
5656
CPU_INSTRUMENTATION_L2(instrumentation);
5757

src/vsg/state/ResourceHints.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,19 @@ void ResourceHints::read(Input& input)
7474
{
7575
input.read("viewportStateHint", viewportStateHint);
7676
}
77+
78+
if (input.version_greater_equal(1, 1, 14))
79+
{
80+
input.read("bufferMemoryRequirements", bufferMemoryRequirements);
81+
input.read("imageMemoryRequirements", imageMemoryRequirements);
82+
83+
input.readObjects("dynamicData.bufferInfos", dynamicData.bufferInfos);
84+
input.readObjects("dynamicData.imageInfos", dynamicData.imageInfos);
85+
86+
input.read("containsPagedLOD", containsPagedLOD);
87+
88+
input.read("noTraverseBelowResourceHints", noTraverseBelowResourceHints);
89+
}
7790
}
7891

7992
void ResourceHints::write(Output& output) const
@@ -127,4 +140,17 @@ void ResourceHints::write(Output& output) const
127140
{
128141
output.write("viewportStateHint", viewportStateHint);
129142
}
143+
144+
if (output.version_greater_equal(1, 1, 14))
145+
{
146+
output.write("bufferMemoryRequirements", bufferMemoryRequirements);
147+
output.write("imageMemoryRequirements", imageMemoryRequirements);
148+
149+
output.writeObjects("dynamicData.bufferInfos", dynamicData.bufferInfos);
150+
output.writeObjects("dynamicData.imageInfos", dynamicData.imageInfos);
151+
152+
output.write("containsPagedLOD", containsPagedLOD);
153+
154+
output.write("noTraverseBelowResourceHints", noTraverseBelowResourceHints);
155+
}
130156
}

src/vsg/vk/ResourceRequirements.cpp

Lines changed: 50 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

134146
void 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

144156
void 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

155168
void CollectResourceRequirements::apply(const StateCommand& stateCommand)
@@ -302,21 +315,41 @@ void CollectResourceRequirements::apply(const BindIndexBuffer& bib)
302315

303316
void 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

311334
void 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

Comments
 (0)