gl_common: add some sort of locking API

Some OpenGL implementations on some platforms require that a context
is current only on one thread. For this reason, mpgl_lock() and
mpgl_unlock() take care of this as well for convenience.

Each backend that needs thread safety should provide it's own locking strategy
inside of `set_current`.
This commit is contained in:
wm4 2013-03-04 00:38:04 +01:00 committed by Stefano Pigozzi
parent 4ee0d08820
commit d0924ae5a8
2 changed files with 35 additions and 0 deletions

View File

@ -940,6 +940,33 @@ void mpgl_uninit(MPGLContext *ctx)
talloc_free(ctx);
}
void mpgl_set_context(MPGLContext *ctx)
{
if (ctx->set_current)
ctx->set_current(ctx, true);
}
void mpgl_unset_context(MPGLContext *ctx)
{
if (ctx->set_current)
ctx->set_current(ctx, false);
}
void mpgl_lock(MPGLContext *ctx)
{
mpgl_set_context(ctx);
}
void mpgl_unlock(MPGLContext *ctx)
{
mpgl_unset_context(ctx);
}
bool mpgl_is_thread_safe(MPGLContext *ctx)
{
return !!ctx->set_current;
}
void mp_log_source(int mod, int lev, const char *src)
{
int line = 1;

View File

@ -26,6 +26,7 @@
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include "config.h"
#include "core/mp_msg.h"
@ -111,6 +112,7 @@ typedef struct MPGLContext {
int (*vo_init)(struct vo *vo);
void (*vo_uninit)(struct vo *vo);
void (*releaseGlContext)(struct MPGLContext *);
void (*set_current)(struct MPGLContext *, bool current);
// Resize the window, or create a new window if there isn't one yet.
// On the first call, it creates a GL context according to what's specified
@ -136,6 +138,12 @@ typedef struct MPGLContext {
MPGLContext *mpgl_init(struct vo *vo, const char *backend_name);
void mpgl_uninit(MPGLContext *ctx);
void mpgl_lock(MPGLContext *ctx);
void mpgl_unlock(MPGLContext *ctx);
void mpgl_set_context(MPGLContext *ctx);
void mpgl_unset_context(MPGLContext *ctx);
bool mpgl_is_thread_safe(MPGLContext *ctx);
// Create a VO window and create a GL context on it.
// (Calls config_window_gl3 or config_window+setGlWindow.)
// gl_caps: bitfield of MPGL_CAP_* (required GL version and feature set)