1
mirror of https://code.videolan.org/videolan/vlc synced 2024-10-07 03:56:28 +02:00
vlc/include/vlc_opengl.h
Alexandre Janniaux c0b2f318ce vlc_opengl: document vlc_gl_GetProcAddress
Document that the function must be called with a context enabled. Even
if most low-level implementation will allow getting an address without
a context, so as to keep the same symbol across contexts, some other
common implementations like glfw[^1] will require an active context.

[^1]: https://www.glfw.org/docs/3.3/group__context.html#ga35f1837e6f666781842483937612f163
2022-06-03 10:58:55 +00:00

184 lines
5.4 KiB
C

/*****************************************************************************
* vlc_opengl.h: VLC GL API
*****************************************************************************
* Copyright (C) 2009 Laurent Aimar
* Copyright (C) 2011 Rémi Denis-Courmont
*
* Authors: Laurent Aimar <fenrir _AT_ videolan _DOT_ org>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifndef VLC_GL_H
#define VLC_GL_H 1
# ifdef __cplusplus
extern "C" {
# endif
/**
* \file
* This file defines GL structures and functions.
*/
struct vlc_window;
struct vlc_window_cfg;
struct vout_display_cfg;
/**
* A VLC GL context (and its underlying surface)
*/
typedef struct vlc_gl_t vlc_gl_t;
struct vlc_decoder_device;
struct vlc_video_context;
enum vlc_gl_api_type {
VLC_OPENGL,
VLC_OPENGL_ES2,
};
struct vlc_gl_operations
{
union {
void (*swap)(vlc_gl_t *);
picture_t *(*swap_offscreen)(vlc_gl_t *);
};
int (*make_current)(vlc_gl_t *gl);
void (*release_current)(vlc_gl_t *gl);
void (*resize)(vlc_gl_t *gl, unsigned width, unsigned height);
void*(*get_proc_address)(vlc_gl_t *gl, const char *symbol);
void (*close)(vlc_gl_t *gl);
};
struct vlc_gl_t
{
struct vlc_object_t obj;
module_t *module;
void *sys;
struct vlc_decoder_device *device;
union {
struct { /* on-screen */
struct vlc_window *surface;
};
struct { /* off-screen */
vlc_fourcc_t offscreen_chroma_out;
struct vlc_video_context *offscreen_vctx_out;
/* Flag to indicate if the OpenGL implementation produces upside-down
* pictures */
bool offscreen_vflip;
};
};
/* Defined by the core for libvlc_opengl API loading. */
enum vlc_gl_api_type api_type;
const struct vlc_gl_operations *ops;
};
/**
* Creates an OpenGL context (and its underlying surface).
*
* @note In most cases, you should vlc_gl_MakeCurrent() afterward.
*
* @param cfg initial configuration (including window to use as OpenGL surface)
* @param flags OpenGL context type
* @param name module name (or NULL for auto)
* @return a new context, or NULL on failure
*/
VLC_API vlc_gl_t *vlc_gl_Create(const struct vout_display_cfg *cfg,
unsigned flags, const char *name) VLC_USED;
VLC_API vlc_gl_t *vlc_gl_CreateOffscreen(vlc_object_t *parent,
struct vlc_decoder_device *device,
unsigned width, unsigned height,
unsigned flags, const char *name);
VLC_API void vlc_gl_Delete(vlc_gl_t *);
static inline int vlc_gl_MakeCurrent(vlc_gl_t *gl)
{
return gl->ops->make_current(gl);
}
static inline void vlc_gl_ReleaseCurrent(vlc_gl_t *gl)
{
gl->ops->release_current(gl);
}
static inline void vlc_gl_Resize(vlc_gl_t *gl, unsigned w, unsigned h)
{
if (gl->ops->resize != NULL)
gl->ops->resize(gl, w, h);
}
static inline void vlc_gl_Swap(vlc_gl_t *gl)
{
gl->ops->swap(gl);
}
static inline picture_t *vlc_gl_SwapOffscreen(vlc_gl_t *gl)
{
return gl->ops->swap_offscreen(gl);
}
/**
* Fetch a symbol or pointer function from the OpenGL implementation.
*
* Return a pointer from the OpenGL implementation, which can be part of
* either the underlying OpenGL provider or an OpenGL function matching
* the version requested.
*
* If the symbol name is not matching the underlying implementation of
* OpenGL, an invalid pointer or NULL can be returned.
*
* @note This function must be called between MakeCurrent and ReleaseCurrent.
*
* @param gl the OpenGL provider to fetch the function from
* @param name the symbol name to fetch from the implementation
*
* @return A pointer corresponding to the symbol, or a potentially invalid
* value or NULL in case of error.
*/
static inline void *vlc_gl_GetProcAddress(vlc_gl_t *gl, const char *name)
{
return gl->ops->get_proc_address(gl, name);
}
VLC_API vlc_gl_t *vlc_gl_surface_Create(vlc_object_t *,
const struct vlc_window_cfg *,
struct vlc_window **) VLC_USED;
VLC_API bool vlc_gl_surface_CheckSize(vlc_gl_t *, unsigned *w, unsigned *h);
VLC_API void vlc_gl_surface_Destroy(vlc_gl_t *);
static inline bool vlc_gl_StrHasToken(const char *apis, const char *api)
{
size_t apilen = strlen(api);
while (apis) {
while (*apis == ' ')
apis++;
if (!strncmp(apis, api, apilen) && memchr(" ", apis[apilen], 2))
return true;
apis = strchr(apis, ' ');
}
return false;
}
#ifdef __cplusplus
}
#endif /* C++ */
#endif /* VLC_GL_H */