mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-10-26 21:44:53 +01:00
98 lines
2.8 KiB
C++
98 lines
2.8 KiB
C++
/*
|
|
This Source Code Form is subject to the
|
|
terms of the Mozilla Public License, v.
|
|
2.0. If a copy of the MPL was not
|
|
distributed with this file, You can
|
|
obtain one at
|
|
http://mozilla.org/MPL/2.0/.
|
|
*/
|
|
|
|
// the gpu the renderer runs on, and the VkDevice with its queues.
|
|
//
|
|
// the gpu is the one named by gfx.vulkan.device (its index in the list of the log, or a part of its name), or else the best
|
|
// usable one: discrete before integrated, then the one with more memory. a gpu missing something the renderer needs is
|
|
// turned down with the name of what it lacks
|
|
|
|
#pragma once
|
|
|
|
#include "rendering/vulkan14/vulkan14common.h"
|
|
#include "rendering/vulkan14/vulkan14capabilities.h"
|
|
|
|
namespace vk14
|
|
{
|
|
|
|
class instance;
|
|
|
|
struct queue_families
|
|
{
|
|
static constexpr std::uint32_t invalid{VK_QUEUE_FAMILY_IGNORED};
|
|
|
|
// graphics and presentation, from one family (every desktop driver has one)
|
|
std::uint32_t graphics{invalid};
|
|
// asynchronous compute and transfers; the graphics family where there's no family of their own
|
|
std::uint32_t compute{invalid};
|
|
std::uint32_t transfer{invalid};
|
|
bool dedicated_compute{false};
|
|
bool dedicated_transfer{false};
|
|
};
|
|
|
|
class device
|
|
{
|
|
public:
|
|
device() = default;
|
|
device(device const &) = delete;
|
|
device &operator=(device const &) = delete;
|
|
~device();
|
|
|
|
// picks the gpu. Surface: the window to show images in, null before there's one (the presentation is then asked of
|
|
// glfw). Verbose: every gpu and why it can't be used goes to the log. false: no usable gpu, Reason tells why
|
|
bool select(VkInstance Instance, VkSurfaceKHR Surface, std::string const &Wanted, bool const Verbose, std::string &Reason);
|
|
// makes the VkDevice of the gpu picked by select()
|
|
bool create(instance const &Instance, std::string &Reason);
|
|
void destroy();
|
|
|
|
VkPhysicalDevice physical() const
|
|
{
|
|
return m_physical;
|
|
}
|
|
VkDevice handle() const
|
|
{
|
|
return m_device;
|
|
}
|
|
capabilities const &caps() const
|
|
{
|
|
return m_capabilities;
|
|
}
|
|
queue_families const &families() const
|
|
{
|
|
return m_families;
|
|
}
|
|
VkQueue graphics_queue() const
|
|
{
|
|
return m_graphics_queue;
|
|
}
|
|
// VK_EXT_memory_budget is on (the allocator keeps to the budget of the heaps)
|
|
bool memory_budget_enabled() const
|
|
{
|
|
return m_memory_budget;
|
|
}
|
|
|
|
private:
|
|
static queue_families find_queue_families(VkInstance Instance, VkPhysicalDevice Physical, VkSurfaceKHR Surface, std::uint32_t &TimestampBits);
|
|
static std::uint64_t score(capabilities const &Caps);
|
|
|
|
VkPhysicalDevice m_physical{VK_NULL_HANDLE};
|
|
VkDevice m_device{VK_NULL_HANDLE};
|
|
capabilities m_capabilities;
|
|
queue_families m_families;
|
|
feature_chain m_queried;
|
|
bool m_portability_subset{false};
|
|
bool m_memory_budget{false};
|
|
|
|
VkQueue m_graphics_queue{VK_NULL_HANDLE};
|
|
VkQueue m_compute_queue{VK_NULL_HANDLE};
|
|
VkQueue m_transfer_queue{VK_NULL_HANDLE};
|
|
};
|
|
|
|
} // namespace vk14
|