mirror of https://github.com/mpv-player/mpv
65 lines
1.4 KiB
C
65 lines
1.4 KiB
C
|
#include "common/common.h"
|
||
|
|
||
|
#include "gl_hwdec.h"
|
||
|
#include "gl_utils.h"
|
||
|
#include "video/d3d.h"
|
||
|
#include "video/hwdec.h"
|
||
|
|
||
|
// This does not provide real (zero-copy) interop - it merely exists for
|
||
|
// making sure the same D3D device is used for decoding and display, which
|
||
|
// may help with OpenGL fullscreen mode.
|
||
|
|
||
|
struct priv {
|
||
|
struct mp_d3d_ctx ctx;
|
||
|
};
|
||
|
|
||
|
static void destroy(struct gl_hwdec *hw)
|
||
|
{
|
||
|
struct priv *p = hw->priv;
|
||
|
if (p->ctx.d3d9_device)
|
||
|
IDirect3DDevice9_Release(p->ctx.d3d9_device);
|
||
|
}
|
||
|
|
||
|
static int create(struct gl_hwdec *hw)
|
||
|
{
|
||
|
GL *gl = hw->gl;
|
||
|
if (hw->hwctx || !gl->MPGetD3DInterface)
|
||
|
return -1;
|
||
|
|
||
|
struct priv *p = talloc_zero(hw, struct priv);
|
||
|
hw->priv = p;
|
||
|
|
||
|
p->ctx.d3d9_device = gl->MPGetD3DInterface("IDirect3DDevice9");
|
||
|
if (!p->ctx.d3d9_device)
|
||
|
return -1;
|
||
|
|
||
|
p->ctx.hwctx.type = HWDEC_DXVA2_COPY;
|
||
|
p->ctx.hwctx.d3d_ctx = &p->ctx;
|
||
|
|
||
|
MP_VERBOSE(hw, "Using libmpv supplied device %p.\n", p->ctx.d3d9_device);
|
||
|
|
||
|
hw->hwctx = &p->ctx.hwctx;
|
||
|
hw->converted_imgfmt = 0;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int reinit(struct gl_hwdec *hw, struct mp_image_params *params)
|
||
|
{
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
static int map_image(struct gl_hwdec *hw, struct mp_image *hw_image,
|
||
|
GLuint *out_textures)
|
||
|
{
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
const struct gl_hwdec_driver gl_hwdec_dxva2 = {
|
||
|
.api_name = "dxva2",
|
||
|
.imgfmt = -1,
|
||
|
.create = create,
|
||
|
.reinit = reinit,
|
||
|
.map_image = map_image,
|
||
|
.destroy = destroy,
|
||
|
};
|