Merge pull request #6016 from Armada651/allow-tearing

D3DBase: Support the "allow tearing" DXGI flags.
This commit is contained in:
Jules Blok 2017-09-06 13:22:23 +02:00 committed by GitHub
commit c97a799c5f
2 changed files with 36 additions and 4 deletions

View File

@ -44,6 +44,7 @@ HWND hWnd;
std::vector<DXGI_SAMPLE_DESC> aa_modes; // supported AA modes of the current adapter std::vector<DXGI_SAMPLE_DESC> aa_modes; // supported AA modes of the current adapter
bool bgra_textures_supported; bool bgra_textures_supported;
bool allow_tearing_supported;
#define NUM_SUPPORTED_FEATURE_LEVELS 3 #define NUM_SUPPORTED_FEATURE_LEVELS 3
const D3D_FEATURE_LEVEL supported_feature_levels[NUM_SUPPORTED_FEATURE_LEVELS] = { const D3D_FEATURE_LEVEL supported_feature_levels[NUM_SUPPORTED_FEATURE_LEVELS] = {
@ -295,6 +296,18 @@ HRESULT Create(HWND wnd)
UpdateActiveConfig(); UpdateActiveConfig();
} }
// Check support for allow tearing, we query the interface for backwards compatibility
UINT allow_tearing = FALSE;
IDXGIFactory5* factory5;
hr = factory->QueryInterface(&factory5);
if (SUCCEEDED(hr))
{
hr = factory5->CheckFeatureSupport(DXGI_FEATURE_PRESENT_ALLOW_TEARING, &allow_tearing,
sizeof(allow_tearing));
factory5->Release();
}
allow_tearing_supported = SUCCEEDED(hr) && allow_tearing;
DXGI_SWAP_CHAIN_DESC1 swap_chain_desc = {}; DXGI_SWAP_CHAIN_DESC1 swap_chain_desc = {};
swap_chain_desc.BufferCount = 2; swap_chain_desc.BufferCount = 2;
swap_chain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; swap_chain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
@ -307,6 +320,9 @@ HRESULT Create(HWND wnd)
swap_chain_desc.Height = yres; swap_chain_desc.Height = yres;
swap_chain_desc.Stereo = g_ActiveConfig.iStereoMode == STEREO_QUADBUFFER; swap_chain_desc.Stereo = g_ActiveConfig.iStereoMode == STEREO_QUADBUFFER;
// This flag is necessary if we want to use a flip-model swapchain without locking the framerate
swap_chain_desc.Flags = allow_tearing_supported ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0;
// Creating debug devices can sometimes fail if the user doesn't have the correct // Creating debug devices can sometimes fail if the user doesn't have the correct
// version of the DirectX SDK. If it does, simply fallback to a non-debug device. // version of the DirectX SDK. If it does, simply fallback to a non-debug device.
if (g_Config.bEnableValidationLayer) if (g_Config.bEnableValidationLayer)
@ -396,7 +412,7 @@ HRESULT Create(HWND wnd)
if (SConfig::GetInstance().bFullscreen && !g_ActiveConfig.bBorderlessFullscreen) if (SConfig::GetInstance().bFullscreen && !g_ActiveConfig.bBorderlessFullscreen)
{ {
swapchain->SetFullscreenState(true, nullptr); swapchain->SetFullscreenState(true, nullptr);
swapchain->ResizeBuffers(0, xres, yres, DXGI_FORMAT_R8G8B8A8_UNORM, 0); swapchain->ResizeBuffers(0, xres, yres, DXGI_FORMAT_R8G8B8A8_UNORM, swap_chain_desc.Flags);
} }
ID3D11Texture2D* buf; ID3D11Texture2D* buf;
@ -523,6 +539,11 @@ bool BGRATexturesSupported()
return bgra_textures_supported; return bgra_textures_supported;
} }
bool AllowTearingSupported()
{
return allow_tearing_supported;
}
// Returns the maximum width/height of a texture. This value only depends upon the feature level in // Returns the maximum width/height of a texture. This value only depends upon the feature level in
// DX11 // DX11
u32 GetMaxTextureSize(D3D_FEATURE_LEVEL feature_level) u32 GetMaxTextureSize(D3D_FEATURE_LEVEL feature_level)
@ -553,12 +574,14 @@ void Reset()
// release all back buffer references // release all back buffer references
SAFE_RELEASE(backbuf); SAFE_RELEASE(backbuf);
UINT swap_chain_flags = AllowTearingSupported() ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0;
// resize swapchain buffers // resize swapchain buffers
RECT client; RECT client;
GetClientRect(hWnd, &client); GetClientRect(hWnd, &client);
xres = client.right - client.left; xres = client.right - client.left;
yres = client.bottom - client.top; yres = client.bottom - client.top;
D3D::swapchain->ResizeBuffers(0, xres, yres, DXGI_FORMAT_R8G8B8A8_UNORM, 0); D3D::swapchain->ResizeBuffers(0, xres, yres, DXGI_FORMAT_R8G8B8A8_UNORM, swap_chain_flags);
// recreate back buffer texture // recreate back buffer texture
ID3D11Texture2D* buf; ID3D11Texture2D* buf;
@ -603,8 +626,16 @@ void EndFrame()
void Present() void Present()
{ {
UINT present_flags = 0; UINT present_flags = 0;
// When using sync interval 0, it is recommended to always pass the tearing
// flag when it is supported, even when presenting in windowed mode.
// However, this flag cannot be used if the app is in fullscreen mode as a
// result of calling SetFullscreenState.
if (AllowTearingSupported() && !g_ActiveConfig.IsVSync() && !GetFullscreenState())
present_flags |= DXGI_PRESENT_ALLOW_TEARING;
if (swapchain->IsTemporaryMonoSupported() && g_ActiveConfig.iStereoMode != STEREO_QUADBUFFER) if (swapchain->IsTemporaryMonoSupported() && g_ActiveConfig.iStereoMode != STEREO_QUADBUFFER)
present_flags = DXGI_PRESENT_STEREO_TEMPORARY_MONO; present_flags |= DXGI_PRESENT_STEREO_TEMPORARY_MONO;
// TODO: Is 1 the correct value for vsyncing? // TODO: Is 1 the correct value for vsyncing?
swapchain->Present((UINT)g_ActiveConfig.IsVSync(), present_flags); swapchain->Present((UINT)g_ActiveConfig.IsVSync(), present_flags);

View File

@ -7,7 +7,7 @@
#include <d3d11.h> #include <d3d11.h>
#include <d3d11_1.h> #include <d3d11_1.h>
#include <d3dcompiler.h> #include <d3dcompiler.h>
#include <dxgi1_2.h> #include <dxgi1_5.h>
#include <vector> #include <vector>
#include "Common/Common.h" #include "Common/Common.h"
@ -74,6 +74,7 @@ const char* PixelShaderVersionString();
const char* GeometryShaderVersionString(); const char* GeometryShaderVersionString();
const char* VertexShaderVersionString(); const char* VertexShaderVersionString();
bool BGRATexturesSupported(); bool BGRATexturesSupported();
bool AllowTearingSupported();
u32 GetMaxTextureSize(D3D_FEATURE_LEVEL feature_level); u32 GetMaxTextureSize(D3D_FEATURE_LEVEL feature_level);