Files
nova-engine/engine/src/render/render_device.cpp

66 lines
1.3 KiB
C++

/**
* Copyright (c) 2025, Jayden Grubb <contact@jaydengrubb.com>
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <nova/core/debug.h>
#include <nova/render/render_device.h>
#include <nova/render/render_driver.h>
#include <limits>
using namespace Nova;
u32 RenderDevice::choose_device(RenderDriver* p_driver, std::span<const SurfaceID> p_surfaces) {
NOVA_AUTO_TRACE();
u32 best_index = std::numeric_limits<u32>::max();
u32 best_score = 0;
const bool prefer_discrete = true; // TODO: Get from config
for (u32 i = 0; i < p_driver->get_device_count(); i++) {
auto& device = p_driver->get_device(i);
u32 score = 1;
for (SurfaceID surface : p_surfaces) {
if (!p_driver->get_device_supports_surface(i, surface)) {
score = 0;
break;
}
}
if (score == 0) {
continue;
}
switch (device.type) {
case Type::DISCRETE:
score += prefer_discrete ? 4 : 3;
break;
case Type::INTEGRATED:
score += prefer_discrete ? 3 : 4;
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;
}
}
if (best_index == std::numeric_limits<u32>::max()) {
throw std::runtime_error("No suitable render device found");
}
return best_index;
}