[GPU] Reasons to keep non-Vulkan backends [ci skip]
This commit is contained in:
parent
ed61e15fc3
commit
bbae909fd7
|
@ -259,6 +259,77 @@ std::unique_ptr<apu::AudioSystem> EmulatorApp::CreateAudioSystem(
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<gpu::GraphicsSystem> EmulatorApp::CreateGraphicsSystem() {
|
std::unique_ptr<gpu::GraphicsSystem> EmulatorApp::CreateGraphicsSystem() {
|
||||||
|
// While Vulkan is supported by a large variety of operating systems (Windows,
|
||||||
|
// GNU/Linux, Android, also via the MoltenVK translation layer on top of Metal
|
||||||
|
// on macOS and iOS), please don't remove platform-specific GPU backends from
|
||||||
|
// Xenia.
|
||||||
|
//
|
||||||
|
// Regardless of the operating system, having multiple options provides more
|
||||||
|
// stability to users. In case of driver issues, users may try switching
|
||||||
|
// between the available backends. For example, in June 2022, on Nvidia Ampere
|
||||||
|
// (RTX 30xx), Xenia had synchronization issues that resulted in flickering,
|
||||||
|
// most prominently in 4D5307E6, on Direct3D 12 - but the same issue was not
|
||||||
|
// reproducible in the Vulkan backend, however, it used ImageSampleExplicitLod
|
||||||
|
// with explicit gradients for cubemaps, which triggered a different driver
|
||||||
|
// bug on Nvidia (every 1 out of 2x2 pixels receiving junk).
|
||||||
|
//
|
||||||
|
// Specifically on Microsoft platforms, there are a few reasons why supporting
|
||||||
|
// Direct3D 12 is desirable rather than limiting Xenia to Vulkan only:
|
||||||
|
// - Wider hardware support for Direct3D 12 on x86 Windows desktops.
|
||||||
|
// Direct3D 12 requires the minimum of Nvidia Fermi, or, with a pre-2021
|
||||||
|
// driver version, Intel HD Graphics 4200. Vulkan, however, is supported
|
||||||
|
// only starting with Nvidia Kepler and a much more recent Intel UHD
|
||||||
|
// Graphics generation.
|
||||||
|
// - Wider hardware support on other kinds of Microsoft devices. The Xbox One
|
||||||
|
// and the Xbox Series X|S only support Direct3D as the GPU API in their UWP
|
||||||
|
// runtime, and only version 12 can be granted expanded resource access.
|
||||||
|
// Qualcomm, as of June 2022, also doesn't provide a Vulkan implementation
|
||||||
|
// for their Arm-based Windows devices, while Direct3D 12 is available.
|
||||||
|
// - Both older Intel GPUs and the Xbox One apparently, as well as earlier
|
||||||
|
// Windows 10 versions, also require Shader Model 5.1 DXBC shaders rather
|
||||||
|
// than Shader Model 6 DXIL ones, so a DXBC shader translator should be
|
||||||
|
// available in Xenia too, a DXIL one doesn't fully replace it.
|
||||||
|
// - As of June 2022, AMD also refuses to implement the
|
||||||
|
// VK_EXT_fragment_shader_interlock Vulkan extension in their drivers, as
|
||||||
|
// well as its OpenGL counterpart, which is heavily utilized for accurate
|
||||||
|
// support of Xenos render target formats that don't have PC equivalents
|
||||||
|
// (8_8_8_8_GAMMA, 2_10_10_10_FLOAT, 16_16 and 16_16_16_16 with -32 to 32
|
||||||
|
// range, D24FS8) with correct blending. Direct3D 12, however, requires
|
||||||
|
// support for similar functionality (rasterizer-ordered views) on the
|
||||||
|
// feature level 12_1, and the AMD driver implements it on Direct3D, as well
|
||||||
|
// as raster order groups in their Metal driver.
|
||||||
|
//
|
||||||
|
// Additionally, different host GPU APIs receive feature support at different
|
||||||
|
// paces. VK_EXT_fragment_shader_interlock first appeared in 2019, for
|
||||||
|
// instance, while Xenia had been taking advantage of rasterizer-ordered views
|
||||||
|
// on Direct3D 12 for over half a year at that point (they have existed in
|
||||||
|
// Direct3D 12 since the first version).
|
||||||
|
//
|
||||||
|
// MoltenVK on top Metal also has its flaws and limitations. Metal, for
|
||||||
|
// instance, as of June 2022, doesn't provide a switch for primitive restart,
|
||||||
|
// while Vulkan does - so MoltenVK is not completely transparent to Xenia,
|
||||||
|
// many of its issues that may be not very obvious (unlike when the Metal API
|
||||||
|
// is used directly) should be taken into account in Xenia. Also, as of June
|
||||||
|
// 2022, MoltenVK translates SPIR-V shaders into the C++-based Metal Shading
|
||||||
|
// Language rather than AIR directly, which likely massively increases
|
||||||
|
// pipeline object creation time - and Xenia translates shaders and creates
|
||||||
|
// pipelines when they're first actually used for a draw command by the game,
|
||||||
|
// thus it can't precompile anything that hasn't ever been encountered before
|
||||||
|
// there's already no time to waste.
|
||||||
|
//
|
||||||
|
// Very old hardware (Direct3D 10 level) is also not supported by most Vulkan
|
||||||
|
// drivers. However, in the future, Xenia may be ported to it using the
|
||||||
|
// Direct3D 11 API with the feature level 10_1 or 10_0. OpenGL, however, had
|
||||||
|
// been lagging behind Direct3D prior to versions 4.x, and didn't receive
|
||||||
|
// compute shaders until a 4.2 extension (while 4.2 already corresponds
|
||||||
|
// roughly to Direct3D 11 features) - and replacing Xenia compute shaders with
|
||||||
|
// transform feedback / stream output is not always trivial (in particular,
|
||||||
|
// will need to rely on GL_ARB_transform_feedback3 for skipping over memory
|
||||||
|
// locations that shouldn't be overwritten).
|
||||||
|
//
|
||||||
|
// For maintainability, as much implementation code as possible should be
|
||||||
|
// placed in `xe::gpu` and shared between the backends rather than duplicated
|
||||||
|
// between them.
|
||||||
Factory<gpu::GraphicsSystem> factory;
|
Factory<gpu::GraphicsSystem> factory;
|
||||||
#if XE_PLATFORM_WIN32
|
#if XE_PLATFORM_WIN32
|
||||||
factory.Add<gpu::d3d12::D3D12GraphicsSystem>("d3d12");
|
factory.Add<gpu::d3d12::D3D12GraphicsSystem>("d3d12");
|
||||||
|
|
Loading…
Reference in New Issue