Skip to content

Commit a8f4dbb

Browse files
committed
store a reference to a coresponding profile in CVulkanPhysicalDevice, write information about available extensions
1 parent 92fd0f0 commit a8f4dbb

File tree

3 files changed

+19
-6
lines changed

3 files changed

+19
-6
lines changed

src/nbl/video/CVulkanConnection.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,8 @@ core::smart_refctd_ptr<CVulkanConnection> CVulkanConnection::create(core::smart_
300300
api->m_vulkanProfiles.reserve(vk_physicalDevices.size());
301301
for (auto vk_physicalDevice : vk_physicalDevices)
302302
{
303-
auto device = CVulkanPhysicalDevice::create(core::smart_refctd_ptr(sys),api.get(),api->m_rdoc_api,vk_physicalDevice);
303+
auto& profile = api->m_vulkanProfiles.emplace_back();
304+
auto device = CVulkanPhysicalDevice::create(core::smart_refctd_ptr(sys),api.get(),api->m_rdoc_api,vk_physicalDevice, profile);
304305
if (!device)
305306
{
306307
LOG(api->getDebugCallback()->getLogger(), "Vulkan device %p found but doesn't meet minimum Nabla requirements. Skipping!", system::ILogger::ELL_WARNING, vk_physicalDevice);

src/nbl/video/CVulkanPhysicalDevice.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#include "nbl/video/CVulkanPhysicalDevice.h"
22
#include "nbl/video/CVulkanLogicalDevice.h"
33

4+
#include "nlohmann/json.hpp" // TODO/FIXME: this is probably a mess making, consult someone how to do it better.
5+
46
namespace nbl::video
57
{
68

@@ -10,7 +12,7 @@ do { \
1012
return nullptr; \
1113
} while(0)
1214

13-
std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart_refctd_ptr<system::ISystem>&& sys, IAPIConnection* const api, renderdoc_api_t* const rdoc, const VkPhysicalDevice vk_physicalDevice)
15+
std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart_refctd_ptr<system::ISystem>&& sys, IAPIConnection* const api, renderdoc_api_t* const rdoc, const VkPhysicalDevice vk_physicalDevice, core::string& profile)
1416
{
1517
system::logger_opt_ptr logger = api->getDebugCallback()->getLogger();
1618

@@ -25,6 +27,8 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
2527
}
2628
});
2729

30+
using json = nlohmann::json;
31+
json profileObject = { {"$schema", "https://schema.khronos.org/vulkan/profiles-0.8-latest.json"} };
2832

2933
auto& properties = initData.properties;
3034
auto& features = initData.features;
@@ -263,7 +267,10 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
263267
assert(VK_SUCCESS==res);
264268

265269
for (const auto& vk_extension : vk_extensions)
270+
{
271+
profileObject["capabilities"]["device"]["extensions"][vk_extension.extensionName] = vk_extension.specVersion;
266272
availableFeatureSet.insert(vk_extension.extensionName);
273+
}
267274
}
268275
auto isExtensionSupported = [&availableFeatureSet](const char* name)->bool
269276
{
@@ -1366,8 +1373,10 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
13661373
// bufferUsages.opticalFlowCost = anyFlag(bufferFeatures,VK_FORMAT_FEATURE_2_OPTICAL_FLOW_COST_BIT_NV);
13671374
}
13681375

1376+
profile = profileObject.dump(4); // nicely indented json
1377+
13691378
success = true;
1370-
return std::unique_ptr<CVulkanPhysicalDevice>(new CVulkanPhysicalDevice(std::move(initData),rdoc,vk_physicalDevice,std::move(availableFeatureSet)));
1379+
return std::unique_ptr<CVulkanPhysicalDevice>(new CVulkanPhysicalDevice(std::move(initData),rdoc,vk_physicalDevice,std::move(availableFeatureSet),profile));
13711380
}
13721381

13731382
#undef RETURN_NULL_PHYSICAL_DEVICE

src/nbl/video/CVulkanPhysicalDevice.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,17 @@ namespace nbl::video
1212
class CVulkanPhysicalDevice final : public IPhysicalDevice
1313
{
1414
public:
15-
static std::unique_ptr<CVulkanPhysicalDevice> create(core::smart_refctd_ptr<system::ISystem>&& sys, IAPIConnection* const api, renderdoc_api_t* const rdoc, const VkPhysicalDevice vk_physicalDevice);
15+
static std::unique_ptr<CVulkanPhysicalDevice> create(core::smart_refctd_ptr<system::ISystem>&& sys, IAPIConnection* const api, renderdoc_api_t* const rdoc, const VkPhysicalDevice vk_physicalDevice, core::string& profile);
1616

1717
inline VkPhysicalDevice getInternalObject() const { return m_vkPhysicalDevice; }
1818

1919
inline E_API_TYPE getAPIType() const override { return EAT_VULKAN; }
2020

21+
inline const core::string& getProfile() const { return m_profile; }
22+
2123
protected:
22-
inline CVulkanPhysicalDevice(IPhysicalDevice::SInitData&& _initData, renderdoc_api_t* const rdoc, const VkPhysicalDevice vk_physicalDevice, core::unordered_set<std::string>&& _extensions)
23-
: IPhysicalDevice(std::move(_initData)), m_rdoc_api(rdoc), m_vkPhysicalDevice(vk_physicalDevice), m_extensions(std::move(_extensions)) {}
24+
inline CVulkanPhysicalDevice(IPhysicalDevice::SInitData&& _initData, renderdoc_api_t* const rdoc, const VkPhysicalDevice vk_physicalDevice, core::unordered_set<std::string>&& _extensions, core::string& profile)
25+
: IPhysicalDevice(std::move(_initData)), m_rdoc_api(rdoc), m_vkPhysicalDevice(vk_physicalDevice), m_extensions(std::move(_extensions)), m_profile(profile) {}
2426

2527
//! This function makes sure requirements of a requested feature is also set to `true` in SPhysicalDeviceFeatures
2628
//! Note that this will only fix what is exposed, some may require extensions not exposed currently, that will happen later on.
@@ -115,6 +117,7 @@ class CVulkanPhysicalDevice final : public IPhysicalDevice
115117
renderdoc_api_t* const m_rdoc_api;
116118
const VkPhysicalDevice m_vkPhysicalDevice;
117119

120+
core::string& m_profile;
118121
const core::unordered_set<std::string> m_extensions;
119122
};
120123

0 commit comments

Comments
 (0)