mirror of
https://gitlab.com/suyu-emu/suyu.git
synced 2024-03-15 23:15:44 +00:00
cd016d3cb5
Some system configurations may see visual regressions or lower performance using GPU decoding compared to CPU decoding. This setting provides the option for users to specify their decoding preference. Co-Authored-By: yzct12345 <87620833+yzct12345@users.noreply.github.com>
64 lines
2.4 KiB
C++
64 lines
2.4 KiB
C++
// Copyright 2014 Citra Emulator Project
|
|
// Licensed under GPLv2 or any later version
|
|
// Refer to the license.txt file included.
|
|
|
|
#include <memory>
|
|
|
|
#include "common/logging/log.h"
|
|
#include "common/settings.h"
|
|
#include "core/core.h"
|
|
#include "video_core/renderer_base.h"
|
|
#include "video_core/renderer_opengl/renderer_opengl.h"
|
|
#include "video_core/renderer_vulkan/renderer_vulkan.h"
|
|
#include "video_core/video_core.h"
|
|
|
|
namespace {
|
|
|
|
std::unique_ptr<VideoCore::RendererBase> CreateRenderer(
|
|
Core::System& system, Core::Frontend::EmuWindow& emu_window, Tegra::GPU& gpu,
|
|
std::unique_ptr<Core::Frontend::GraphicsContext> context) {
|
|
auto& telemetry_session = system.TelemetrySession();
|
|
auto& cpu_memory = system.Memory();
|
|
|
|
switch (Settings::values.renderer_backend.GetValue()) {
|
|
case Settings::RendererBackend::OpenGL:
|
|
return std::make_unique<OpenGL::RendererOpenGL>(telemetry_session, emu_window, cpu_memory,
|
|
gpu, std::move(context));
|
|
case Settings::RendererBackend::Vulkan:
|
|
return std::make_unique<Vulkan::RendererVulkan>(telemetry_session, emu_window, cpu_memory,
|
|
gpu, std::move(context));
|
|
default:
|
|
return nullptr;
|
|
}
|
|
}
|
|
|
|
} // Anonymous namespace
|
|
|
|
namespace VideoCore {
|
|
|
|
std::unique_ptr<Tegra::GPU> CreateGPU(Core::Frontend::EmuWindow& emu_window, Core::System& system) {
|
|
const auto nvdec_value = Settings::values.nvdec_emulation.GetValue();
|
|
const bool use_nvdec = nvdec_value != Settings::NvdecEmulation::Off;
|
|
const bool use_async = Settings::values.use_asynchronous_gpu_emulation.GetValue();
|
|
auto gpu = std::make_unique<Tegra::GPU>(system, use_async, use_nvdec);
|
|
auto context = emu_window.CreateSharedContext();
|
|
auto scope = context->Acquire();
|
|
try {
|
|
auto renderer = CreateRenderer(system, emu_window, *gpu, std::move(context));
|
|
gpu->BindRenderer(std::move(renderer));
|
|
return gpu;
|
|
} catch (const std::runtime_error& exception) {
|
|
LOG_ERROR(HW_GPU, "Failed to initialize GPU: {}", exception.what());
|
|
return nullptr;
|
|
}
|
|
}
|
|
|
|
u16 GetResolutionScaleFactor(const RendererBase& renderer) {
|
|
return static_cast<u16>(
|
|
Settings::values.resolution_factor.GetValue() != 0
|
|
? Settings::values.resolution_factor.GetValue()
|
|
: renderer.GetRenderWindow().GetFramebufferLayout().GetScalingRatio());
|
|
}
|
|
|
|
} // namespace VideoCore
|