@@ -13,17 +13,29 @@ class Device final {
1313 // NOLINTNEXTLINE(performance-enum-size)
1414 enum class Features : uint64_t {
1515 TimelineSemaphore = 1ULL << 0 ,
16+ DynamicRendering = 1ULL << 1 ,
17+ Synchronization2 = 1ULL << 2 ,
1618 };
1719 using FeatureFlags = uint64_t ;
1820
21+ struct Capabilities {
22+ uint32_t api_version = VK_API_VERSION_1_0;
23+ FeatureFlags enabled_features = 0 ;
24+
25+ [[nodiscard]] bool has_feature (Features feature) const noexcept {
26+ return (enabled_features & static_cast <FeatureFlags>(feature)) != 0 ;
27+ }
28+ };
29+
1930 struct CreateInfo {
2031 VkInstance instance = VK_NULL_HANDLE;
2132 VkSurfaceKHR surface = VK_NULL_HANDLE;
2233 const VkAllocationCallbacks *allocator = nullptr ;
2334
2435 std::vector<const char *> required_extensions;
2536
26- FeatureFlags requested_features = 0 ;
37+ FeatureFlags required_features = 0 ;
38+ FeatureFlags preferred_features = 0 ;
2739 };
2840
2941 Device () = default ;
@@ -60,6 +72,10 @@ class Device final {
6072 return present_queue_family_index_;
6173 }
6274
75+ [[nodiscard]] const Capabilities &capabilities () const noexcept {
76+ return capabilities_;
77+ }
78+
6379private:
6480 struct DeviceSelection {
6581 VkPhysicalDevice physical_device{VK_NULL_HANDLE};
@@ -96,6 +112,7 @@ class Device final {
96112 uint32_t graphics_queue_family_index_ = 0 ;
97113 uint32_t present_queue_family_index_ = 0 ;
98114 const VkAllocationCallbacks *alloc_ = nullptr ;
115+ Capabilities capabilities_{};
99116};
100117
101118} // namespace quark::vk::details
0 commit comments