2015-05-24 04:55:12 +00:00
|
|
|
// Copyright 2008 Dolphin Emulator Project
|
2015-05-17 23:08:10 +00:00
|
|
|
// Licensed under GPLv2+
|
2013-04-18 03:29:41 +00:00
|
|
|
// Refer to the license.txt file included.
|
2010-06-13 19:50:06 +00:00
|
|
|
|
2015-12-21 02:49:49 +00:00
|
|
|
#include <memory>
|
2014-03-12 19:33:41 +00:00
|
|
|
#include <string>
|
2010-06-13 19:50:06 +00:00
|
|
|
|
2018-06-30 08:53:24 +00:00
|
|
|
#include "Common/Common.h"
|
2016-01-02 20:01:12 +00:00
|
|
|
#include "Common/CommonTypes.h"
|
2017-03-04 06:40:08 +00:00
|
|
|
#include "Common/MsgHandler.h"
|
2014-03-12 19:33:41 +00:00
|
|
|
#include "Common/StringUtil.h"
|
2010-06-13 19:50:06 +00:00
|
|
|
|
2014-12-05 02:01:20 +00:00
|
|
|
#include "VideoBackends/D3D/BoundingBox.h"
|
2014-02-17 10:18:15 +00:00
|
|
|
#include "VideoBackends/D3D/D3DBase.h"
|
|
|
|
#include "VideoBackends/D3D/PerfQuery.h"
|
2016-01-02 20:01:12 +00:00
|
|
|
#include "VideoBackends/D3D/Render.h"
|
2019-03-09 13:31:36 +00:00
|
|
|
#include "VideoBackends/D3D/SwapChain.h"
|
2014-02-17 10:18:15 +00:00
|
|
|
#include "VideoBackends/D3D/VertexManager.h"
|
|
|
|
#include "VideoBackends/D3D/VideoBackend.h"
|
2019-03-09 13:31:36 +00:00
|
|
|
#include "VideoBackends/D3DCommon/Common.h"
|
2011-01-25 16:43:08 +00:00
|
|
|
|
2019-02-15 01:59:50 +00:00
|
|
|
#include "VideoCommon/FramebufferManager.h"
|
2018-02-24 15:15:35 +00:00
|
|
|
#include "VideoCommon/ShaderCache.h"
|
2019-02-15 01:59:50 +00:00
|
|
|
#include "VideoCommon/TextureCacheBase.h"
|
2016-07-21 23:04:57 +00:00
|
|
|
#include "VideoCommon/VideoCommon.h"
|
2014-02-17 10:18:15 +00:00
|
|
|
#include "VideoCommon/VideoConfig.h"
|
2010-06-13 19:50:06 +00:00
|
|
|
|
2011-01-31 01:28:32 +00:00
|
|
|
namespace DX11
|
2011-01-14 15:09:30 +00:00
|
|
|
{
|
2014-03-12 23:39:55 +00:00
|
|
|
std::string VideoBackend::GetName() const
|
2013-05-01 13:51:43 +00:00
|
|
|
{
|
2016-06-24 08:43:46 +00:00
|
|
|
return "D3D";
|
2013-05-01 13:51:43 +00:00
|
|
|
}
|
|
|
|
|
2014-03-12 23:39:55 +00:00
|
|
|
std::string VideoBackend::GetDisplayName() const
|
2010-06-13 19:50:06 +00:00
|
|
|
{
|
2018-06-30 08:53:24 +00:00
|
|
|
return _trans("Direct3D 11");
|
2010-06-13 19:50:06 +00:00
|
|
|
}
|
|
|
|
|
2016-01-13 20:38:11 +00:00
|
|
|
void VideoBackend::InitBackendInfo()
|
2010-11-22 22:17:35 +00:00
|
|
|
{
|
2019-03-09 13:31:36 +00:00
|
|
|
if (!D3DCommon::LoadLibraries())
|
2016-06-24 08:43:46 +00:00
|
|
|
return;
|
|
|
|
|
2019-03-09 13:31:36 +00:00
|
|
|
FillBackendInfo();
|
|
|
|
D3DCommon::UnloadLibraries();
|
|
|
|
}
|
|
|
|
|
|
|
|
void VideoBackend::FillBackendInfo()
|
|
|
|
{
|
2016-07-21 23:04:57 +00:00
|
|
|
g_Config.backend_info.api_type = APIType::D3D;
|
2017-03-10 13:40:52 +00:00
|
|
|
g_Config.backend_info.MaxTextureSize = D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION;
|
2019-02-15 01:59:50 +00:00
|
|
|
g_Config.backend_info.bUsesLowerLeftOrigin = false;
|
2016-06-24 08:43:46 +00:00
|
|
|
g_Config.backend_info.bSupportsExclusiveFullscreen = true;
|
|
|
|
g_Config.backend_info.bSupportsDualSourceBlend = true;
|
|
|
|
g_Config.backend_info.bSupportsPrimitiveRestart = true;
|
|
|
|
g_Config.backend_info.bSupportsOversizedViewports = false;
|
|
|
|
g_Config.backend_info.bSupportsGeometryShaders = true;
|
2016-11-27 08:14:55 +00:00
|
|
|
g_Config.backend_info.bSupportsComputeShaders = false;
|
2016-06-24 08:43:46 +00:00
|
|
|
g_Config.backend_info.bSupports3DVision = true;
|
2019-02-15 01:59:50 +00:00
|
|
|
g_Config.backend_info.bSupportsPostProcessing = true;
|
2016-06-24 08:43:46 +00:00
|
|
|
g_Config.backend_info.bSupportsPaletteConversion = true;
|
|
|
|
g_Config.backend_info.bSupportsClipControl = true;
|
2016-08-05 20:31:34 +00:00
|
|
|
g_Config.backend_info.bSupportsDepthClamp = true;
|
2016-08-21 15:47:24 +00:00
|
|
|
g_Config.backend_info.bSupportsReversedDepthRange = false;
|
2018-05-25 14:04:18 +00:00
|
|
|
g_Config.backend_info.bSupportsLogicOp = true;
|
2016-08-13 12:08:46 +00:00
|
|
|
g_Config.backend_info.bSupportsMultithreading = false;
|
2019-02-15 01:59:50 +00:00
|
|
|
g_Config.backend_info.bSupportsGPUTextureDecoding = true;
|
2017-04-16 09:30:11 +00:00
|
|
|
g_Config.backend_info.bSupportsST3CTextures = false;
|
2017-05-29 22:02:09 +00:00
|
|
|
g_Config.backend_info.bSupportsCopyToVram = true;
|
2019-02-15 01:59:50 +00:00
|
|
|
g_Config.backend_info.bSupportsLargePoints = false;
|
2019-03-02 05:03:49 +00:00
|
|
|
g_Config.backend_info.bSupportsPartialDepthCopies = false;
|
2017-07-20 05:25:24 +00:00
|
|
|
g_Config.backend_info.bSupportsBitfield = false;
|
|
|
|
g_Config.backend_info.bSupportsDynamicSamplerIndexing = false;
|
2017-07-27 12:00:04 +00:00
|
|
|
g_Config.backend_info.bSupportsBPTCTextures = false;
|
2017-10-26 05:44:39 +00:00
|
|
|
g_Config.backend_info.bSupportsFramebufferFetch = false;
|
2018-02-25 07:56:09 +00:00
|
|
|
g_Config.backend_info.bSupportsBackgroundCompiling = true;
|
2019-03-09 13:31:36 +00: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;
|
|
|
|
|
|
|
|
g_Config.backend_info.Adapters = D3DCommon::GetAdapterNames();
|
|
|
|
g_Config.backend_info.AAModes = D3D::GetAAModes(g_Config.iAdapter);
|
2011-05-31 20:16:59 +00:00
|
|
|
}
|
|
|
|
|
2018-10-03 13:03:22 +00:00
|
|
|
bool VideoBackend::Initialize(const WindowSystemInfo& wsi)
|
2010-06-13 19:50:06 +00:00
|
|
|
{
|
2019-03-09 13:31:36 +00:00
|
|
|
if (!D3D::Create(g_Config.iAdapter, g_Config.bEnableValidationLayer))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
FillBackendInfo();
|
2016-01-13 20:14:20 +00:00
|
|
|
InitializeShared();
|
2010-06-13 19:50:06 +00:00
|
|
|
|
2019-03-09 13:31:36 +00:00
|
|
|
std::unique_ptr<SwapChain> swap_chain;
|
|
|
|
if (wsi.render_surface && !(swap_chain = SwapChain::Create(wsi)))
|
2018-01-26 05:09:07 +00:00
|
|
|
{
|
2019-03-09 13:31:36 +00:00
|
|
|
PanicAlertT("Failed to create D3D swap chain");
|
|
|
|
ShutdownShared();
|
|
|
|
D3D::Destroy();
|
2018-01-26 05:09:07 +00:00
|
|
|
return false;
|
|
|
|
}
|
2017-03-04 06:40:08 +00:00
|
|
|
|
2019-03-09 13:31:36 +00:00
|
|
|
g_renderer = std::make_unique<Renderer>(std::move(swap_chain), wsi.render_surface_scale);
|
2016-06-24 08:43:46 +00:00
|
|
|
g_vertex_manager = std::make_unique<VertexManager>();
|
2019-02-15 01:59:50 +00:00
|
|
|
g_shader_cache = std::make_unique<VideoCommon::ShaderCache>();
|
|
|
|
g_framebuffer_manager = std::make_unique<FramebufferManager>();
|
|
|
|
g_texture_cache = std::make_unique<TextureCacheBase>();
|
2016-06-24 08:43:46 +00:00
|
|
|
g_perf_query = std::make_unique<PerfQuery>();
|
2019-02-15 01:59:50 +00:00
|
|
|
if (!g_renderer->Initialize() || !g_vertex_manager->Initialize() ||
|
|
|
|
!g_shader_cache->Initialize() || !g_framebuffer_manager->Initialize() ||
|
|
|
|
!g_texture_cache->Initialize())
|
|
|
|
{
|
2019-03-09 13:31:36 +00:00
|
|
|
Shutdown();
|
2018-02-24 15:15:35 +00:00
|
|
|
return false;
|
2019-02-15 01:59:50 +00:00
|
|
|
}
|
2018-02-24 15:15:35 +00:00
|
|
|
|
2016-06-27 10:45:00 +00:00
|
|
|
BBox::Init();
|
2019-02-15 01:59:50 +00:00
|
|
|
g_shader_cache->InitializeShaderCache();
|
2018-11-28 04:30:47 +00:00
|
|
|
return true;
|
2010-06-13 19:50:06 +00:00
|
|
|
}
|
|
|
|
|
2011-01-31 01:28:32 +00:00
|
|
|
void VideoBackend::Shutdown()
|
2010-06-13 19:50:06 +00:00
|
|
|
{
|
2018-02-24 15:15:35 +00:00
|
|
|
g_shader_cache->Shutdown();
|
2018-01-26 05:09:07 +00:00
|
|
|
g_renderer->Shutdown();
|
|
|
|
|
2016-01-13 20:14:20 +00:00
|
|
|
BBox::Shutdown();
|
|
|
|
|
|
|
|
g_perf_query.reset();
|
|
|
|
g_texture_cache.reset();
|
2019-02-15 01:59:50 +00:00
|
|
|
g_framebuffer_manager.reset();
|
2018-02-24 15:15:35 +00:00
|
|
|
g_shader_cache.reset();
|
2019-02-15 01:59:50 +00:00
|
|
|
g_vertex_manager.reset();
|
2016-01-13 20:14:20 +00:00
|
|
|
g_renderer.reset();
|
|
|
|
|
|
|
|
ShutdownShared();
|
2019-03-09 13:31:36 +00:00
|
|
|
D3D::Destroy();
|
2013-02-26 15:42:32 +00:00
|
|
|
}
|
2018-10-03 13:03:13 +00:00
|
|
|
} // namespace DX11
|