summaryrefslogtreecommitdiffstats
path: root/video/out/opengl/context_dxinterop.c
diff options
context:
space:
mode:
authorKevin Mitchell <kevmitch@gmail.com>2016-03-13 17:35:42 -0700
committerKevin Mitchell <kevmitch@gmail.com>2016-03-15 17:04:58 -0700
commitd756dd8cbf5089d57a0daacfaf20e662df333c7a (patch)
tree6c7e10b734768b8364d856c5d429f6ac78abd24e /video/out/opengl/context_dxinterop.c
parent95c09fa93b17e7387998a3a5ca05f11ad00b1b5f (diff)
downloadmpv-d756dd8cbf5089d57a0daacfaf20e662df333c7a.tar.bz2
mpv-d756dd8cbf5089d57a0daacfaf20e662df333c7a.tar.xz
vo_opengl: only open one OpenGL/DX interop handle when using dxva2
Previously, gl->DXOpenDeviceNV was called twice using dxva2 with dxinterop. AMD drivers refused to allow this. With this commit, context_dxinterop sets its own implementation of MPGetNativeDisplay, which can return either a IDirect3DDevice9Ex or a dxinterop_device_HANDLE depending on the "name" request string. hwdec_dxva2gldx then requests both of these avoiding the need to call gl->DXOpenDeviceNV a second time.
Diffstat (limited to 'video/out/opengl/context_dxinterop.c')
-rw-r--r--video/out/opengl/context_dxinterop.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/video/out/opengl/context_dxinterop.c b/video/out/opengl/context_dxinterop.c
index d3287f1f28..4dfc3c2108 100644
--- a/video/out/opengl/context_dxinterop.c
+++ b/video/out/opengl/context_dxinterop.c
@@ -543,6 +543,20 @@ static int GLAPIENTRY dxinterop_swap_interval(int interval)
return 1;
}
+static void * GLAPIENTRY dxinterop_get_native_display(const char *name)
+{
+ if (!current_ctx || !name)
+ return NULL;
+ struct priv *p = current_ctx->priv;
+
+ if (p->device && strcmp("IDirect3DDevice9Ex", name) == 0) {
+ return p->device;
+ } else if (p->device_h && strcmp("dxinterop_device_HANDLE", name) == 0) {
+ return p->device_h;
+ }
+ return NULL;
+}
+
static int dxinterop_init(struct MPGLContext *ctx, int flags)
{
struct priv *p = ctx->priv;
@@ -566,6 +580,8 @@ static int dxinterop_init(struct MPGLContext *ctx, int flags)
gl->SwapInterval = dxinterop_swap_interval;
+ gl->MPGetNativeDisplay = dxinterop_get_native_display;
+
if (d3d_create(ctx) < 0)
goto fail;
if (d3d_size_dependent_create(ctx) < 0)
@@ -581,9 +597,6 @@ static int dxinterop_init(struct MPGLContext *ctx, int flags)
DwmEnableMMCSS(TRUE);
- ctx->native_display_type = "IDirect3DDevice9Ex";
- ctx->native_display = p->device;
-
return 0;
fail:
dxinterop_uninit(ctx);