gstglshadervariables.c \
gstgldownload.c \
gstglupload.c \
- gstglwindow.c
+ gstglwindow.c \
+ gstglapi.c
libgstgl_@GST_API_VERSION@_la_LIBADD = \
$(GST_PLUGINS_BASE_LIBS) \
--- /dev/null
+/*
+ * GStreamer
+ * Copyright (C) 2012 Matthew Waters <ystreet00@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "gstglapi.h"
+
+#define GST_GL_EXT_BEGIN(name, min_gl, maj_gl, in_gles, ext_suf, ext_name)
+#define GST_GL_EXT_FUNCTION(ret, name, args) \
+ NULL,
+#define GST_GL_EXT_END()
+
+#if HAVE_OPENGL
+static GstGLFuncs gst_gl = {
+#include "glprototypes/opengl.h"
+ {NULL,},
+#include "glprototypes/gles1opengl.h"
+ {NULL,},
+#include "glprototypes/gles2opengl.h"
+ {NULL,},
+#include "glprototypes/gles1gles2opengl.h"
+ {NULL,},
+};
+
+const GstGLFuncs *
+gst_gl_get_opengl_vtable (void)
+{
+ return &gst_gl;
+}
+#endif
+
+#if HAVE_GLES2
+static GstGLES2Funcs gst_gles2 = {
+#include "glprototypes/gles1gles2.h"
+ {NULL,},
+#include "glprototypes/gles1gles2opengl.h"
+ {NULL,},
+#include "glprototypes/gles2.h"
+ {NULL,},
+#include "glprototypes/gles2opengl.h"
+ {NULL,},
+};
+
+const GstGLES2Funcs *
+gst_gl_get_gles2_vtable (void)
+{
+ return &gst_gles2;
+}
+#endif
+
+#undef GST_GL_EXT_BEGIN
+#undef GST_GL_EXT_FUNCTION
+#undef GST_GL_EXT_END
+
+gchar *
+gst_gl_api_string (GstGLAPI api)
+{
+ GString *str = NULL;
+
+ if (api == GST_GL_API_NONE) {
+ str = g_string_new ("none");
+ return str->str;
+ } else if (api == GST_GL_API_ANY) {
+ str = g_string_new ("any");
+ return str->str;
+ }
+
+ if (api & GST_GL_API_OPENGL) {
+ str = g_string_new ("opengl");
+ }
+ if (api & GST_GL_API_OPENGL3) {
+ if (str) {
+ g_string_append (str, " opengl3");
+ } else {
+ str = g_string_new ("opengl3");
+ }
+ }
+ if (api & GST_GL_API_GLES) {
+ if (str) {
+ g_string_append (str, " gles1");
+ } else {
+ str = g_string_new ("gles1");
+ }
+ }
+ if (api & GST_GL_API_GLES2) {
+ if (str) {
+ g_string_append (str, " gles2");
+ } else {
+ str = g_string_new ("gles2");
+ }
+ }
+ if (api & GST_GL_API_GLES3) {
+ if (str) {
+ g_string_append (str, " gles3");
+ } else {
+ str = g_string_new ("gles3");
+ }
+ }
+
+ return str->str;
+}
#undef GST_GL_EXT_FUNCTION
#undef GST_GL_EXT_END
+gchar * gst_gl_api_string (GstGLAPI api);
+
G_END_DECLS
#endif /* __GST_GL_API_H__ */
}
#endif
+GstGLAPI
+_compiled_api (void)
+{
+ GstGLAPI ret = GST_GL_API_NONE;
+
+#if HAVE_OPENGL
+ ret |= GST_GL_API_OPENGL;
+#endif
+#if HAVE_GLES2
+ ret |= GST_GL_API_GLES2;
+#endif
+
+ return ret;
+}
+
gpointer
gst_gl_display_thread_create_context (GstGLDisplay * display)
{
gint gl_major = 0, gl_minor = 0;
gboolean ret = FALSE;
+ GError *error = NULL;
+ GstGLAPI compiled_api;
+ gchar *api_string;
+ gchar *compiled_api_s;
gst_gl_display_lock (display);
+
+ compiled_api = _compiled_api ();
+
display->gl_window =
- gst_gl_window_new (GST_GL_API_ANY, display->external_gl_context);
+ gst_gl_window_new (compiled_api, display->external_gl_context, &error);
- if (!display->gl_window) {
- gst_gl_display_set_error (display, "Failed to create gl window");
+ if (!display->gl_window || error) {
+ gst_gl_display_set_error (display, error ? error->message : "Failed to create gl window");
g_cond_signal (display->cond_create_context);
gst_gl_display_unlock (display);
return NULL;
GST_INFO ("gl window created");
display->gl_api = gst_gl_window_get_gl_api (display->gl_window);
-
g_assert (display->gl_api != GST_GL_API_NONE && display->gl_api != GST_GL_API_ANY);
+ api_string = gst_gl_api_string (display->gl_api);
+ GST_INFO ("available GL APIs: %s", api_string);
+
+ compiled_api_s = gst_gl_api_string (compiled_api);
+ GST_INFO ("compiled api support: %s", compiled_api_s);
+
+ if ((compiled_api & display->gl_api) == GST_GL_API_NONE)
+ gst_gl_display_set_error (display, "failed to create_context, window "
+ "could not provide correct api. compiled api supports:%s, window "
+ "supports:%s", compiled_api_s, api_string);
+
+ g_free (api_string);
+ g_free (compiled_api_s);
+
/* gl api specific code */
#if HAVE_OPENGL
if (!ret && USING_OPENGL(display))
#endif
#if HAVE_GLES2
if (!ret && USING_GLES2(display))
- ret = _create_context_gles2 (display, &gl_major, &gl_minor);
+ ret = _create_context_gles2 (display, &gl_major, &gl_minor);
#endif
if (!ret || !gl_major)
- gst_gl_display_set_error (display, "failed to create context");
+ gst_gl_display_set_error (display, "failed to create context, unknown reason");
/* setup callbacks */
gst_gl_window_set_resize_callback (display->gl_window,
#undef GST_GL_EXT_FUNCTION
#undef GST_GL_EXT_END
-#define GST_GL_EXT_BEGIN(name, min_gl_major, min_gl_minor, gles_availability, \
- namespaces, extension_names)
-#define GST_GL_EXT_FUNCTION(ret, name, args) \
- NULL,
-#define GST_GL_EXT_END()
-
-#if HAVE_OPENGL
-static GstGLFuncs gst_gl = {
-#include "glprototypes/opengl.h"
- {NULL,},
-#include "glprototypes/gles1opengl.h"
- {NULL,},
-#include "glprototypes/gles2opengl.h"
- {NULL,},
-#include "glprototypes/gles1gles2opengl.h"
- {NULL,},
-};
-
-const GstGLFuncs *
-gst_gl_get_opengl_vtable (void)
-{
- return &gst_gl;
-}
-#endif
-
-#if HAVE_GLES2
-static GstGLES2Funcs gst_gles2 = {
-#include "glprototypes/gles1gles2.h"
- {NULL,},
-#include "glprototypes/gles1gles2opengl.h"
- {NULL,},
-#include "glprototypes/gles2.h"
- {NULL,},
-#include "glprototypes/gles2opengl.h"
- {NULL,},
-};
-
-const GstGLES2Funcs *
-gst_gl_get_gles2_vtable (void)
-{
- return &gst_gles2;
-}
-#endif
-
gboolean
_gst_gl_feature_check (GstGLDisplay * display,
const char *driver_prefix,
without needing an extension. Set to 255,255 if it's only
provided in an extension */
int min_gl_major, min_gl_minor;
- /* Flags specifying which versions of GLES the feature is available
+ /* Flags specifying which versions of GL the feature is available
in core in */
GstGLApi gl_availability;
/* \0 separated list of namespaces to try. Eg "EXT\0ARB\0" */