Add RenderDevice struct and driver accessor functions

This commit is contained in:
2025-03-15 18:01:57 +10:00
parent d91275c393
commit f979b782cc
4 changed files with 66 additions and 0 deletions

View File

@@ -0,0 +1,25 @@
/**
* Copyright (c) 2025, Jayden Grubb <contact@jaydengrubb.com>
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#pragma once
#include <nova/api.h>
#include <nova/types.h>
#include <string>
namespace Nova {
struct NOVA_API RenderDevice {
enum class Vendor { UNKNOWN = 0, INTEL = 0x8086, AMD = 0x1002, NVIDIA = 0x10de };
enum class Type { OTHER = 0, INTEGRATED = 1, DISCRETE = 2, VIRTUAL = 3, CPU = 4 };
std::string name;
Vendor vendor;
Type type;
u32 deviceID;
void* handle;
};
} // namespace Nova

View File

@@ -8,6 +8,7 @@
#include <nova/api.h> #include <nova/api.h>
#include <nova/render/render_api.h> #include <nova/render/render_api.h>
#include <nova/render/render_device.h>
#include <nova/types.h> #include <nova/types.h>
namespace Nova { namespace Nova {
@@ -17,5 +18,8 @@ namespace Nova {
[[nodiscard]] virtual RenderAPI get_api() const = 0; [[nodiscard]] virtual RenderAPI get_api() const = 0;
[[nodiscard]] virtual u32 get_api_version() const = 0; [[nodiscard]] virtual u32 get_api_version() const = 0;
[[nodiscard]] virtual u32 get_device_count() const = 0;
[[nodiscard]] virtual const RenderDevice& get_device(u32 index) const = 0;
}; };
} // namespace Nova } // namespace Nova

View File

@@ -25,6 +25,7 @@ VulkanRenderDriver::VulkanRenderDriver() {
_check_extensions(); _check_extensions();
_check_layers(); _check_layers();
_init_instance(); _init_instance();
_init_devices();
} }
VulkanRenderDriver::~VulkanRenderDriver() { VulkanRenderDriver::~VulkanRenderDriver() {
@@ -42,6 +43,14 @@ u32 VulkanRenderDriver::get_api_version() const {
return version; return version;
} }
u32 VulkanRenderDriver::get_device_count() const {
return m_devices.size();
}
const RenderDevice& VulkanRenderDriver::get_device(const u32 index) const {
return m_devices[index];
}
void VulkanRenderDriver::_check_version() const { void VulkanRenderDriver::_check_version() const {
NOVA_AUTO_TRACE(); NOVA_AUTO_TRACE();
@@ -160,6 +169,29 @@ void VulkanRenderDriver::_init_instance() {
NOVA_LOG("VkInstance created"); NOVA_LOG("VkInstance created");
} }
void VulkanRenderDriver::_init_devices() {
NOVA_AUTO_TRACE();
u32 count;
vkEnumeratePhysicalDevices(m_instance, &count, nullptr); // TODO: Check result
std::vector<VkPhysicalDevice> devices(count);
vkEnumeratePhysicalDevices(m_instance, &count, devices.data()); // TODO: Check result
m_devices.reserve(count);
for (const auto& device : devices) {
VkPhysicalDeviceProperties properties;
vkGetPhysicalDeviceProperties(device, &properties);
m_devices.emplace_back();
m_devices.back().name = properties.deviceName;
m_devices.back().vendor = static_cast<RenderDevice::Vendor>(properties.vendorID);
m_devices.back().type = static_cast<RenderDevice::Type>(properties.deviceType);
m_devices.back().deviceID = properties.deviceID;
m_devices.back().handle = device;
}
}
VkAllocationCallbacks* VulkanRenderDriver::_get_allocator(const VkObjectType type) { VkAllocationCallbacks* VulkanRenderDriver::_get_allocator(const VkObjectType type) {
// TODO: Add custom allocator // TODO: Add custom allocator
(void)type; (void)type;

View File

@@ -20,16 +20,21 @@ namespace Nova {
[[nodiscard]] RenderAPI get_api() const override; [[nodiscard]] RenderAPI get_api() const override;
[[nodiscard]] u32 get_api_version() const override; [[nodiscard]] u32 get_api_version() const override;
[[nodiscard]] u32 get_device_count() const override;
[[nodiscard]] const RenderDevice& get_device(u32 index) const override;
private: private:
VkInstance m_instance = VK_NULL_HANDLE; VkInstance m_instance = VK_NULL_HANDLE;
std::vector<const char*> m_extensions; std::vector<const char*> m_extensions;
std::vector<const char*> m_layers; std::vector<const char*> m_layers;
std::vector<RenderDevice> m_devices;
void _check_version() const; void _check_version() const;
void _check_extensions(); void _check_extensions();
void _check_layers(); void _check_layers();
void _init_instance(); void _init_instance();
void _init_devices();
static VkAllocationCallbacks* _get_allocator(VkObjectType type); static VkAllocationCallbacks* _get_allocator(VkObjectType type);
}; };