diff options
author | wm4 <wm4@nowhere> | 2015-07-03 15:58:19 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2015-07-03 16:04:42 +0200 |
commit | b85321d0573ba581694d2e6be1effafee74c11d1 (patch) | |
tree | aabed80d8c8ec801ff358150da9b1ca0b6f615d4 /video/out/vo_direct3d.c | |
parent | b6dc11810b78953d95a75d745d7327a796f0b462 (diff) | |
download | mpv-b85321d0573ba581694d2e6be1effafee74c11d1.tar.bz2 mpv-b85321d0573ba581694d2e6be1effafee74c11d1.tar.xz |
vo_direct3d, dxva2: use the same D3D device
Since we still read-back (and don't have hard plans on changing this),
this doesn't have much of an advantage.
Diffstat (limited to 'video/out/vo_direct3d.c')
-rw-r--r-- | video/out/vo_direct3d.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/video/out/vo_direct3d.c b/video/out/vo_direct3d.c index e3b366b5ca..528ccd85de 100644 --- a/video/out/vo_direct3d.c +++ b/video/out/vo_direct3d.c @@ -34,6 +34,7 @@ #include "video/csputils.h" #include "video/mp_image.h" #include "video/img_format.h" +#include "video/d3d.h" #include "common/msg.h" #include "common/common.h" #include "w32_common.h" @@ -191,6 +192,10 @@ typedef struct d3d_priv { struct mp_csp_equalizer video_eq; struct osdpart *osd[MAX_OSD_PARTS]; + + struct mp_hwdec_info hwdec_info; + struct mp_hwdec_ctx hwdec_ctx; + struct mp_d3d_ctx hwdec_d3d; } d3d_priv; struct fmt_entry { @@ -739,6 +744,9 @@ static bool change_d3d_backbuffer(d3d_priv *priv) MP_VERBOSE(priv, "Creating Direct3D device failed.\n"); return 0; } + + // (race condition if this is called when recovering from a "lost" device) + priv->hwdec_d3d.d3d9_device = priv->d3d_device; } else { if (FAILED(IDirect3DDevice9_Reset(priv->d3d_device, &present_params))) { MP_ERR(priv, "Reseting Direct3D device failed.\n"); @@ -772,6 +780,8 @@ static bool change_d3d_backbuffer(d3d_priv *priv) static void destroy_d3d(d3d_priv *priv) { + priv->hwdec_d3d.d3d9_device = NULL; + destroy_d3d_surfaces(priv); for (int n = 0; n < NUM_SHADERS; n++) { @@ -1216,6 +1226,9 @@ static int preinit(struct vo *vo) priv->vo = vo; priv->log = vo->log; + priv->hwdec_info.hwctx = &priv->hwdec_ctx; + priv->hwdec_ctx.d3d_ctx = &priv->hwdec_d3d; + for (int n = 0; n < MAX_OSD_PARTS; n++) { struct osdpart *osd = talloc_ptrtype(priv, osd); *osd = (struct osdpart) { @@ -1263,6 +1276,11 @@ static int control(struct vo *vo, uint32_t request, void *data) d3d_priv *priv = vo->priv; switch (request) { + case VOCTRL_GET_HWDEC_INFO: { + struct mp_hwdec_info **arg = data; + *arg = &priv->hwdec_info; + return true; + } case VOCTRL_REDRAW_FRAME: d3d_draw_frame(priv); return VO_TRUE; |