summaryrefslogtreecommitdiffstats
path: root/video
diff options
context:
space:
mode:
authorJames Ross-Gowan <rossymiles@gmail.com>2017-03-26 01:49:19 +1100
committerJames Ross-Gowan <rossymiles@gmail.com>2017-03-26 21:50:01 +1100
commit439e2b43c33f48fe380d8c43c39836ec9a96064b (patch)
tree9fc5577176ffe3beabdacbc85699999c6a5b4efc /video
parentb0086d62432952ac510dd1e2747e20a75e85f899 (diff)
downloadmpv-439e2b43c33f48fe380d8c43c39836ec9a96064b.tar.bz2
mpv-439e2b43c33f48fe380d8c43c39836ec9a96064b.tar.xz
vo_opengl: angle: add --angle-flip to set the present model
DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL might be buggy on some hardware. Additionaly DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL might be supported on some Windows 7 systems with the platform update, but it might have poor performance. In these cases, the user might want to disable the use of DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL swap chains with --angle-flip=no.
Diffstat (limited to 'video')
-rw-r--r--video/out/opengl/context_angle.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/video/out/opengl/context_angle.c b/video/out/opengl/context_angle.c
index 7a011a80a4..062835da30 100644
--- a/video/out/opengl/context_angle.c
+++ b/video/out/opengl/context_angle.c
@@ -56,6 +56,7 @@ struct angle_opts {
int egl_windowing;
int swapchain_length; // Currently only works with DXGI 1.2+
int max_frame_latency;
+ int flip;
};
#define OPT_BASE_STRUCT struct angle_opts
@@ -80,6 +81,7 @@ const struct m_sub_options angle_conf = {
{"yes", 1})),
OPT_INTRANGE("angle-swapchain-length", swapchain_length, 0, 2, 16),
OPT_INTRANGE("angle-max-frame-latency", max_frame_latency, 0, 1, 16),
+ OPT_FLAG("angle-flip", flip, 0),
{0}
},
.defaults = &(const struct angle_opts) {
@@ -89,6 +91,7 @@ const struct m_sub_options angle_conf = {
.egl_windowing = -1,
.swapchain_length = 6,
.max_frame_latency = 3,
+ .flip = 1,
},
.size = sizeof(struct angle_opts),
};
@@ -383,13 +386,28 @@ static bool d3d11_swapchain_create_1_2(MPGLContext *ctx, int flags)
.SampleDesc = { .Count = 1 },
.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT |
DXGI_USAGE_SHADER_INPUT,
- .BufferCount = p->opts->swapchain_length,
- .SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL,
};
+ if (p->opts->flip) {
+ desc1.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
+ desc1.BufferCount = p->opts->swapchain_length;
+ } else {
+ desc1.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
+ desc1.BufferCount = 1;
+ }
+
hr = IDXGIFactory2_CreateSwapChainForHwnd(p->dxgi_factory2,
(IUnknown*)p->d3d11_device, vo_w32_hwnd(vo), &desc1, NULL, NULL,
&p->dxgi_swapchain1);
+ if (FAILED(hr) && p->opts->flip) {
+ // Try again without DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL
+ desc1.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
+ desc1.BufferCount = 1;
+
+ hr = IDXGIFactory2_CreateSwapChainForHwnd(p->dxgi_factory2,
+ (IUnknown*)p->d3d11_device, vo_w32_hwnd(vo), &desc1, NULL, NULL,
+ &p->dxgi_swapchain1);
+ }
if (FAILED(hr)) {
MP_FATAL(vo, "Couldn't create DXGI 1.2+ swap chain: %s\n",
mp_HRESULT_to_str(hr));
@@ -670,6 +688,14 @@ static int angle_init(struct MPGLContext *ctx, int flags)
if (surface_ok) {
if (p->dxgi_swapchain1) {
MP_VERBOSE(vo, "Using DXGI 1.2+\n");
+
+ DXGI_SWAP_CHAIN_DESC1 scd = {0};
+ IDXGISwapChain1_GetDesc1(p->dxgi_swapchain1, &scd);
+ if (scd.SwapEffect == DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL) {
+ MP_VERBOSE(vo, "Using flip-model presentation\n");
+ } else {
+ MP_VERBOSE(vo, "Using bitblt-model presentation\n");
+ }
} else {
MP_VERBOSE(vo, "Using DXGI 1.1\n");
}