Skip to content

Commit 9dc98f0

Browse files
committed
Add device extension query to common library
1 parent 17190a7 commit 9dc98f0

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

source_common/framework/manual_functions.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,42 @@ std::vector<std::string> getInstanceExtensionList(
215215
return foundExtensions;
216216
}
217217

218+
/* See header for documentation. */
219+
std::vector<std::string> getDeviceExtensionList(
220+
VkInstance instance,
221+
VkPhysicalDevice physicalDevice,
222+
const VkDeviceCreateInfo* pCreateInfo
223+
) {
224+
std::vector<std::string> foundExtensions;
225+
226+
// Fetch the functions needed to query extensions availability
227+
auto* chainInfo = getChainInfo(pCreateInfo);
228+
auto fpGetProcAddr = chainInfo->u.pLayerInfo->pfnNextGetInstanceProcAddr;
229+
auto fpGetExtensionsRaw = fpGetProcAddr(instance, "vkEnumerateDeviceExtensionProperties");
230+
auto fpGetExtensions = reinterpret_cast<PFN_vkEnumerateDeviceExtensionProperties>(fpGetExtensionsRaw);
231+
if (!fpGetExtensions)
232+
{
233+
return foundExtensions;
234+
}
235+
236+
// Query number of extensions
237+
uint32_t count;
238+
fpGetExtensions(physicalDevice, nullptr, &count, nullptr);
239+
240+
// Reserve memory for, and then query, the extensions
241+
std::vector<VkExtensionProperties> extensions;
242+
extensions.resize(count);
243+
fpGetExtensions(physicalDevice, nullptr, &count, extensions.data());
244+
245+
// Build the function return list
246+
for (uint32_t i = 0; i < count; i++)
247+
{
248+
foundExtensions.emplace_back(extensions[i].extensionName);
249+
}
250+
251+
return foundExtensions;
252+
}
253+
218254
/* See header for documentation. */
219255
bool isInExtensionList(
220256
const std::string& target,

source_common/framework/manual_functions.hpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,20 @@ PFN_vkVoidFunction getDeviceLayerFunction(
119119
std::vector<std::string> getInstanceExtensionList(
120120
const VkInstanceCreateInfo* pCreateInfo);
121121

122+
/**
123+
* @brief Fetch the list of supported extensions from a physical device.
124+
*
125+
* @param instance The instance we are connected to.
126+
* @param physicalDevice The physical device to query.
127+
* @param pCreateInfo The device creation data from the loader.
128+
*
129+
* @return The list of supported extensions; empty list on failure.
130+
*/
131+
std::vector<std::string> getDeviceExtensionList(
132+
VkInstance instance,
133+
VkPhysicalDevice physicalDevice,
134+
const VkDeviceCreateInfo* pCreateInfo);
135+
122136
/**
123137
* @brief Is an extension in the passed extension list.
124138
*

0 commit comments

Comments
 (0)