PixelBullet  0.0.1
A C++ game engine
Loading...
Searching...
No Matches
physical_device_internal.h
1#pragma once
2
3#include <volk.h>
4
5#include <cstdint>
6#include <optional>
7#include <string>
8#include <string_view>
9#include <vector>
10
11namespace pixelbullet
12{
13enum class GraphicsDevicePreference : uint8_t;
14}
15
16namespace pixelbullet::graphics_internal
17{
18inline constexpr uint32_t k_supported_vulkan_api_version = VK_API_VERSION_1_3;
19
21{
22 uint32_t graphics_family = 0;
23 uint32_t present_family = 0;
24 std::optional<uint32_t> compute_family;
25 std::optional<uint32_t> transfer_family;
26};
27
29{
30 bool is_compatible = false;
31 uint32_t score = 0;
32 std::vector<std::string> rejection_reasons;
33 std::optional<ResolvedQueueFamilies> queue_families;
34};
35
37{
38 std::optional<std::size_t> selected_index;
39 bool matched_preference = false;
40 bool exact_index_requested = false;
41 bool exact_index_in_range = false;
42};
43
45{
46 GraphicsDevicePreference preference;
47 std::optional<std::size_t> exact_device_index;
48};
49
51{
52 VkPhysicalDevice device = VK_NULL_HANDLE;
53 VkPhysicalDeviceProperties properties = {};
54 std::vector<VkExtensionProperties> available_extensions;
56 bool matches_preference = false;
57 bool selected = false;
58};
59
61{
62 std::vector<PhysicalDeviceDiagnosticsEntry> entries;
63 std::optional<std::size_t> selected_index;
64 bool matched_preference = false;
65 PhysicalDeviceSelectionResult selection_result;
66};
67
68std::string FormatVulkanApiVersion(uint32_t version);
69std::string_view DescribeGraphicsDevicePreference(GraphicsDevicePreference preference) noexcept;
70std::string_view DescribePhysicalDeviceType(VkPhysicalDeviceType device_type) noexcept;
71const std::vector<const char*>& GetRequiredGraphicsDeviceExtensions() noexcept;
72
73std::optional<ResolvedQueueFamilies> ResolveQueueFamilies(const std::vector<VkQueueFamilyProperties>& queue_family_properties,
74 const std::vector<VkBool32>& present_support) noexcept;
75
76bool MatchesGraphicsDevicePreference(VkPhysicalDeviceType device_type, GraphicsDevicePreference preference) noexcept;
77
78PhysicalDeviceCompatibilityEvaluation EvaluatePhysicalDeviceCompatibility(
79 const VkPhysicalDeviceProperties& properties, const std::vector<VkExtensionProperties>& available_extensions,
80 const std::vector<const char*>& required_extensions, const std::vector<VkQueueFamilyProperties>& queue_family_properties,
81 const std::vector<VkBool32>& present_support, uint32_t surface_format_count, uint32_t present_mode_count);
82
83PhysicalDeviceSelectionResult ChooseCompatiblePhysicalDevice(const std::vector<VkPhysicalDeviceProperties>& properties,
84 const std::vector<PhysicalDeviceCompatibilityEvaluation>& evaluations,
85 PhysicalDeviceSelectionRequest selection_request) noexcept;
86
87std::optional<std::size_t>
88ChooseBestCompatiblePhysicalDeviceIndex(const std::vector<PhysicalDeviceCompatibilityEvaluation>& evaluations) noexcept;
89
90PhysicalDeviceDiagnosticsReport BuildPhysicalDeviceDiagnosticsReport(
91 const std::vector<VkPhysicalDevice>& devices, const std::vector<VkPhysicalDeviceProperties>& properties,
92 const std::vector<std::vector<VkExtensionProperties>>& available_extensions,
93 const std::vector<PhysicalDeviceCompatibilityEvaluation>& evaluations, PhysicalDeviceSelectionRequest selection_request);
94
95PhysicalDeviceDiagnosticsReport EnumeratePhysicalDeviceDiagnostics(VkInstance instance, VkSurfaceKHR surface,
96 PhysicalDeviceSelectionRequest selection_request);
97
98std::string BuildUnsupportedPhysicalDeviceMessage(std::size_t enumerated_device_count);
99std::string BuildRequestedPhysicalDeviceOutOfRangeMessage(std::size_t requested_index, std::size_t enumerated_device_count);
100std::string BuildRequestedPhysicalDeviceIncompatibleMessage(std::size_t requested_index, const VkPhysicalDeviceProperties& properties,
101 const std::vector<std::string>& rejection_reasons);
102} // namespace pixelbullet::graphics_internal
Definition physical_device_internal.h:21