mirror of
https://github.com/mpv-player/mpv.git
synced 2026-10-29 15:11:09 +08:00
Adds a new render API backend that lets libmpv embedders render directly into an application-owned ID3D11Texture2D. The backend is selected with MPV_RENDER_API_TYPE_D3D11. The embedder supplies the ID3D11Device via MPV_RENDER_PARAM_D3D11_INIT_PARAMS at context creation, and the target texture via MPV_RENDER_PARAM_D3D11_FBO on each mpv_render_context_render() call. Swapchain creation and presentation stay entirely on the caller side. Co-authored-by: dragonflylee <dragonflylee@outlook.com>
42 lines
1.7 KiB
C
42 lines
1.7 KiB
C
#pragma once
|
|
|
|
#include "video/out/libmpv.h"
|
|
|
|
struct ra_tex;
|
|
|
|
struct libmpv_gpu_context {
|
|
struct mpv_global *global;
|
|
struct mp_log *log;
|
|
const struct libmpv_gpu_context_fns *fns;
|
|
|
|
struct ra_ctx *ra_ctx;
|
|
void *priv;
|
|
};
|
|
|
|
// Manage backend specific interaction between libmpv and ra backend, that can't
|
|
// be managed by ra itself (initialization and passing FBOs).
|
|
struct libmpv_gpu_context_fns {
|
|
// The libmpv API type name, see MPV_RENDER_PARAM_API_TYPE.
|
|
const char *api_name;
|
|
// Pretty much works like render_backend_fns.init, except that the
|
|
// API type is already checked by the caller.
|
|
// Successful init must set ctx->ra.
|
|
int (*init)(struct libmpv_gpu_context *ctx, mpv_render_param *params);
|
|
// Wrap the surface passed to mpv_render_context_render() (via the params
|
|
// array) into a ra_tex and return it. Returns a libmpv error code, and sets
|
|
// *out to a temporary object on success. The returned object is valid until
|
|
// another wrap_fbo() or done_frame() is called.
|
|
// This does not need to care about generic attributes, like flipping.
|
|
int (*wrap_fbo)(struct libmpv_gpu_context *ctx, mpv_render_param *params,
|
|
struct ra_tex **out);
|
|
// Signal that the ra_tex object obtained with wrap_fbo is no longer used.
|
|
// For certain backends, this might also be used to signal the end of
|
|
// rendering (like OpenGL doing weird crap).
|
|
void (*done_frame)(struct libmpv_gpu_context *ctx, bool ds);
|
|
// Free all data in ctx->priv.
|
|
void (*destroy)(struct libmpv_gpu_context *ctx);
|
|
};
|
|
|
|
extern const struct libmpv_gpu_context_fns libmpv_gpu_context_gl;
|
|
extern const struct libmpv_gpu_context_fns libmpv_gpu_context_d3d11;
|