From 4e47c975391596e3595fe864b756381da1a1fe94 Mon Sep 17 00:00:00 2001 From: Jayden Grubb Date: Thu, 27 Mar 2025 15:07:24 +1000 Subject: [PATCH] Move VulkanRenderDriver::_pick_device to RenderDevice::choose_device --- engine/CMakeLists.txt | 1 + engine/include/nova/render/render_device.h | 5 ++- engine/src/drivers/vulkan/render_driver.cpp | 35 +---------------- engine/src/drivers/vulkan/render_driver.h | 1 - engine/src/render/render_device.cpp | 43 +++++++++++++++++++++ 5 files changed, 49 insertions(+), 36 deletions(-) create mode 100644 engine/src/render/render_device.cpp diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index fdb7f31..80486b4 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -24,6 +24,7 @@ set(ENGINE_SRC core/debug.cpp drivers/vulkan/render_driver.cpp render/renderer.cpp + render/render_device.cpp ) list(TRANSFORM ENGINE_SRC PREPEND ${CMAKE_CURRENT_SOURCE_DIR}/src/) diff --git a/engine/include/nova/render/render_device.h b/engine/include/nova/render/render_device.h index 73e8cd8..d0d75cc 100644 --- a/engine/include/nova/render/render_device.h +++ b/engine/include/nova/render/render_device.h @@ -10,9 +10,10 @@ #include #include +#include namespace Nova { - struct NOVA_API RenderDevice { + struct RenderDevice { static constexpr u32 AUTO = static_cast(-1); enum class Vendor { UNKNOWN = 0, INTEL = 0x8086, AMD = 0x1002, NVIDIA = 0x10de }; enum class Type { OTHER = 0, INTEGRATED = 1, DISCRETE = 2, VIRTUAL = 3, CPU = 4 }; @@ -22,5 +23,7 @@ namespace Nova { Type type; u32 deviceID; void* handle; + + NOVA_API static u32 choose_device(const std::vector& devices); }; } // namespace Nova diff --git a/engine/src/drivers/vulkan/render_driver.cpp b/engine/src/drivers/vulkan/render_driver.cpp index 9238f53..0e64cc9 100644 --- a/engine/src/drivers/vulkan/render_driver.cpp +++ b/engine/src/drivers/vulkan/render_driver.cpp @@ -77,7 +77,7 @@ void VulkanRenderDriver::create_device(u32 index) { NOVA_ASSERT(!m_device); if (index == RenderDevice::AUTO) { - index = _pick_device(); + index = RenderDevice::choose_device(m_devices); } else { NOVA_ASSERT(index < m_devices.size()); } @@ -241,39 +241,6 @@ void VulkanRenderDriver::_init_hardware() { } } -u32 VulkanRenderDriver::_pick_device() const { - NOVA_AUTO_TRACE(); - - u32 best_index = 0; - u32 best_score = 0; - - for (u32 i = 0; i < m_devices.size(); i++) { - u32 score = 0; - switch (m_devices[i].type) { - case RenderDevice::Type::DISCRETE: - score += 4; - break; - case RenderDevice::Type::INTEGRATED: - score += 3; - break; - case RenderDevice::Type::VIRTUAL: - score += 2; - break; - case RenderDevice::Type::CPU: - score += 1; - break; - default: - break; - } - if (score > best_score) { - best_index = i; - best_score = score; - } - } - - return best_index; -} - void VulkanRenderDriver::_check_device_extensions() { NOVA_AUTO_TRACE(); diff --git a/engine/src/drivers/vulkan/render_driver.h b/engine/src/drivers/vulkan/render_driver.h index dd74b18..df26bd3 100644 --- a/engine/src/drivers/vulkan/render_driver.h +++ b/engine/src/drivers/vulkan/render_driver.h @@ -43,7 +43,6 @@ namespace Nova { void _init_instance(); void _init_hardware(); - u32 _pick_device() const; void _check_device_extensions(); void _check_device_features(); void _init_queues(std::vector& queues) const; diff --git a/engine/src/render/render_device.cpp b/engine/src/render/render_device.cpp new file mode 100644 index 0000000..ea364fd --- /dev/null +++ b/engine/src/render/render_device.cpp @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2025, Jayden Grubb + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include + +using namespace Nova; + +u32 RenderDevice::choose_device(const std::vector& devices) { + NOVA_AUTO_TRACE(); + + u32 best_index = 0; + u32 best_score = 0; + + for (u32 i = 0; i < devices.size(); i++) { + u32 score = 0; + switch (devices[i].type) { + case Type::DISCRETE: + score += 4; + break; + case Type::INTEGRATED: + score += 3; + break; + case Type::VIRTUAL: + score += 2; + break; + case Type::CPU: + score += 1; + break; + default: + break; + } + if (score > best_score) { + best_index = i; + best_score = score; + } + } + + return best_index; +}