Commit 0be301af authored by Matthew Waters's avatar Matthew Waters 🐨 Committed by Tim-Philipp Müller

[621/906] GstGLRendererAPI => GstGLAPI and get GstGLAPI from a window

parent e1ec48b6
......@@ -58,7 +58,7 @@ struct _GstGLWindowCocoaClass {
GType gst_gl_window_cocoa_get_type (void);
GstGLWindowCocoa * gst_gl_window_cocoa_new (GstGLRendererAPI render_api,
GstGLWindowCocoa * gst_gl_window_cocoa_new (GstGLAPI gl_api,
guintptr external_gl_context);
G_END_DECLS
......
......@@ -123,6 +123,7 @@ void gst_gl_window_cocoa_quit (GstGLWindow * window, GstGLWindowCB callback,
gpointer data);
void gst_gl_window_cocoa_send_message (GstGLWindow * window,
GstGLWindowCB callback, gpointer data);
GstGLAPI gst_gl_window_cocoa_get_gl_api (GstGLWindow * window);
struct _GstGLWindowCocoaPrivate
{
......@@ -177,6 +178,8 @@ gst_gl_window_cocoa_class_init (GstGLWindowCocoaClass * klass)
window_class->quit = GST_DEBUG_FUNCPTR (gst_gl_window_cocoa_quit);
window_class->send_message =
GST_DEBUG_FUNCPTR (gst_gl_window_cocoa_send_message);
window_class->get_gl_api =
GST_DEBUG_FUNCPTR (gst_gl_window_cocoa_get_gl_api);
#ifndef GNUSTEP
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
......@@ -194,7 +197,7 @@ gst_gl_window_cocoa_init (GstGLWindowCocoa * window)
/* Must be called in the gl thread */
GstGLWindowCocoa *
gst_gl_window_cocoa_new (GstGLRendererAPI render_api, guintptr external_gl_context)
gst_gl_window_cocoa_new (GstGLAPI gl_api, guintptr external_gl_context)
{
GstGLWindowCocoa *window = g_object_new (GST_GL_TYPE_WINDOW_COCOA, NULL);
GstGLWindowCocoaPrivate *priv = window->priv;
......@@ -446,6 +449,11 @@ gst_gl_window_cocoa_send_message (GstGLWindow * window, GstGLWindowCB callback,
}
}
GstGLAPI
gst_gl_window_cocoa_get_gl_api (GstGLWindow * window)
{
return GST_GL_API_OPENGL;
}
/* =============================================================*/
/* */
......
......@@ -22,82 +22,61 @@
#define __GST_GL_RENDERER_H__
/* OpenGL 2.0 for Embedded Systems */
#ifdef GST_GL_RENDERER_GLES2
# undef UNICODE
# include <EGL/egl.h>
# define UNICODE
#ifdef HAVE_GLES2
# include <GLES2/gl2.h>
# include "gstgles2.h"
/* OpenGL for usual systems */
# if !HAVE_OPENGL
# include "gstgles2.h"
# endif
#endif
#if GST_GL_RENDERER_GL || GST_GL_RENDERER_GL3
/* OpenGL for usual systems */
#if HAVE_OPENGL
# if __APPLE__
# include <GL/glew.h>
# include <OpenGL/OpenGL.h>
# include <OpenGL/gl.h>
# else
# if HAVE_GLEW
# include <GL/glew.h>
# endif
# include <GL/gl.h>
# include <GL/gl.h>
# endif
#endif
#include <gst/gst.h>
G_BEGIN_DECLS
#if HAVE_GLX
# include <GL/glx.h>
#endif
#define GST_GL_TYPE_RENDERER (gst_gl_renderer_get_type())
#define GST_GL_RENDERER(o) (G_TYPE_CHECK_INSTANCE_CAST((o), GST_GL_TYPE_RENDERER, GstGLRenderer))
#define GST_GL_RENDERER_CLASS(k) (G_TYPE_CHECK_CLASS((k), GST_GL_TYPE_RENDERER, GstGLRendererClass))
#define GST_GL_IS_RENDERER(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_RENDERER))
#define GST_GL_IS_RENDERER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_RENDERER))
#define GST_GL_RENDERER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GST_GL_TYPE_RENDERER, GstGLRendererClass))
#if HAVE_EGL
# undef UNICODE
# include <EGL/egl.h>
# define UNICODE
#endif
#define GST_GL_RENDERER_ERROR (gst_gl_renderer_error_quark ())
#include <gst/gst.h>
typedef struct _GstGLRenderer GstGLRenderer;
typedef struct _GstGLRendererPrivate GstGLRendererPrivate;
typedef struct _GstGLRendererClass GstGLRendererClass;
G_BEGIN_DECLS
typedef enum {
GST_GL_RENDERER_API_OPENGL = 1,
GST_GL_RENDERER_API_OPENGL3 = 2,
GST_GL_RENDERER_API_GLES = 40,
GST_GL_RENDERER_API_GLES2 = 41,
GST_GL_RENDERER_API_GLES3 = 42,
GST_GL_RENDERER_API_ANY = 254,
GST_GL_RENDERER_API_LAST = 255
} GstGLRendererAPI;
struct _GstGLRenderer {
/*< private >*/
GObject parent;
/*< public >*/
GstGLRendererAPI renderer_api;
/*< private >*/
gpointer _reserved[GST_PADDING_LARGE];
};
struct _GstGLRendererClass {
/*< private >*/
GObjectClass parent_class;
/*< private >*/
gpointer _reserved[GST_PADDING_LARGE];
};
/* methods */
GQuark gst_gl_renderer_error_quark (void);
GType gst_gl_renderer_get_type (void);
GstGLRenderer * gst_gl_renderer_new ();
GstGLRendererAPI gst_gl_renderer_get_renderer_api (GstGLRenderer *renderer);
GST_GL_API_NONE = 0,
GST_GL_API_OPENGL = (1 << 0),
GST_GL_API_OPENGL3 = (1 << 1),
GST_GL_API_GLES = (1 << 15),
GST_GL_API_GLES2 = (1 << 16),
GST_GL_API_GLES3 = (1 << 17),
GST_GL_API_ANY = G_MAXUINT32
} GstGLAPI;
typedef enum
{
GST_GL_PLATFORM_UNKNOWN = 0,
GST_GL_PLATFORM_EGL,
GST_GL_PLATFORM_GLX,
GST_GL_PLATFORM_WGL,
GST_GL_PLATFORM_CGL,
GST_GL_PLATFORM_ANY = 254,
GST_GL_PLATFORM_LAST = 255
} GstGLPlatform;
G_END_DECLS
......
......@@ -56,7 +56,7 @@ gst_gl_window_class_init (GstGLWindowClass * klass)
}
GstGLWindow *
gst_gl_window_new (GstGLRendererAPI render_api, guintptr external_gl_context)
gst_gl_window_new (GstGLAPI api, guintptr external_gl_context)
{
GstGLWindow *window = NULL;
const gchar *user_choice;
......@@ -73,25 +73,20 @@ gst_gl_window_new (GstGLRendererAPI render_api, guintptr external_gl_context)
#ifdef HAVE_WINDOW_X11
if (!window && (!user_choice || g_strstr_len (user_choice, 3, "x11")))
window =
GST_GL_WINDOW (gst_gl_window_x11_new (render_api, external_gl_context));
window = GST_GL_WINDOW (gst_gl_window_x11_new (api, external_gl_context));
#endif
#ifdef HAVE_WINDOW_WIN32
if (!window && (!user_choice || g_strstr_len (user_choice, 5, "win32")))
window =
GST_GL_WINDOW (gst_gl_window_win32_new (render_api,
external_gl_context));
window = GST_GL_WINDOW (gst_gl_window_win32_new (api, external_gl_context));
#endif
#ifdef HAVE_WINDOW_COCOA
if (!window && (!user_choice || g_strstr_len (user_choice, 5, "cocoa")))
window =
GST_GL_WINDOW (gst_gl_window_cocoa_new (render_api,
external_gl_context));
window = GST_GL_WINDOW (gst_gl_window_cocoa_new (api, external_gl_context));
#endif
#ifdef HAVE_WINDOW_WAYLAND
if (!window && (!user_choice || g_strstr_len (user_choice, 7, "wayland")))
window =
GST_GL_WINDOW (gst_gl_window_wayland_egl_new (render_api,
GST_GL_WINDOW (gst_gl_window_wayland_egl_new (api,
external_gl_context));
#endif
if (!window) {
......@@ -286,3 +281,22 @@ gst_gl_window_set_close_callback (GstGLWindow * window, GstGLWindowCB callback,
GST_GL_WINDOW_UNLOCK (window);
}
GstGLAPI
gst_gl_window_get_gl_api (GstGLWindow * window)
{
GstGLAPI ret;
GstGLWindowClass *window_class;
g_return_val_if_fail (GST_GL_IS_WINDOW (window), GST_GL_API_NONE);
window_class = GST_GL_WINDOW_GET_CLASS (window);
g_return_val_if_fail (window_class->get_gl_api != NULL, GST_GL_API_NONE);
GST_GL_WINDOW_LOCK (window);
ret = window_class->get_gl_api (window);
GST_GL_WINDOW_UNLOCK (window);
return ret;
}
......@@ -24,7 +24,7 @@
#include <gst/gst.h>
#include "gstglrenderer.h"
#include "gstglapi.h"
G_BEGIN_DECLS
......@@ -57,18 +57,6 @@ typedef void (*GstGLWindowResizeCB) (gpointer data, guint width, guint height);
#define GST_GL_WINDOW_CB(f) ((GstGLWindowCB) (f))
#define GST_GL_WINDOW_RESIZE_CB(f) ((GstGLWindowResizeCB) (f))
typedef enum
{
GST_GL_PLATFORM_UNKNOWN = 0,
GST_GL_PLATFORM_EGL,
GST_GL_PLATFORM_GLX,
GST_GL_PLATFORM_WGL,
GST_GL_PLATFORM_CGL,
GST_GL_PLATFORM_ANY = 254,
GST_GL_PLATFORM_LAST = 255
} GstGLPlatform;
typedef struct _GstGLWindow GstGLWindow;
typedef struct _GstGLWindowPrivate GstGLWindowPrivate;
typedef struct _GstGLWindowClass GstGLWindowClass;
......@@ -98,15 +86,16 @@ struct _GstGLWindowClass {
/*< private >*/
GObjectClass parent_class;
guintptr (*get_gl_context) (GstGLWindow *window);
gboolean (*activate) (GstGLWindow *window, gboolean activate);
void (*set_window_handle) (GstGLWindow *window, guintptr id);
gboolean (*share_context) (GstGLWindow *window, guintptr external_gl_context);
void (*draw_unlocked) (GstGLWindow *window, guint width, guint height);
void (*draw) (GstGLWindow *window, guint width, guint height);
void (*run) (GstGLWindow *window);
void (*quit) (GstGLWindow *window, GstGLWindowCB callback, gpointer data);
void (*send_message) (GstGLWindow *window, GstGLWindowCB callback, gpointer data);
guintptr (*get_gl_context) (GstGLWindow *window);
GstGLAPI (*get_gl_api) (GstGLWindow *window);
gboolean (*activate) (GstGLWindow *window, gboolean activate);
void (*set_window_handle) (GstGLWindow *window, guintptr id);
gboolean (*share_context) (GstGLWindow *window, guintptr external_gl_context);
void (*draw_unlocked) (GstGLWindow *window, guint width, guint height);
void (*draw) (GstGLWindow *window, guint width, guint height);
void (*run) (GstGLWindow *window);
void (*quit) (GstGLWindow *window, GstGLWindowCB callback, gpointer data);
void (*send_message) (GstGLWindow *window, GstGLWindowCB callback, gpointer data);
/*< private >*/
gpointer _reserved[GST_PADDING];
......@@ -117,7 +106,7 @@ struct _GstGLWindowClass {
GQuark gst_gl_window_error_quark (void);
GType gst_gl_window_get_type (void);
GstGLWindow * gst_gl_window_new (GstGLRendererAPI render_api, guintptr external_gl_context);
GstGLWindow * gst_gl_window_new (GstGLAPI gl_api, guintptr external_gl_context);
void gst_gl_window_set_draw_callback (GstGLWindow *window, GstGLWindowCB callback, gpointer data);
void gst_gl_window_set_resize_callback (GstGLWindow *window, GstGLWindowResizeCB callback, gpointer data);
......@@ -125,7 +114,7 @@ void gst_gl_window_set_close_callback (GstGLWindow *window, GstGLWindowCB
void gst_gl_window_set_need_lock (GstGLWindow *window, gboolean need_lock);
guintptr gst_gl_window_get_gl_context (GstGLWindow *window);
gboolean gst_gl_window_activate (GstGLWindow *window, gboolean activate);
gboolean gst_gl_window_activate (GstGLWindow *window, gboolean activate);
void gst_gl_window_set_window_handle (GstGLWindow *window, guintptr handle);
guintptr gst_gl_window_get_window_handle (GstGLWindow *window);
void gst_gl_window_draw_unlocked (GstGLWindow *window, guint width, guint height);
......@@ -135,6 +124,7 @@ void gst_gl_window_quit (GstGLWindow *window, GstGLWindowCB
void gst_gl_window_send_message (GstGLWindow *window, GstGLWindowCB callback, gpointer data);
GstGLPlatform gst_gl_window_get_platform (GstGLWindow *window);
GstGLAPI gst_gl_window_get_gl_api (GstGLWindow *window);
GST_DEBUG_CATEGORY_EXTERN (gst_gl_window_debug);
......
......@@ -52,7 +52,8 @@ static void gst_gl_window_wayland_egl_send_message (GstGLWindow * window,
static void gst_gl_window_wayland_egl_destroy_context (GstGLWindowWaylandEGL *
window_egl);
static gboolean gst_gl_window_wayland_egl_create_context (GstGLWindowWaylandEGL
* window_egl, GstGLRendererAPI render_api, guintptr external_gl_context);
* window_egl, GstGLAPI gl_api, guintptr external_gl_context);
GstGLAPI gst_gl_window_wayland_egl_get_gl_api (GstGLWindow * window);
static void gst_gl_window_wayland_egl_finalize (GObject * object);
......@@ -271,6 +272,8 @@ gst_gl_window_wayland_egl_class_init (GstGLWindowWaylandEGLClass * klass)
window_class->quit = GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_quit);
window_class->send_message =
GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_send_message);
window_class->get_gl_api =
GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_get_gl_api);
object_class->finalize = gst_gl_window_wayland_egl_finalize;
}
......@@ -282,8 +285,7 @@ gst_gl_window_wayland_egl_init (GstGLWindowWaylandEGL * window)
/* Must be called in the gl thread */
GstGLWindowWaylandEGL *
gst_gl_window_wayland_egl_new (GstGLRendererAPI render_api,
guintptr external_gl_context)
gst_gl_window_wayland_egl_new (GstGLAPI gl_api, guintptr external_gl_context)
{
GstGLWindowWaylandEGL *window;
......@@ -313,7 +315,7 @@ gst_gl_window_wayland_egl_new (GstGLRendererAPI render_api,
g_source_attach (window->wl_source, window->main_context);
gst_gl_window_wayland_egl_create_context (window, render_api,
gst_gl_window_wayland_egl_create_context (window, gl_api,
external_gl_context);
return window;
......@@ -346,7 +348,7 @@ gst_gl_window_wayland_egl_finalize (GObject * object)
static gboolean
gst_gl_window_wayland_egl_create_context (GstGLWindowWaylandEGL * window_egl,
GstGLRendererAPI render_api, guintptr external_gl_context)
GstGLAPI gl_api, guintptr external_gl_context)
{
EGLint config_attrib[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
......@@ -469,6 +471,12 @@ gst_gl_window_wayland_egl_get_gl_context (GstGLWindow * window)
return (guintptr) GST_GL_WINDOW_WAYLAND_EGL (window)->egl_context;
}
GstGLAPI
gst_gl_window_wayland_egl_get_gl_api (GstGLWindow * window)
{
return GST_GL_API_GLES2;
}
static void
gst_gl_window_wayland_egl_swap_buffers (GstGLWindow * window)
{
......
......@@ -25,8 +25,6 @@
#include <wayland-egl.h>
#include <wayland-cursor.h>
#include <EGL/egl.h>
#include "gstglwindow.h"
G_BEGIN_DECLS
......@@ -99,7 +97,7 @@ struct _GstGLWindowWaylandEGLClass {
GType gst_gl_window_wayland_egl_get_type (void);
GstGLWindowWaylandEGL * gst_gl_window_wayland_egl_new (GstGLRendererAPI render_api,
GstGLWindowWaylandEGL * gst_gl_window_wayland_egl_new (GstGLAPI gl_api,
guintptr external_gl_context);
G_END_DECLS
......
......@@ -51,7 +51,7 @@ enum
struct _GstGLWindowWin32Private
{
GstGLRendererAPI render_api;
GstGLAPI gl_api;
guintptr external_gl_context;
gboolean activate;
gboolean activate_result;
......@@ -138,8 +138,7 @@ gst_gl_window_win32_init (GstGLWindowWin32 * window)
/* Must be called in the gl thread */
GstGLWindowWin32 *
gst_gl_window_win32_new (GstGLRendererAPI render_api,
guintptr external_gl_context)
gst_gl_window_win32_new (GstGLAPI gl_api, guintptr external_gl_context)
{
GstGLWindowWin32 *window = NULL;
const gchar *user_choice;
......@@ -149,13 +148,13 @@ gst_gl_window_win32_new (GstGLRendererAPI render_api,
#if HAVE_WGL
if (!window && (!user_choice || g_strstr_len (user_choice, 3, "wgl")))
window =
GST_GL_WINDOW_WIN32 (gst_gl_window_win32_wgl_new (render_api,
GST_GL_WINDOW_WIN32 (gst_gl_window_win32_wgl_new (gl_api,
external_gl_context));
#endif
#if HAVE_EGL
if (!window && (!user_choice || g_strstr_len (user_choice, 3, "egl")))
window =
GST_GL_WINDOW_WIN32 (gst_gl_window_win32_egl_new (render_api,
GST_GL_WINDOW_WIN32 (gst_gl_window_win32_egl_new (gl_api,
external_gl_context));
#endif
if (!window) {
......@@ -164,7 +163,7 @@ gst_gl_window_win32_new (GstGLRendererAPI render_api,
return NULL;
}
window->priv->render_api = render_api;
window->priv->gl_api = gl_api;
window->priv->external_gl_context = external_gl_context;
return window;
......@@ -427,7 +426,7 @@ window_proc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
window_class->choose_format (window_win32);
window_class->create_context (window_win32, priv->render_api,
window_class->create_context (window_win32, priv->gl_api,
priv->external_gl_context);
/* priv->gl_context = wglCreateContext (priv->device);
......
......@@ -74,7 +74,7 @@ struct _GstGLWindowWin32Class {
GType gst_gl_window_win32_get_type (void);
GstGLWindowWin32 * gst_gl_window_win32_new (GstGLRendererAPI render_api,
GstGLWindowWin32 * gst_gl_window_win32_new (GstGLAPI gl_api,
guintptr external_gl_context);
gboolean gst_gl_window_win32_open_device (GstGLWindowWin32 *window_win32);
......
......@@ -36,11 +36,12 @@ static gboolean gst_gl_window_win32_wgl_choose_format (GstGLWindowWin32 *
static gboolean gst_gl_window_win32_wgl_activate (GstGLWindowWin32 *
window_win32, gboolean activate);
static gboolean gst_gl_window_win32_wgl_create_context (GstGLWindowWin32 *
window_win32, GstGLRendererAPI render_api, guintptr external_gl_context);
window_win32, GstGLAPI gl_api, guintptr external_gl_context);
static void gst_gl_window_win32_wgl_destroy_context (GstGLWindowWin32 *
window_win32);
GstGLAPI gst_gl_window_win32_egl_get_gl_api (GstGLWindow * window);
const gchar *EGLErrorString ();
const gchar *WinEGLErrorString ();
#define GST_CAT_DEFAULT gst_gl_window_win32_egl_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
......@@ -54,20 +55,24 @@ G_DEFINE_TYPE_WITH_CODE (GstGLWindowWin32EGL, gst_gl_window_win32_egl,
static void
gst_gl_window_win32_egl_class_init (GstGLWindowWin32EGLClass * klass)
{
GstGLWindowWin32Class *window_class = (GstGLWindowWin32 *) klass;
GstGLWindowClass *window_class = (GstGLWindowClass *) klass;
GstGLWindowWin32Class *window_win32_class = (GstGLWindowWin32 *) klass;
window_win32_class->get_gl_context =
GST_DEBUG_FUNCPTR (gst_gl_window_win32_wgl_get_gl_context);
GST_DEBUG_FUNCPTR (gst_gl_window_win32_egl_get_gl_context);
window_win32_class->choose_format =
GST_DEBUG_FUNCPTR (gst_gl_window_win32_wgl_choose_format);
GST_DEBUG_FUNCPTR (gst_gl_window_win32_egl_choose_format);
window_win32_class->activate =
GST_DEBUG_FUNCPTR (gst_gl_window_win32_wgl_activate);
GST_DEBUG_FUNCPTR (gst_gl_window_win32_egl_activate);
window_win32_class->create_context =
GST_DEBUG_FUNCPTR (gst_gl_window_win32_wgl_create_context);
GST_DEBUG_FUNCPTR (gst_gl_window_win32_egl_create_context);
window_win32_class->destroy_context =
GST_DEBUG_FUNCPTR (gst_gl_window_win32_wgl_destroy_context);
GST_DEBUG_FUNCPTR (gst_gl_window_win32_egl_destroy_context);
window_win32_class->swap_buffers =
GST_DEBUG_FUNCPTR (gst_gl_window_win32_wgl_swap_buffers);
GST_DEBUG_FUNCPTR (gst_gl_window_win32_egl_swap_buffers);
window_class->get_gl_api =
GST_DEBUG_FUNCPTR (gst_gl_window_win32_egl_get_gl_api);
}
static void
......@@ -77,8 +82,7 @@ gst_gl_window_win32_egl_init (GstGLWindow * window)
/* Must be called in the gl thread */
GstGLWindowWin32EGL *
gst_gl_window_win32_egl_new (GstGLRendererAPI render_api,
guintptr external_gl_context)
gst_gl_window_win32_egl_new (GstGLAPI gl_api, guintptr external_gl_context)
{
GstGLWindowWin32EGL *window =
g_object_new (GST_GL_TYPE_WINDOW_WIN32_EGL, NULL);
......@@ -115,7 +119,7 @@ gst_gl_window_win32_egl_activate (GstGLWindowWin32 * window_win32,
static gboolean
gst_gl_window_win32_egl_create_context (GstGLWindowWin32 * window_win32,
GstGLRendererAPI render_api, guintptr external_gl_context)
GstGLAPI gl_api, guintptr external_gl_context)
{
GstGLWindowWin32EGL *window_egl;
EGLint majorVersion;
......@@ -142,7 +146,7 @@ gst_gl_window_win32_egl_create_context (GstGLWindowWin32 * window_win32,
if (priv->display != EGL_NO_DISPLAY)
GST_DEBUG ("display retrieved: %d\n", window_egl->display);
else {
GST_DEBUG ("failed to retrieve display %s\n", EGLErrorString ());
GST_DEBUG ("failed to retrieve display %s\n", WinEGLErrorString ());
goto failure;
}
......@@ -150,7 +154,7 @@ gst_gl_window_win32_egl_create_context (GstGLWindowWin32 * window_win32,
GST_DEBUG ("egl initialized: %d.%d\n", majorVersion, minorVersion);
else {
GST_DEBUG ("failed to initialize egl %d, %s\n", priv->display,
EGLErrorString ());
WinEGLErrorString ());
goto failure;
}
......@@ -158,7 +162,7 @@ gst_gl_window_win32_egl_create_context (GstGLWindowWin32 * window_win32,
GST_DEBUG ("configs retrieved: %d\n", numConfigs);
else {
GST_DEBUG ("failed to retrieve configs %d, %s\n", window_egl->display,
EGLErrorString ());
WinEGLErrorString ());
goto failure;
}
......@@ -166,7 +170,7 @@ gst_gl_window_win32_egl_create_context (GstGLWindowWin32 * window_win32,
GST_DEBUG ("config set: %d, %d\n", config, numConfigs);
else {
GST_DEBUG ("failed to set config %d, %s\n", window_egl->display,
EGLErrorString ());
WinEGLErrorString ());
goto failure;
}
......@@ -177,7 +181,7 @@ gst_gl_window_win32_egl_create_context (GstGLWindowWin32 * window_win32,
GST_DEBUG ("surface created: %d\n", window_egl->surface);
else {
GST_DEBUG ("failed to create surface %d, %d, %s\n", window_egl->display,
window_egl->surface, EGLErrorString ());
window_egl->surface, WinEGLErrorString ());
goto failure;
}
......@@ -191,7 +195,7 @@ gst_gl_window_win32_egl_create_context (GstGLWindowWin32 * window_win32,
GST_DEBUG
("failed to create glcontext %lud, extenal: %lud, %s\n",
(gulong) window_egl->egl_context, (gulong) external_gl_context,
EGLErrorString ());
WinEGLErrorString ());
goto failure;
}
......@@ -211,27 +215,33 @@ gst_gl_window_win32_egl_destroy_context (GstGLWindowWin32 * window_win32)
if (window_egl->egl_context) {
if (!eglDestroyContext (window_egl->display, window_egl->egl_context))
GST_DEBUG ("failed to destroy context %d, %s\n", window_egl->egl_context,
EGLErrorString ());
WinEGLErrorString ());
window_egl->egl_context = NULL;
}
if (window_egl->surface) {
if (!eglDestroySurface (window_egl->display, window_egl->surface))
GST_DEBUG ("failed to destroy surface %d, %s\n", window_egl->surface,
EGLErrorString ());
WinEGLErrorString ());
window_egl->surface = NULL;
}
if (window_egl->display) {
if (!eglTerminate (window_egl->display))
GST_DEBUG ("failed to terminate display %d, %s\n", window_egl->display,
EGLErrorString ());
WinEGLErrorString ());
window_egl->display = NULL;
}
}
GstGLAPI
gst_gl_window_win32_egl_get_gl_api (GstGLWindow * window)
{
return GST_GL_API_GLES2;
}
const gchar *
EGLErrorString ()
WinEGLErrorString ()
{
EGLint nErr = eglGetError ();
switch (nErr) {
......
......@@ -62,7 +62,7 @@ struct _GstGLWindowWin32EGLClass {
GType gst_gl_window_win32_egl_get_type (void);
GstGLWindowWin32EGL * gst_gl_window_win32_egl_new (GstGLRendererAPI render_api,
GstGLWindowWin32EGL * gst_gl_window_win32_egl_new (GstGLAPI gl_api,
guintptr external_gl_context);
G_END_DECLS
......
......@@ -47,13 +47,15 @@ static gboolean gst_gl_window_win32_wgl_choose_format (GstGLWindowWin32 *
static gboolean gst_gl_window_win32_wgl_activate (GstGLWindowWin32 *
window_win32, gboolean activate);
static gboolean gst_gl_window_win32_wgl_create_context (GstGLWindowWin32 *
window_win32, GstGLRendererAPI render_api, guintptr external_gl_context);
window_win32, GstGLAPI gl_api, guintptr external_gl_context);
static void gst_gl_window_win32_wgl_destroy_context (GstGLWindowWin32 *
window_win32);
GstGLAPI gst_gl_window_win32_wgl_get_gl_api (GstGLWindow * window);
static void
gst_gl_window_win32_wgl_class_init (GstGLWindowWin32WGLClass * klass)
{
GstGLWindowClass *window_class;
GstGLWindowWin32Class *window_win32_class = (GstGLWindowWin32Class *) klass;
window_win32_class->get_gl_context =
......@@ -68,6 +70,9 @@ gst_gl_window_win32_wgl_class_init (GstGLWindowWin32WGLClass * klass)
GST_DEBUG_FUNCPTR (gst_gl_window_win32_wgl_destroy_context);
window_win32_class->swap_buffers =
GST_DEBUG_FUNCPTR (gst_gl_window_win32_wgl_swap_buffers);
window_class->get_gl_api =
GST_DEBUG_FUNCPTR (gst_gl_window_win32_wgl_get_gl_api);
}
static void
......@@ -77,8 +82,7 @@ gst_gl_window_win32_wgl_init (GstGLWindowWin32WGL * window)
/* Must be called in the gl thread */
GstGLWindowWin32WGL *
gst_gl_window_win32_wgl_new (GstGLRendererAPI render_api,
guintptr external_gl_context)
gst_gl_window_win32_wgl_new (GstGLAPI gl_api, guintptr external_gl_context)
{
GstGLWindowWin32WGL *window =
g_object_new (GST_GL_TYPE_WINDOW_WIN32_WGL, NULL);
......@@ -90,7 +94,7 @@ gst_gl_window_win32_wgl_new (GstGLRendererAPI render_api,
static gboolean
gst_gl_window_win32_wgl_create_context (GstGLWindowWin32 * window_win32,
GstGLRendererAPI render_api, guintptr external_gl_context)
GstGLAPI gl_api, guintptr external_gl_context)
{
GstGLWindowWin32WGL *window_wgl;
......@@ -198,3 +202,9 @@ gst_gl_window_win32_wgl_activate (GstGLWindowWin32 * window_win32,
return result;
}
GstGLAPI
gst_gl_window_win32_wgl_get_gl_api (GstGLWindow * window)
{
return GST_GL_API_OPENGL;
}
......@@ -59,7 +59,7 @@ struct _GstGLWindowWin32WGLClass {
GType gst_gl_window_win32_wgl_get_type (void);
GstGLWindowWin32WGL * gst_gl_window_win32_wgl_new (GstGLRendererAPI render_api,
GstGLWindowWin32WGL * gst_gl_window_win32_wgl_new (GstGLAPI gl_api,
guintptr external_gl_context);
G_END_DECLS
......
......@@ -213,8 +213,7 @@ gst_gl_window_x11_init (GstGLWindowX11 * window)
/* Must be called in the gl thread */
GstGLWindowX11 *
gst_gl_window_x11_new (GstGLRendererAPI render_api,
guintptr external_gl_context)
gst_gl_window_x11_new (GstGLAPI gl_api, guintptr external_gl_context)
{
GstGLWindowX11 *window = NULL;
const gchar *user_choice;
......@@ -224,41 +223,40 @@ gst_gl_window_x11_new (GstGLRendererAPI render_api,
#ifdef HAVE_GLX
#ifdef HAVE_EGL
/* try GLX first for Desktop OpenGL */
if (render_api == GST_GL_RENDERER_API_OPENGL
|| render_api == GST_GL_RENDERER_API_OPENGL3
|| render_api == GST_GL_RENDERER_API_ANY) {
if (gl_api == GST_GL_API_OPENGL
|| gl_api == GST_GL_API_OPENGL3 || gl_api == GST_GL_API_ANY) {
if (!window && (!user_choice
|| g_strstr_len (user_choice, 3, "glx") != NULL))
window =
GST_GL_WINDOW_X11 (gst_gl_window_x11_glx_new (render_api,
GST_GL_WINDOW_X11 (gst_gl_window_x11_glx_new (gl_api,
external_gl_context));
if (!window && (!user_choice
|| g_strstr_len (user_choice, 3, "egl") != NULL))
window =
GST_GL_WINDOW_X11 (gst_gl_window_x11_egl_new (render_api,
GST_GL_WINDOW_X11 (gst_gl_window_x11_egl_new (gl_api,
external_gl_context));
} else { /* try EGL first for OpenGL|ES */
if (!window && (!user_choice
|| g_strstr_len (user_choice, 3, "egl") != NULL))
window =
GST_GL_WINDOW_X11 (gst_gl_window_x11_egl_new (render_api,
GST_GL_WINDOW_X11 (gst_gl_window_x11_egl_new (gl_api,
external_gl_context));
if (!window && (!user_choice
|| g_strstr_len (user_choice, 3, "glx") != NULL))
window =
GST_GL_WINDOW_X11 (gst_gl_window_x11_glx_new (render_api,
GST_GL_WINDOW_X11 (gst_gl_window_x11_glx_new (gl_api,
external_gl_context));
}
#endif /* HAVE_EGL */
if (!window && (!user_choice || g_strstr_len (user_choice, 3, "glx") != NULL))
window =
GST_GL_WINDOW_X11 (gst_gl_window_x11_glx_new (render_api,
GST_GL_WINDOW_X11 (gst_gl_window_x11_glx_new (gl_api,
external_gl_context));
#endif /* HAVE_GLX */
#ifdef HAVE_EGL
if (!window && (!user_choice || g_strstr_len (user_choice, 3, "egl") != NULL))
window =