mirror of
https://github.com/mpv-player/mpv
synced 2024-12-23 23:32:26 +00:00
561416597e
This is basically a hack for drivers which prevent the mpv DXVA2 decoder glue from working if OpenGL is in fullscreen mode. Since it doesn't add any "hard" new API to the client API, some of the code would be required for a true zero-copy hw decoding pipeline, and sine it isn't too much code after all, this is probably acceptable.
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,
|
|
};
|