mirror of https://github.com/mpv-player/mpv
gl_common: minor cleanup/refactor
Remove all platform/GUI specific includes from gl_common.h. Get rid of the ugly union in MPGLContext. Use function pointers instead of an ifdef ridden switch statement in uninit_mpglcontext(). Always include glext.h, not only on Windows. None of this should actually change any functionality.
This commit is contained in:
parent
4b883505f6
commit
fea8c85c85
|
@ -1764,8 +1764,13 @@ static void cocoa_fullscreen(struct vo *vo)
|
|||
#endif
|
||||
|
||||
#ifdef CONFIG_GL_WIN32
|
||||
#include <windows.h>
|
||||
#include "w32_common.h"
|
||||
|
||||
struct w32_context {
|
||||
int vinfo;
|
||||
HGLRC context;
|
||||
};
|
||||
|
||||
static int create_window_w32(struct MPGLContext *ctx, uint32_t d_width,
|
||||
uint32_t d_height, uint32_t flags)
|
||||
|
@ -1797,7 +1802,8 @@ static int create_window_w32_gl3(struct MPGLContext *ctx, int gl_flags,
|
|||
if (!vo_w32_config(d_width, d_height, flags))
|
||||
return -1;
|
||||
|
||||
HGLRC *context = &ctx->context.w32;
|
||||
struct w32_context *w32_ctx = ctx->priv;
|
||||
HGLRC *context = &w32_ctx->context;
|
||||
|
||||
if (*context) // reuse existing context
|
||||
return 0; // not reusing it breaks gl3!
|
||||
|
@ -1891,8 +1897,9 @@ out:
|
|||
static int setGlWindow_w32(MPGLContext *ctx)
|
||||
{
|
||||
HWND win = vo_w32_window;
|
||||
int *vinfo = &ctx->vinfo.w32;
|
||||
HGLRC *context = &ctx->context.w32;
|
||||
struct w32_context *w32_ctx = ctx->priv;
|
||||
int *vinfo = &w32_ctx->vinfo;
|
||||
HGLRC *context = &w32_ctx->context;
|
||||
int new_vinfo;
|
||||
HDC windc = vo_w32_get_dc(win);
|
||||
HGLRC new_context = 0;
|
||||
|
@ -1954,8 +1961,9 @@ out:
|
|||
|
||||
static void releaseGlContext_w32(MPGLContext *ctx)
|
||||
{
|
||||
int *vinfo = &ctx->vinfo.w32;
|
||||
HGLRC *context = &ctx->context.w32;
|
||||
struct w32_context *w32_ctx = ctx->priv;
|
||||
int *vinfo = &w32_ctx->vinfo;
|
||||
HGLRC *context = &w32_ctx->context;
|
||||
*vinfo = 0;
|
||||
if (*context) {
|
||||
wglMakeCurrent(0, 0);
|
||||
|
@ -1977,10 +1985,19 @@ static void new_vo_w32_border(struct vo *vo) { vo_w32_border(); }
|
|||
static void new_vo_w32_fullscreen(struct vo *vo) { vo_w32_fullscreen(); }
|
||||
static int new_vo_w32_check_events(struct vo *vo) { return vo_w32_check_events(); }
|
||||
static void new_w32_update_xinerama_info(struct vo *vo) { w32_update_xinerama_info(); }
|
||||
static void new_vo_w32_uninit(struct vo *vo) { vo_w32_uninit(); }
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_GL_X11
|
||||
#include <X11/Xlib.h>
|
||||
#include <GL/glx.h>
|
||||
#include "x11_common.h"
|
||||
|
||||
struct glx_context {
|
||||
XVisualInfo *vinfo;
|
||||
GLXContext context;
|
||||
};
|
||||
|
||||
static int create_window_x11(struct MPGLContext *ctx, uint32_t d_width,
|
||||
uint32_t d_height, uint32_t flags)
|
||||
{
|
||||
|
@ -2071,8 +2088,9 @@ static char *get_glx_exts(MPGLContext *ctx)
|
|||
*/
|
||||
static int setGlWindow_x11(MPGLContext *ctx)
|
||||
{
|
||||
XVisualInfo **vinfo = &ctx->vinfo.x11;
|
||||
GLXContext *context = &ctx->context.x11;
|
||||
struct glx_context *glx_context = ctx->priv;
|
||||
XVisualInfo **vinfo = &glx_context->vinfo;
|
||||
GLXContext *context = &glx_context->context;
|
||||
Display *display = ctx->vo->x11->display;
|
||||
Window win = ctx->vo->x11->window;
|
||||
XVisualInfo *new_vinfo;
|
||||
|
@ -2174,13 +2192,14 @@ static int create_window_x11_gl3(struct MPGLContext *ctx, int gl_flags,
|
|||
uint32_t d_height, uint32_t flags)
|
||||
{
|
||||
struct vo *vo = ctx->vo;
|
||||
struct glx_context *glx_ctx = ctx->priv;
|
||||
|
||||
if (ctx->context.x11) {
|
||||
if (glx_ctx->context) {
|
||||
// GL context and window already exist.
|
||||
// Only update window geometry etc.
|
||||
Colormap colormap = XCreateColormap(vo->x11->display, vo->x11->rootwin,
|
||||
ctx->vinfo.x11->visual, AllocNone);
|
||||
vo_x11_create_vo_window(vo, ctx->vinfo.x11, vo->dx, vo->dy, d_width,
|
||||
glx_ctx->vinfo->visual, AllocNone);
|
||||
vo_x11_create_vo_window(vo, glx_ctx->vinfo, vo->dx, vo->dy, d_width,
|
||||
d_height, flags, colormap, "gl");
|
||||
XFreeColormap(vo->x11->display, colormap);
|
||||
return SET_WINDOW_OK;
|
||||
|
@ -2276,8 +2295,8 @@ static int create_window_x11_gl3(struct MPGLContext *ctx, int gl_flags,
|
|||
return SET_WINDOW_FAILED;
|
||||
}
|
||||
|
||||
ctx->vinfo.x11 = vinfo;
|
||||
ctx->context.x11 = context;
|
||||
glx_ctx->vinfo = vinfo;
|
||||
glx_ctx->context = context;
|
||||
|
||||
getFunctions(ctx->gl, (void *)glXGetProcAddress, glxstr, true);
|
||||
|
||||
|
@ -2292,8 +2311,9 @@ static int create_window_x11_gl3(struct MPGLContext *ctx, int gl_flags,
|
|||
*/
|
||||
static void releaseGlContext_x11(MPGLContext *ctx)
|
||||
{
|
||||
XVisualInfo **vinfo = &ctx->vinfo.x11;
|
||||
GLXContext *context = &ctx->context.x11;
|
||||
struct glx_context *glx_ctx = ctx->priv;
|
||||
XVisualInfo **vinfo = &glx_ctx->vinfo;
|
||||
GLXContext *context = &glx_ctx->context;
|
||||
Display *display = ctx->vo->x11->display;
|
||||
GL *gl = ctx->gl;
|
||||
if (*vinfo)
|
||||
|
@ -2363,6 +2383,7 @@ static int sdl_check_events(struct vo *vo)
|
|||
|
||||
static void new_sdl_update_xinerama_info(struct vo *vo) { sdl_update_xinerama_info(); }
|
||||
static void new_vo_sdl_fullscreen(struct vo *vo) { vo_sdl_fullscreen(); }
|
||||
static void new_vo_sdl_uninit(struct vo *vo) { vo_sdl_uninit(); }
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -2426,12 +2447,14 @@ MPGLContext *init_mpglcontext(enum MPGLType type, struct vo *vo)
|
|||
ctx->check_events = cocoa_check_events;
|
||||
ctx->update_xinerama_info = cocoa_update_xinerama_info;
|
||||
ctx->fullscreen = cocoa_fullscreen;
|
||||
ctx->vo_uninit = vo_cocoa_uninit;
|
||||
if (vo_cocoa_init(vo))
|
||||
return ctx;
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_GL_WIN32
|
||||
case GLTYPE_W32:
|
||||
ctx->priv = talloc_zero(ctx, struct w32_context);
|
||||
ctx->create_window = create_window_w32;
|
||||
ctx->create_window_gl3 = create_window_w32_gl3;
|
||||
ctx->setGlWindow = setGlWindow_w32;
|
||||
|
@ -2442,6 +2465,7 @@ MPGLContext *init_mpglcontext(enum MPGLType type, struct vo *vo)
|
|||
ctx->check_events = new_vo_w32_check_events;
|
||||
ctx->fullscreen = new_vo_w32_fullscreen;
|
||||
ctx->ontop = new_vo_w32_ontop;
|
||||
ctx->vo_uninit = new_vo_w32_uninit;
|
||||
//the win32 code is hardcoded to use the deprecated vo API
|
||||
global_vo = vo;
|
||||
if (vo_w32_init())
|
||||
|
@ -2450,6 +2474,7 @@ MPGLContext *init_mpglcontext(enum MPGLType type, struct vo *vo)
|
|||
#endif
|
||||
#ifdef CONFIG_GL_X11
|
||||
case GLTYPE_X11:
|
||||
ctx->priv = talloc_zero(ctx, struct glx_context);
|
||||
ctx->create_window = create_window_x11;
|
||||
ctx->setGlWindow = setGlWindow_x11;
|
||||
ctx->create_window_gl3 = create_window_x11_gl3;
|
||||
|
@ -2460,6 +2485,7 @@ MPGLContext *init_mpglcontext(enum MPGLType type, struct vo *vo)
|
|||
ctx->check_events = vo_x11_check_events;
|
||||
ctx->fullscreen = vo_x11_fullscreen;
|
||||
ctx->ontop = vo_x11_ontop;
|
||||
ctx->vo_uninit = vo_x11_uninit;
|
||||
if (vo_init(vo))
|
||||
return ctx;
|
||||
break;
|
||||
|
@ -2473,6 +2499,7 @@ MPGLContext *init_mpglcontext(enum MPGLType type, struct vo *vo)
|
|||
ctx->update_xinerama_info = new_sdl_update_xinerama_info;
|
||||
ctx->check_events = sdl_check_events;
|
||||
ctx->fullscreen = new_vo_sdl_fullscreen;
|
||||
ctx->vo_uninit = new_vo_sdl_uninit;
|
||||
//the SDL code is hardcoded to use the deprecated vo API
|
||||
global_vo = vo;
|
||||
if (vo_sdl_init())
|
||||
|
@ -2507,28 +2534,7 @@ void uninit_mpglcontext(MPGLContext *ctx)
|
|||
if (!ctx)
|
||||
return;
|
||||
ctx->releaseGlContext(ctx);
|
||||
switch (ctx->type) {
|
||||
#ifdef CONFIG_GL_COCOA
|
||||
case GLTYPE_COCOA:
|
||||
vo_cocoa_uninit(ctx->vo);
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_GL_WIN32
|
||||
case GLTYPE_W32:
|
||||
vo_w32_uninit();
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_GL_X11
|
||||
case GLTYPE_X11:
|
||||
vo_x11_uninit(ctx->vo);
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_GL_SDL
|
||||
case GLTYPE_SDL:
|
||||
vo_sdl_uninit();
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
ctx->vo_uninit(ctx->vo);
|
||||
talloc_free(ctx);
|
||||
}
|
||||
|
||||
|
|
|
@ -33,22 +33,8 @@
|
|||
#include "video_out.h"
|
||||
#include "csputils.h"
|
||||
|
||||
#ifdef CONFIG_GL_WIN32
|
||||
#include <windows.h>
|
||||
#include "w32_common.h"
|
||||
#endif
|
||||
#ifdef CONFIG_GL_X11
|
||||
#include <X11/Xlib.h>
|
||||
#include <GL/glx.h>
|
||||
#include "x11_common.h"
|
||||
// This old-vo wrapper macro would conflict with the struct member
|
||||
#undef update_xinerama_info
|
||||
#endif
|
||||
#include <GL/gl.h>
|
||||
|
||||
#ifdef CONFIG_GL_WIN32
|
||||
#include <GL/glext.h>
|
||||
#endif
|
||||
|
||||
#include "libvo/gl_header_fixes.h"
|
||||
|
||||
|
@ -191,22 +177,9 @@ typedef struct MPGLContext {
|
|||
GL *gl;
|
||||
enum MPGLType type;
|
||||
struct vo *vo;
|
||||
void *priv;
|
||||
// Bit size of each component in the created framebuffer. 0 if unknown.
|
||||
int depth_r, depth_g, depth_b;
|
||||
union {
|
||||
int w32;
|
||||
#ifdef CONFIG_GL_X11
|
||||
XVisualInfo *x11;
|
||||
#endif
|
||||
} vinfo;
|
||||
union {
|
||||
#ifdef CONFIG_GL_WIN32
|
||||
HGLRC w32;
|
||||
#endif
|
||||
#ifdef CONFIG_GL_X11
|
||||
GLXContext x11;
|
||||
#endif
|
||||
} context;
|
||||
int (*create_window)(struct MPGLContext *ctx, uint32_t d_width,
|
||||
uint32_t d_height, uint32_t flags);
|
||||
int (*setGlWindow)(struct MPGLContext *);
|
||||
|
@ -214,6 +187,7 @@ typedef struct MPGLContext {
|
|||
void (*swapGlBuffers)(struct MPGLContext *);
|
||||
int (*check_events)(struct vo *vo);
|
||||
void (*fullscreen)(struct vo *vo);
|
||||
void (*vo_uninit)(struct vo *vo);
|
||||
// only available if GL3 context creation is supported
|
||||
// gl_flags: bitfield of MPGLFLAG_* constants
|
||||
// gl_version: requested OpenGL version number (use MPGL_VER())
|
||||
|
|
Loading…
Reference in New Issue