#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;
