[cogl/wip/cogl-gst: 9/9] cogl-gst: Don't advertise the GLSL caps if GLSL not supported



commit ecd747e47ed3f27871e5e0a0211a8f071b084bc2
Author: Neil Roberts <neil linux intel com>
Date:   Tue Feb 26 19:49:34 2013 +0000

    cogl-gst: Don't advertise the GLSL caps if GLSL not supported
    
    The renderers now have a flag to specify whether they need GLSL
    support. If so then they will be missed out when building the caps if
    the context does not support GLSL. Building the caps is now delayed
    until the cogl context is set.

 cogl-gst/cogl-gst-video-sink.c |   72 ++++++++++++++++++++++++++--------------
 1 files changed, 47 insertions(+), 25 deletions(-)
---
diff --git a/cogl-gst/cogl-gst-video-sink.c b/cogl-gst/cogl-gst-video-sink.c
index 47d87c6..5bbd651 100644
--- a/cogl-gst/cogl-gst-video-sink.c
+++ b/cogl-gst/cogl-gst-video-sink.c
@@ -85,6 +85,11 @@ typedef enum
   COGL_GST_I420,
 }CoglGstVideoFormat;
 
+typedef enum
+{
+  COGL_GST_RENDERER_NEEDS_GLSL = (1 << 0)
+} CoglGstRendererFlag;
+
 typedef struct _CoglGstSource
 {
   GSource source;
@@ -170,13 +175,6 @@ cogl_gst_source_push (CoglGstSource *gst_source,
   g_main_context_wakeup (priv->g_ctx);
 }
 
-
-void
-cogl_gst_video_sink_set_context (CoglGstVideoSink *vt, CoglContext *ctx)
-{
-  vt->priv->ctx = ctx;
-}
-
 void
 cogl_gst_set_shader_hook (CoglGstVideoSink *sink, CoglSnippetHook hook)
 {
@@ -497,7 +495,7 @@ static CoglGstRenderer yv12_glsl_renderer =
 {
   "YV12 glsl",
   COGL_GST_YV12,
-  0,
+  COGL_GST_RENDERER_NEEDS_GLSL,
   GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("YV12")),
   cogl_gst_yv12_glsl_init,
   cogl_gst_dummy_deinit,
@@ -516,7 +514,7 @@ static CoglGstRenderer i420_glsl_renderer =
 {
   "I420 glsl",
   COGL_GST_I420,
-  0,
+  COGL_GST_RENDERER_NEEDS_GLSL,
   GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")),
   cogl_gst_i420_glsl_init,
   cogl_gst_dummy_deinit,
@@ -551,7 +549,7 @@ static CoglGstRenderer ayuv_glsl_renderer =
 {
   "AYUV glsl",
   COGL_GST_AYUV,
-  0,
+  COGL_GST_RENDERER_NEEDS_GLSL,
   GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV")),
   cogl_gst_ayuv_glsl_init,
   cogl_gst_dummy_deinit,
@@ -559,23 +557,25 @@ static CoglGstRenderer ayuv_glsl_renderer =
 };
 
 static GSList*
-cogl_gst_build_renderers_list (void)
+cogl_gst_build_renderers_list (CoglContext *ctx)
 {
   GSList *list = NULL;
+  CoglBool has_glsl;
   int i;
-
-  CoglGstRenderer *renderers[] =
+  static CoglGstRenderer * const renderers[] =
   {
     &rgb24_renderer,
     &rgb32_renderer,
     &yv12_glsl_renderer,
     &i420_glsl_renderer,
-    &ayuv_glsl_renderer,
-    NULL
+    &ayuv_glsl_renderer
   };
 
-  for (i = 0; i < 5; i++)
-    list = g_slist_prepend (list, renderers[i]);
+  has_glsl = cogl_has_feature (ctx, COGL_FEATURE_ID_GLSL);
+
+  for (i = 0; i < G_N_ELEMENTS (renderers); i++)
+    if (has_glsl || !(renderers[i]->flags & COGL_GST_RENDERER_NEEDS_GLSL))
+      list = g_slist_prepend (list, renderers[i]);
 
   return list;
 }
@@ -605,6 +605,34 @@ cogl_gst_build_caps (GSList *renderers)
   return caps;
 }
 
+void
+cogl_gst_video_sink_set_context (CoglGstVideoSink *vt, CoglContext *ctx)
+{
+  CoglGstVideoSinkPrivate *priv = vt->priv;
+
+  if (ctx)
+    ctx = cogl_object_ref (ctx);
+
+  if (priv->ctx)
+    {
+      cogl_object_unref (priv->ctx);
+      g_slist_free (priv->renderers);
+      priv->renderers = NULL;
+      if (priv->caps)
+        {
+          gst_caps_unref (priv->caps);
+          priv->caps = NULL;
+        }
+    }
+
+  if (ctx)
+    {
+      priv->ctx = ctx;
+      priv->renderers = cogl_gst_build_renderers_list (priv->ctx);
+      priv->caps = cogl_gst_build_caps (priv->renderers);
+    }
+}
+
 static CoglGstRenderer*
 cogl_gst_find_renderer_by_format (CoglGstVideoSink *sink,
                                   CoglGstVideoFormat format)
@@ -650,8 +678,6 @@ cogl_gst_video_sink_init (CoglGstVideoSink *sink,
   sink->priv->loop = g_main_loop_new (NULL, TRUE);
   sink->priv->g_ctx = g_main_loop_get_context (sink->priv->loop);
 
-  priv->renderers = cogl_gst_build_renderers_list ();
-  priv->caps = cogl_gst_build_caps (priv->renderers);
   priv->renderer_state = COGL_GST_RENDERER_STOPPED;
   priv->hook = COGL_SNIPPET_HOOK_FRAGMENT;
 }
@@ -798,13 +824,9 @@ cogl_gst_video_sink_dispose (GObject *object)
 static void
 cogl_gst_video_sink_finalize (GObject *object)
 {
-  CoglGstVideoSink *self;
-  CoglGstVideoSinkPrivate *priv;
-
-  self = COGL_GST_VIDEO_SINK (object);
-  priv = self->priv;
+  CoglGstVideoSink *self = COGL_GST_VIDEO_SINK (object);
 
-  g_slist_free (priv->renderers);
+  cogl_gst_video_sink_set_context (self, NULL);
 
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]