gstreamer/gst-libs/gst/vaapi/gstvaapiutils_egl.h
Matthew Waters d270654c48 gst: don't use volatile to mean atomic
volatile is not sufficient to provide atomic guarantees and real atomics
should be used instead.  GCC 11 has started warning about using volatile
with atomic operations.

https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1719

Discovered in https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/issues/868

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/418>
2021-03-19 19:03:54 +11:00

256 lines
6.3 KiB
C

/*
* gstvaapiutils_egl.h - EGL utilities
*
* Copyright (C) 2014 Intel Corporation
* Author: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
*
* This library 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 library 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 library; if not, write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301
*/
#ifndef GST_VAAPI_UTILS_EGL_H
#define GST_VAAPI_UTILS_EGL_H
#include <gmodule.h>
#include <gst/gstinfo.h>
#include <gst/video/video-format.h>
#include "egl_compat.h"
#include "gstvaapiminiobject.h"
typedef union egl_handle_s EglHandle;
typedef struct egl_object_s EglObject;
typedef struct egl_object_class_s EglObjectClass;
typedef struct egl_vtable_s EglVTable;
typedef struct egl_display_s EglDisplay;
typedef struct egl_config_s EglConfig;
typedef struct egl_context_state_s EglContextState;
typedef struct egl_context_s EglContext;
typedef struct egl_surface_s EglSurface;
typedef struct egl_program_s EglProgram;
typedef struct egl_window_s EglWindow;
#define EGL_PROTO_BEGIN(NAME, TYPE, EXTENSION) \
typedef TYPE (*GL_PROTO_GEN_CONCAT3(Egl,NAME,Proc))
#define EGL_PROTO_END() ;
#define GL_PROTO_BEGIN(NAME, TYPE, EXTENSION) \
typedef TYPE (*GL_PROTO_GEN_CONCAT3(Gl,NAME,Proc))
#define GL_PROTO_ARG_LIST(...) (__VA_ARGS__)
#define GL_PROTO_ARG(NAME, TYPE) TYPE NAME
#define GL_PROTO_END() ;
#include "egl_vtable.h"
enum {
EGL_PLATFORM_UNKNOWN,
EGL_PLATFORM_X11,
EGL_PLATFORM_WAYLAND,
};
union egl_handle_s
{
gpointer p;
guintptr u;
gintptr i;
};
struct egl_object_s
{
/*< private >*/
GstVaapiMiniObject parent_instance;
EglHandle handle;
guint is_wrapped:1;
guint is_valid:1;
};
struct egl_object_class_s
{
/*< private >*/
GstVaapiMiniObjectClass parent_class;
};
struct egl_vtable_s
{
EglObject base;
gchar **egl_extensions;
guint num_egl_symbols;
gchar **gl_extensions;
guint num_gl_symbols;
guint gles_version;
#define EGL_PROTO_BEGIN(NAME, TYPE, EXTENSION) \
GL_PROTO_BEGIN_I(NAME, TYPE, EXTENSION, Egl, egl)
#define GL_PROTO_BEGIN(NAME, TYPE, EXTENSION) \
GL_PROTO_BEGIN_I(NAME, TYPE, EXTENSION, Gl, gl)
#define GL_PROTO_BEGIN_I(NAME, TYPE, EXTENSION, Prefix, prefix) \
GL_PROTO_GEN_CONCAT3(Prefix,NAME,Proc) GL_PROTO_GEN_CONCAT(prefix,NAME);
#include "egl_vtable.h"
#define EGL_DEFINE_EXTENSION(EXTENSION) \
GL_DEFINE_EXTENSION_I(EXTENSION, EGL)
#define GL_DEFINE_EXTENSION(EXTENSION) \
GL_DEFINE_EXTENSION_I(EXTENSION, GL)
#define GL_DEFINE_EXTENSION_I(EXTENSION, PREFIX) \
guint GL_PROTO_GEN_CONCAT4(has_,PREFIX,_,EXTENSION);
#include "egl_vtable.h"
};
struct egl_display_s
{
EglObject base;
gchar *gl_vendor_string;
gchar *gl_version_string;
gchar *gl_apis_string;
guint gl_apis; /* EGL_*_BIT mask */
guint gl_platform;
GMutex mutex;
GThread *gl_thread;
GCond gl_thread_ready;
gboolean gl_thread_cancel;
GAsyncQueue *gl_queue;
gboolean created;
};
struct egl_config_s
{
EglObject base;
EglDisplay *display;
guint gl_api; /* EGL_*_API value */
guint gles_version;
gint config_id;
gint visual_id;
};
typedef void (*EglContextRunFunc) (gpointer args);
struct egl_context_state_s
{
EGLDisplay display;
EGLContext context;
EGLSurface read_surface;
EGLSurface draw_surface;
};
struct egl_context_s
{
EglObject base;
EglVTable *vtable;
EglDisplay *display;
EglConfig *config;
EglSurface *read_surface;
EglSurface *draw_surface;
};
struct egl_surface_s
{
EglObject base;
EglDisplay *display;
};
/* Defined to the maximum number of uniforms for a shader program */
#define EGL_MAX_UNIFORMS 16
struct egl_program_s
{
EglObject base;
EglVTable *vtable;
guint frag_shader;
guint vert_shader;
gint uniforms[EGL_MAX_UNIFORMS];
};
struct egl_window_s
{
EglObject base;
EglContext *context;
EglSurface *surface;
};
#define egl_object_ref(obj) \
((gpointer)gst_vaapi_mini_object_ref ((GstVaapiMiniObject *)(obj)))
#define egl_object_unref(obj) \
gst_vaapi_mini_object_unref ((GstVaapiMiniObject *)(obj))
#define egl_object_replace(old_obj_ptr, new_obj) \
gst_vaapi_mini_object_replace ((GstVaapiMiniObject **)(old_obj_ptr), \
(GstVaapiMiniObject *)(new_obj))
G_GNUC_INTERNAL
EglDisplay *
egl_display_new (gpointer native_display, guint gl_platform);
G_GNUC_INTERNAL
EglDisplay *
egl_display_new_wrapped (EGLDisplay gl_display);
G_GNUC_INTERNAL
EglConfig *
egl_config_new (EglDisplay * display, guint gles_version,
GstVideoFormat format);
G_GNUC_INTERNAL
EglConfig *
egl_config_new_with_attribs (EglDisplay * display, const EGLint * attribs);
G_GNUC_INTERNAL
EglContext *
egl_context_new (EglDisplay * display, EglConfig * config, EglContext * parent);
G_GNUC_INTERNAL
EglContext *
egl_context_new_wrapped (EglDisplay * display, EGLContext gl_context);
G_GNUC_INTERNAL
EglVTable *
egl_context_get_vtable (EglContext * ctx, gboolean need_gl_symbols);
G_GNUC_INTERNAL
gboolean
egl_context_set_current (EglContext * ctx, gboolean activate,
EglContextState * old_cs);
G_GNUC_INTERNAL
gboolean
egl_context_run (EglContext * ctx, EglContextRunFunc func, gpointer args);
G_GNUC_INTERNAL
EglProgram *
egl_program_new (EglContext * ctx, const gchar * frag_shader_text,
const gchar * vert_shader_text);
G_GNUC_INTERNAL
EglWindow *
egl_window_new (EglContext * ctx, gpointer native_window);
G_GNUC_INTERNAL
guint
egl_create_texture (EglContext * ctx, guint target, guint format,
guint width, guint height);
G_GNUC_INTERNAL
void
egl_destroy_texture (EglContext * ctx, guint texture);
G_GNUC_INTERNAL
void
egl_matrix_set_identity (gfloat m[16]);
#endif /* GST_VAAPI_UTILS_EGL_H */