2015-05-23 22:55:12 -06:00
|
|
|
// Copyright 2008 Dolphin Emulator Project
|
2015-05-17 17:08:10 -06:00
|
|
|
// Licensed under GPLv2+
|
2013-04-17 21:29:41 -06:00
|
|
|
// Refer to the license.txt file included.
|
2010-06-13 13:50:06 -06:00
|
|
|
|
2015-12-20 19:49:49 -07:00
|
|
|
#include <memory>
|
2014-03-12 13:33:41 -06:00
|
|
|
#include <string>
|
2010-06-13 13:50:06 -06:00
|
|
|
|
2018-06-30 02:53:24 -06:00
|
|
|
#include "Common/Common.h"
|
2016-01-02 13:01:12 -07:00
|
|
|
#include "Common/CommonTypes.h"
|
2017-03-03 23:40:08 -07:00
|
|
|
#include "Common/MsgHandler.h"
|
2014-03-12 13:33:41 -06:00
|
|
|
#include "Common/StringUtil.h"
|
2010-06-13 13:50:06 -06:00
|
|
|
|
2014-12-04 19:01:20 -07:00
|
|
|
#include "VideoBackends/D3D/BoundingBox.h"
|
2014-02-17 03:18:15 -07:00
|
|
|
#include "VideoBackends/D3D/D3DBase.h"
|
|
|
|
#include "VideoBackends/D3D/PerfQuery.h"
|
2016-01-02 13:01:12 -07:00
|
|
|
#include "VideoBackends/D3D/Render.h"
|
2019-03-09 06:31:36 -07:00
|
|
|
#include "VideoBackends/D3D/SwapChain.h"
|
2014-02-17 03:18:15 -07:00
|
|
|
#include "VideoBackends/D3D/VertexManager.h"
|
|
|
|
#include "VideoBackends/D3D/VideoBackend.h"
|
2019-03-09 06:31:36 -07:00
|
|
|
#include "VideoBackends/D3DCommon/Common.h"
|
2011-01-25 09:43:08 -07:00
|
|
|
|
2019-02-14 18:59:50 -07:00
|
|
|
#include "VideoCommon/FramebufferManager.h"
|
2018-02-24 08:15:35 -07:00
|
|
|
#include "VideoCommon/ShaderCache.h"
|
2019-02-14 18:59:50 -07:00
|
|
|
#include "VideoCommon/TextureCacheBase.h"
|
2016-07-21 17:04:57 -06:00
|
|
|
#include "VideoCommon/VideoCommon.h"
|
2014-02-17 03:18:15 -07:00
|
|
|
#include "VideoCommon/VideoConfig.h"
|
2010-06-13 13:50:06 -06:00
|
|
|
|
2011-01-30 18:28:32 -07:00
|
|
|
namespace DX11
|
2011-01-14 08:09:30 -07:00
|
|
|
{
|
2014-03-12 17:39:55 -06:00
|
|
|
std::string VideoBackend::GetName() const
|
2013-05-01 07:51:43 -06:00
|
|
|
{
|
2013-09-22 09:48:48 -06:00
|
|
|
return "D3D";
|
2013-05-01 07:51:43 -06:00
|
|
|
}
|
|
|
|
|
2014-03-12 17:39:55 -06:00
|
|
|
std::string VideoBackend::GetDisplayName() const
|
2010-06-13 13:50:06 -06:00
|
|
|
{
|
2018-06-30 02:53:24 -06:00
|
|
|
return _trans("Direct3D 11");
|
2010-06-13 13:50:06 -06:00
|
|
|
}
|
|
|
|
|
2019-07-21 09:29:08 -06:00
|
|
|
std::optional<std::string> VideoBackend::GetWarningMessage() const
|
|
|
|
{
|
|
|
|
std::optional<std::string> result;
|
|
|
|
|
|
|
|
// If user is on Win7, show a warning about partial DX11.1 support
|
|
|
|
// This is being called BEFORE FillBackendInfo is called for this backend,
|
|
|
|
// so query for logic op support manually
|
|
|
|
bool supportsLogicOp = false;
|
|
|
|
if (D3DCommon::LoadLibraries())
|
|
|
|
{
|
|
|
|
supportsLogicOp = D3D::SupportsLogicOp(g_Config.iAdapter);
|
|
|
|
D3DCommon::UnloadLibraries();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!supportsLogicOp)
|
|
|
|
{
|
|
|
|
result = _trans("Direct3D 11 renderer requires support for features not supported by your "
|
|
|
|
"system configuration. This is most likely because you are using Windows 7. "
|
|
|
|
"You may still use this backend, but you might encounter graphical artifacts."
|
|
|
|
"\n\nDo you really want to switch to Direct3D 11? If unsure, select 'No'.");
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2016-01-13 13:38:11 -07:00
|
|
|
void VideoBackend::InitBackendInfo()
|
2010-11-22 15:17:35 -07:00
|
|
|
{
|
2019-03-09 06:31:36 -07:00
|
|
|
if (!D3DCommon::LoadLibraries())
|
2010-11-23 12:58:02 -07:00
|
|
|
return;
|
2016-06-24 02:43:46 -06:00
|
|
|
|
2019-03-09 06:31:36 -07:00
|
|
|
FillBackendInfo();
|
|
|
|
D3DCommon::UnloadLibraries();
|
|
|
|
}
|
|
|
|
|
|
|
|
void VideoBackend::FillBackendInfo()
|
|
|
|
{
|
2016-07-21 17:04:57 -06:00
|
|
|
g_Config.backend_info.api_type = APIType::D3D;
|
2017-03-10 06:40:52 -07:00
|
|
|
g_Config.backend_info.MaxTextureSize = D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION;
|
2019-02-14 18:59:50 -07:00
|
|
|
g_Config.backend_info.bUsesLowerLeftOrigin = false;
|
2014-07-19 12:18:03 -06:00
|
|
|
g_Config.backend_info.bSupportsExclusiveFullscreen = true;
|
2011-05-31 14:16:59 -06:00
|
|
|
g_Config.backend_info.bSupportsDualSourceBlend = true;
|
2013-04-08 08:34:47 -06:00
|
|
|
g_Config.backend_info.bSupportsPrimitiveRestart = true;
|
2014-12-05 19:54:34 -07:00
|
|
|
g_Config.backend_info.bSupportsOversizedViewports = false;
|
2014-12-16 16:26:03 -07:00
|
|
|
g_Config.backend_info.bSupportsGeometryShaders = true;
|
2016-11-27 01:14:55 -07:00
|
|
|
g_Config.backend_info.bSupportsComputeShaders = false;
|
2014-11-13 16:24:53 -07:00
|
|
|
g_Config.backend_info.bSupports3DVision = true;
|
2019-02-14 18:59:50 -07:00
|
|
|
g_Config.backend_info.bSupportsPostProcessing = true;
|
2015-01-26 16:33:23 -07:00
|
|
|
g_Config.backend_info.bSupportsPaletteConversion = true;
|
2015-06-24 15:16:53 -06:00
|
|
|
g_Config.backend_info.bSupportsClipControl = true;
|
2016-08-05 14:31:34 -06:00
|
|
|
g_Config.backend_info.bSupportsDepthClamp = true;
|
2016-08-21 09:47:24 -06:00
|
|
|
g_Config.backend_info.bSupportsReversedDepthRange = false;
|
2016-08-13 06:08:46 -06:00
|
|
|
g_Config.backend_info.bSupportsMultithreading = false;
|
2019-02-14 18:59:50 -07:00
|
|
|
g_Config.backend_info.bSupportsGPUTextureDecoding = true;
|
2017-05-29 16:02:09 -06:00
|
|
|
g_Config.backend_info.bSupportsCopyToVram = true;
|
2019-02-14 18:59:50 -07:00
|
|
|
g_Config.backend_info.bSupportsLargePoints = false;
|
2019-03-01 22:03:49 -07:00
|
|
|
g_Config.backend_info.bSupportsPartialDepthCopies = false;
|
2017-07-19 23:25:24 -06:00
|
|
|
g_Config.backend_info.bSupportsBitfield = false;
|
|
|
|
g_Config.backend_info.bSupportsDynamicSamplerIndexing = false;
|
2017-10-25 23:44:39 -06:00
|
|
|
g_Config.backend_info.bSupportsFramebufferFetch = false;
|
2018-02-25 00:56:09 -07:00
|
|
|
g_Config.backend_info.bSupportsBackgroundCompiling = true;
|
2019-03-09 06:31:36 -07:00
|
|
|
g_Config.backend_info.bSupportsST3CTextures = true;
|
|
|
|
g_Config.backend_info.bSupportsBPTCTextures = true;
|
|
|
|
g_Config.backend_info.bSupportsEarlyZ = true;
|
|
|
|
g_Config.backend_info.bSupportsBBox = true;
|
|
|
|
g_Config.backend_info.bSupportsFragmentStoresAndAtomics = true;
|
|
|
|
g_Config.backend_info.bSupportsGSInstancing = true;
|
|
|
|
g_Config.backend_info.bSupportsSSAA = true;
|
2019-04-15 05:55:26 -06:00
|
|
|
g_Config.backend_info.bSupportsShaderBinaries = true;
|
|
|
|
g_Config.backend_info.bSupportsPipelineCacheData = false;
|
2019-07-21 09:10:51 -06:00
|
|
|
g_Config.backend_info.bSupportsLogicOp = D3D::SupportsLogicOp(g_Config.iAdapter);
|
2019-03-09 06:31:36 -07:00
|
|
|
|
|
|
|
g_Config.backend_info.Adapters = D3DCommon::GetAdapterNames();
|
|
|
|
g_Config.backend_info.AAModes = D3D::GetAAModes(g_Config.iAdapter);
|
2019-04-27 23:26:46 -06:00
|
|
|
|
|
|
|
// Override optional features if we are actually booting.
|
|
|
|
if (D3D::device)
|
|
|
|
{
|
|
|
|
g_Config.backend_info.bSupportsST3CTextures =
|
|
|
|
D3D::SupportsTextureFormat(DXGI_FORMAT_BC1_UNORM) &&
|
|
|
|
D3D::SupportsTextureFormat(DXGI_FORMAT_BC2_UNORM) &&
|
|
|
|
D3D::SupportsTextureFormat(DXGI_FORMAT_BC3_UNORM);
|
|
|
|
g_Config.backend_info.bSupportsBPTCTextures = D3D::SupportsTextureFormat(DXGI_FORMAT_BC7_UNORM);
|
|
|
|
|
|
|
|
// Features only supported with a FL11.0+ device.
|
|
|
|
const bool shader_model_5_supported = D3D::feature_level >= D3D_FEATURE_LEVEL_11_0;
|
|
|
|
g_Config.backend_info.bSupportsEarlyZ = shader_model_5_supported;
|
|
|
|
g_Config.backend_info.bSupportsBBox = shader_model_5_supported;
|
|
|
|
g_Config.backend_info.bSupportsFragmentStoresAndAtomics = shader_model_5_supported;
|
|
|
|
g_Config.backend_info.bSupportsGSInstancing = shader_model_5_supported;
|
|
|
|
g_Config.backend_info.bSupportsSSAA = shader_model_5_supported;
|
|
|
|
g_Config.backend_info.bSupportsGPUTextureDecoding = shader_model_5_supported;
|
|
|
|
}
|
2011-05-31 14:16:59 -06:00
|
|
|
}
|
|
|
|
|
2018-10-03 07:03:22 -06:00
|
|
|
bool VideoBackend::Initialize(const WindowSystemInfo& wsi)
|
2010-06-13 13:50:06 -06:00
|
|
|
{
|
2019-03-09 06:31:36 -07:00
|
|
|
if (!D3D::Create(g_Config.iAdapter, g_Config.bEnableValidationLayer))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
FillBackendInfo();
|
2016-01-13 13:14:20 -07:00
|
|
|
InitializeShared();
|
2010-06-13 13:50:06 -06:00
|
|
|
|
2019-03-09 06:31:36 -07:00
|
|
|
std::unique_ptr<SwapChain> swap_chain;
|
|
|
|
if (wsi.render_surface && !(swap_chain = SwapChain::Create(wsi)))
|
2018-01-25 22:09:07 -07:00
|
|
|
{
|
2019-03-09 06:31:36 -07:00
|
|
|
PanicAlertT("Failed to create D3D swap chain");
|
|
|
|
ShutdownShared();
|
|
|
|
D3D::Destroy();
|
2018-01-25 22:09:07 -07:00
|
|
|
return false;
|
|
|
|
}
|
2017-03-03 23:40:08 -07:00
|
|
|
|
2019-03-09 06:31:36 -07:00
|
|
|
g_renderer = std::make_unique<Renderer>(std::move(swap_chain), wsi.render_surface_scale);
|
2015-12-20 19:49:49 -07:00
|
|
|
g_vertex_manager = std::make_unique<VertexManager>();
|
2019-02-14 18:59:50 -07:00
|
|
|
g_shader_cache = std::make_unique<VideoCommon::ShaderCache>();
|
|
|
|
g_framebuffer_manager = std::make_unique<FramebufferManager>();
|
|
|
|
g_texture_cache = std::make_unique<TextureCacheBase>();
|
2015-12-20 19:49:49 -07:00
|
|
|
g_perf_query = std::make_unique<PerfQuery>();
|
2019-10-01 19:50:09 -06:00
|
|
|
if (!g_vertex_manager->Initialize() || !g_shader_cache->Initialize() ||
|
|
|
|
!g_renderer->Initialize() || !g_framebuffer_manager->Initialize() ||
|
2019-02-14 18:59:50 -07:00
|
|
|
!g_texture_cache->Initialize())
|
|
|
|
{
|
2019-03-09 06:31:36 -07:00
|
|
|
Shutdown();
|
2018-02-24 08:15:35 -07:00
|
|
|
return false;
|
2019-02-14 18:59:50 -07:00
|
|
|
}
|
2018-02-24 08:15:35 -07:00
|
|
|
|
2016-06-27 04:45:00 -06:00
|
|
|
BBox::Init();
|
2019-02-14 18:59:50 -07:00
|
|
|
g_shader_cache->InitializeShaderCache();
|
2018-11-27 21:30:47 -07:00
|
|
|
return true;
|
2010-06-13 13:50:06 -06:00
|
|
|
}
|
|
|
|
|
2011-01-30 18:28:32 -07:00
|
|
|
void VideoBackend::Shutdown()
|
2010-06-13 13:50:06 -06:00
|
|
|
{
|
2018-02-24 08:15:35 -07:00
|
|
|
g_shader_cache->Shutdown();
|
2018-01-25 22:09:07 -07:00
|
|
|
g_renderer->Shutdown();
|
|
|
|
|
2016-01-13 13:14:20 -07:00
|
|
|
BBox::Shutdown();
|
|
|
|
|
|
|
|
g_perf_query.reset();
|
|
|
|
g_texture_cache.reset();
|
2019-02-14 18:59:50 -07:00
|
|
|
g_framebuffer_manager.reset();
|
2018-02-24 08:15:35 -07:00
|
|
|
g_shader_cache.reset();
|
2019-02-14 18:59:50 -07:00
|
|
|
g_vertex_manager.reset();
|
2016-01-13 13:14:20 -07:00
|
|
|
g_renderer.reset();
|
|
|
|
|
|
|
|
ShutdownShared();
|
2019-03-09 06:31:36 -07:00
|
|
|
D3D::Destroy();
|
2013-02-26 08:42:32 -07:00
|
|
|
}
|
2018-10-03 07:03:13 -06:00
|
|
|
} // namespace DX11
|