mirror of https://github.com/mpv-player/mpv
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.
This commit is contained in:
parent
b6dc11810b
commit
b85321d057
|
@ -0,0 +1,13 @@
|
|||
#ifndef MP_D3D_H_
|
||||
#define MP_D3D_H_
|
||||
|
||||
#include <d3d9.h>
|
||||
|
||||
#include "hwdec.h"
|
||||
|
||||
struct mp_d3d_ctx {
|
||||
struct mp_hwdec_ctx hwctx;
|
||||
IDirect3DDevice9 *d3d9_device;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -36,6 +36,7 @@
|
|||
#include "video/fmt-conversion.h"
|
||||
#include "video/mp_image_pool.h"
|
||||
#include "video/hwdec.h"
|
||||
#include "video/d3d.h"
|
||||
#include "gpu_memcpy_sse4.h"
|
||||
|
||||
// A minor evil.
|
||||
|
@ -341,6 +342,15 @@ static int create_device(struct lavc_ctx *s)
|
|||
D3DDISPLAYMODE d3ddm;
|
||||
UINT adapter = D3DADAPTER_DEFAULT;
|
||||
|
||||
if (s->hwdec_info && s->hwdec_info->hwctx && s->hwdec_info->hwctx->d3d_ctx) {
|
||||
ctx->d3d9device = s->hwdec_info->hwctx->d3d_ctx->d3d9_device;
|
||||
if (ctx->d3d9device) {
|
||||
IDirect3D9_AddRef(ctx->d3d9device);
|
||||
MP_VERBOSE(ctx, "Using VO-supplied device %p.\n", ctx->d3d9device);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
ctx->d3dlib = LoadLibrary(L"d3d9.dll");
|
||||
if (!ctx->d3dlib) {
|
||||
MP_ERR(ctx, "Failed to load D3D9 library\n");
|
||||
|
|
|
@ -23,6 +23,7 @@ struct mp_hwdec_ctx {
|
|||
// API-specific, not needed by all backends.
|
||||
struct mp_vdpau_ctx *vdpau_ctx;
|
||||
struct mp_vaapi_ctx *vaapi_ctx;
|
||||
struct mp_d3d_ctx *d3d_ctx;
|
||||
|
||||
// Optional.
|
||||
// Allocates a software image from the pool, downloads the hw image from
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue