Skip to content

Commit 0915da2

Browse files
committed
Added ability to query available memory
1 parent bcf5e78 commit 0915da2

File tree

4 files changed

+71
-4
lines changed

4 files changed

+71
-4
lines changed

include/vsg/app/CompileManager.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,19 @@ namespace vsg
6565

6666
using ContextSelectionFunction = std::function<bool(vsg::Context&)>;
6767

68+
/// return the smallest available memory on the associated devices
69+
VkDeviceSize availableMemory(ContextSelectionFunction contextSelection = {}) const;
70+
6871
/// compile object
6972
CompileResult compile(ref_ptr<Object> object, ContextSelectionFunction contextSelection = {});
7073

7174
/// compile all the command graphs in a task
7275
CompileResult compileTask(ref_ptr<RecordAndSubmitTask> task, const ResourceRequirements& resourceRequirements = {});
7376

7477
protected:
78+
79+
std::list<ref_ptr<Context>> contexts;
80+
7581
using CompileTraversals = ThreadSafeQueue<ref_ptr<CompileTraversal>>;
7682
size_t numCompileTraversals = 0;
7783
ref_ptr<CompileTraversals> compileTraversals;

include/vsg/vk/Device.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ namespace vsg
8484
/// return true if Device was created with specified extension
8585
bool supportsDeviceExtension(const char* extensionName) const;
8686

87+
/// return the amount of memory available in deviceMemoryBufferPools and allocatable on device
88+
VkDeviceSize availableMemory() const;
89+
8790
// provide observer_ptr to memory buffer and descriptor pools so that these can be accessed when required
8891
observer_ptr<MemoryBufferPools> deviceMemoryBufferPools;
8992
observer_ptr<MemoryBufferPools> stagingMemoryBufferPools;

src/vsg/app/CompileManager.cpp

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ CompileManager::CompileManager(Viewer& viewer, ref_ptr<ResourceHints> hints)
8282
#else
8383
numCompileTraversals = 1;
8484
#endif
85+
86+
contexts = ct->contexts;
8587
}
8688

8789
CompileManager::CompileTraversals::container_type CompileManager::takeCompileTraversals(size_t count)
@@ -106,6 +108,8 @@ void CompileManager::add(ref_ptr<Device> device, const ResourceRequirements& res
106108
{
107109
ct->add(device, resourceRequirements);
108110

111+
contexts = ct->contexts;
112+
109113
compileTraversals->add(ct);
110114
}
111115
}
@@ -117,6 +121,8 @@ void CompileManager::add(Window& window, ref_ptr<ViewportState> viewport, const
117121
{
118122
ct->add(window, viewport, resourceRequirements);
119123

124+
contexts = ct->contexts;
125+
120126
compileTraversals->add(ct);
121127
}
122128
}
@@ -128,6 +134,8 @@ void CompileManager::add(Window& window, ref_ptr<View> view, const ResourceRequi
128134
{
129135
ct->add(window, view, resourceRequirements);
130136

137+
contexts = ct->contexts;
138+
131139
compileTraversals->add(ct);
132140
}
133141
}
@@ -139,6 +147,8 @@ void CompileManager::add(Framebuffer& framebuffer, ref_ptr<View> view, const Res
139147
{
140148
ct->add(framebuffer, view, resourceRequirements);
141149

150+
contexts = ct->contexts;
151+
142152
compileTraversals->add(ct);
143153
}
144154
}
@@ -150,6 +160,8 @@ void CompileManager::add(const Viewer& viewer, const ResourceRequirements& resou
150160
{
151161
ct->add(viewer, resourceRequirements);
152162

163+
contexts = ct->contexts;
164+
153165
compileTraversals->add(ct);
154166
}
155167
}
@@ -165,6 +177,30 @@ void CompileManager::assignInstrumentation(ref_ptr<Instrumentation> in_instrumen
165177
}
166178
}
167179

180+
VkDeviceSize CompileManager::availableMemory(ContextSelectionFunction contextSelection) const
181+
{
182+
VkDeviceSize minAvailable = std::numeric_limits<VkDeviceSize>::max();
183+
184+
if (contextSelection)
185+
{
186+
for (auto& context : contexts)
187+
{
188+
if (contextSelection(*context)) minAvailable = std::min(minAvailable, context->device->availableMemory());
189+
}
190+
}
191+
else
192+
{
193+
for (auto& context : contexts)
194+
{
195+
minAvailable = std::min(minAvailable, context->device->availableMemory());
196+
}
197+
}
198+
199+
vsg::info("CompileManager::availableMemory() = ", minAvailable);
200+
201+
return minAvailable;
202+
}
203+
168204
CompileResult CompileManager::compile(ref_ptr<Object> object, ContextSelectionFunction contextSelection)
169205
{
170206
vsg::debug("CompileManager::compile(", object, ", ..)");
@@ -241,18 +277,18 @@ CompileResult CompileManager::compile(ref_ptr<Object> object, ContextSelectionFu
241277

242278
if (contextSelection)
243279
{
244-
std::list<ref_ptr<Context>> contexts;
280+
std::list<ref_ptr<Context>> activeContexts;
245281

246282
for (auto& context : compileTraversal->contexts)
247283
{
248-
if (contextSelection(*context)) contexts.push_back(context);
284+
if (contextSelection(*context)) activeContexts.push_back(context);
249285
}
250286

251-
compileTraversal->contexts.swap(contexts);
287+
compileTraversal->contexts.swap(activeContexts);
252288

253289
run_compile_traversal();
254290

255-
compileTraversal->contexts.swap(contexts);
291+
compileTraversal->contexts.swap(activeContexts);
256292
}
257293
else
258294
{

src/vsg/vk/Device.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,3 +205,25 @@ bool Device::supportsDeviceExtension(const char* extensionName) const
205205
auto compare = [&](const char* rhs) { return strcmp(extensionName, rhs) == 0; };
206206
return (std::find_if(enabledExtensions.begin(), enabledExtensions.end(), compare) != enabledExtensions.end());
207207
}
208+
209+
VkDeviceSize Device::availableMemory() const
210+
{
211+
VkDeviceSize available = 0;
212+
#if 0
213+
VkPhysicalDeviceMemoryBudgetPropertiesEXT memoryBudget;
214+
memoryBudget.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT;
215+
memoryBudget.pNext = nullptr;
216+
217+
VkPhysicalDeviceMemoryProperties2 memoryProperties;
218+
memoryProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2;
219+
memoryProperties.pNext = &memoryBudget;
220+
221+
vkGetPhysicalDeviceMemoryProperties2(*(device->getPhysicalDevice()), &memoryProperties);
222+
#endif
223+
if (auto pool = deviceMemoryBufferPools.ref_ptr())
224+
{
225+
available += pool->computeMemoryTotalAvailable();
226+
}
227+
228+
return available;
229+
}

0 commit comments

Comments
 (0)