summaryrefslogtreecommitdiffstats
path: root/video/out/opengl/hwdec_dxva2.c
blob: f72c817a204d34ab256a64b7323e06405cb31c05 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include "common/common.h"

#include "hwdec.h"
#include "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->MPGetNativeDisplay)
        return -1;

    struct priv *p = talloc_zero(hw, struct priv);
    hw->priv = p;

    p->ctx.d3d9_device = gl->MPGetNativeDisplay("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 = {
    .name = "dxva2-dummy",
    .api = HWDEC_DXVA2_COPY,
    .imgfmt = -1,
    .create = create,
    .reinit = reinit,
    .map_image = map_image,
    .destroy = destroy,
};