Blame gst-libs/gst/gl/gstglslstage.c

Packit 971217
/*
Packit 971217
 * GStreamer
Packit 971217
 * Copyright (C) 2015 Matthew Waters <matthew@centricular.com>
Packit 971217
 *
Packit 971217
 * This library is free software; you can redistribute it and/or
Packit 971217
 * modify it under the terms of the GNU Library General Public
Packit 971217
 * License as published by the Free Software Foundation; either
Packit 971217
 * version 2 of the License, or (at your option) any later version.
Packit 971217
 *
Packit 971217
 * This library is distributed in the hope that it will be useful,
Packit 971217
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 971217
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 971217
 * Library General Public License for more details.
Packit 971217
 *
Packit 971217
 * You should have received a copy of the GNU Library General Public
Packit 971217
 * License along with this library; if not, write to the
Packit 971217
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
Packit 971217
 * Boston, MA 02110-1301, USA.
Packit 971217
 */
Packit 971217
Packit 971217
#ifdef HAVE_CONFIG_H
Packit 971217
#include "config.h"
Packit 971217
#endif
Packit 971217
Packit 971217
#include "gstglslstage.h"
Packit 971217
Packit 971217
#include "gl.h"
Packit 971217
#include "gstglfuncs.h"
Packit 971217
#include "gstglsl_private.h"
Packit 971217
Packit 971217
#ifndef GL_GEOMETRY_SHADER
Packit 971217
#define GL_GEOMETRY_SHADER        0x8DD9
Packit 971217
#endif
Packit 971217
#ifndef GL_COMPUTE_SHADER
Packit 971217
#define GL_COMPUTE_SHADER         0x91B9
Packit 971217
#endif
Packit 971217
#ifndef GL_TESS_CONTROL_SHADER
Packit 971217
#define GL_TESS_CONTROL_SHADER    0x8E88
Packit 971217
#endif
Packit 971217
#ifndef GL_TESS_EVALUATION_SHADER
Packit 971217
#define GL_TESS_EVALUATION_SHADER 0x8E87
Packit 971217
#endif
Packit 971217
Packit 971217
/**
Packit 971217
 * SECTION:gstglslstage
Packit 971217
 * @short_description: object for dealing with OpenGL shader stages
Packit 971217
 * @title: GstGLSLStage
Packit 971217
 * @see_also: #GstGLShader
Packit 971217
 *
Packit 971217
 * #GstGLSLStage holds and represents a single OpenGL shader stage.
Packit 971217
 */
Packit 971217
Packit 971217
static const gchar *es2_version_header = "#version 100\n";
Packit 971217
Packit 971217
GST_DEBUG_CATEGORY_STATIC (gst_glsl_stage_debug);
Packit 971217
#define GST_CAT_DEFAULT gst_glsl_stage_debug
Packit 971217
Packit 971217
G_DEFINE_TYPE_WITH_CODE (GstGLSLStage, gst_glsl_stage, GST_TYPE_OBJECT,
Packit 971217
    GST_DEBUG_CATEGORY_INIT (gst_glsl_stage_debug, "glslstage", 0,
Packit 971217
        "GLSL Stage");
Packit 971217
    );
Packit 971217
Packit 971217
#define GST_GLSL_STAGE_GET_PRIVATE(o) \
Packit 971217
  (G_TYPE_INSTANCE_GET_PRIVATE((o), GST_TYPE_GLSL_STAGE, GstGLSLStagePrivate))
Packit 971217
Packit 971217
struct _GstGLSLStagePrivate
Packit 971217
{
Packit 971217
  GstGLSLFuncs vtable;
Packit 971217
Packit 971217
  GLenum type;
Packit 971217
  GLhandleARB handle;
Packit 971217
  GstGLSLVersion version;
Packit 971217
  GstGLSLProfile profile;
Packit 971217
  gchar **strings;
Packit 971217
  gint n_strings;
Packit 971217
Packit 971217
  gboolean compiled;
Packit 971217
};
Packit 971217
Packit 971217
static void
Packit 971217
gst_glsl_stage_finalize (GObject * object)
Packit 971217
{
Packit 971217
  GstGLSLStage *stage = GST_GLSL_STAGE (object);
Packit 971217
  gint i;
Packit 971217
Packit 971217
  if (stage->context) {
Packit 971217
    gst_object_unref (stage->context);
Packit 971217
    stage->context = NULL;
Packit 971217
  }
Packit 971217
Packit 971217
  for (i = 0; i < stage->priv->n_strings; i++) {
Packit 971217
    g_free (stage->priv->strings[i]);
Packit 971217
  }
Packit 971217
  g_free (stage->priv->strings);
Packit 971217
  stage->priv->strings = NULL;
Packit 971217
Packit 971217
  G_OBJECT_CLASS (gst_glsl_stage_parent_class)->finalize (object);
Packit 971217
}
Packit 971217
Packit 971217
static void
Packit 971217
gst_glsl_stage_set_property (GObject * object,
Packit 971217
    guint prop_id, const GValue * value, GParamSpec * pspec)
Packit 971217
{
Packit 971217
  switch (prop_id) {
Packit 971217
    default:
Packit 971217
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit 971217
      break;
Packit 971217
  }
Packit 971217
}
Packit 971217
Packit 971217
static void
Packit 971217
gst_glsl_stage_get_property (GObject * object,
Packit 971217
    guint prop_id, GValue * value, GParamSpec * pspec)
Packit 971217
{
Packit 971217
  switch (prop_id) {
Packit 971217
    default:
Packit 971217
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit 971217
      break;
Packit 971217
  }
Packit 971217
Packit 971217
}
Packit 971217
Packit 971217
static void
Packit 971217
gst_glsl_stage_class_init (GstGLSLStageClass * klass)
Packit 971217
{
Packit 971217
  GObjectClass *obj_class = G_OBJECT_CLASS (klass);
Packit 971217
Packit 971217
  g_type_class_add_private (klass, sizeof (GstGLSLStagePrivate));
Packit 971217
Packit 971217
  obj_class->finalize = gst_glsl_stage_finalize;
Packit 971217
  obj_class->set_property = gst_glsl_stage_set_property;
Packit 971217
  obj_class->get_property = gst_glsl_stage_get_property;
Packit 971217
}
Packit 971217
Packit 971217
static void
Packit 971217
gst_glsl_stage_init (GstGLSLStage * stage)
Packit 971217
{
Packit 971217
  stage->priv = GST_GLSL_STAGE_GET_PRIVATE (stage);
Packit 971217
}
Packit 971217
Packit 971217
static gboolean
Packit 971217
_is_valid_shader_type (GLenum type)
Packit 971217
{
Packit 971217
  switch (type) {
Packit 971217
    case GL_VERTEX_SHADER:
Packit 971217
    case GL_FRAGMENT_SHADER:
Packit 971217
    case GL_TESS_CONTROL_SHADER:
Packit 971217
    case GL_TESS_EVALUATION_SHADER:
Packit 971217
    case GL_GEOMETRY_SHADER:
Packit 971217
    case GL_COMPUTE_SHADER:
Packit 971217
      return TRUE;
Packit 971217
    default:
Packit 971217
      return FALSE;
Packit 971217
  }
Packit 971217
}
Packit 971217
Packit 971217
static const gchar *
Packit 971217
_shader_type_to_string (GLenum type)
Packit 971217
{
Packit 971217
  switch (type) {
Packit 971217
    case GL_VERTEX_SHADER:
Packit 971217
      return "vertex";
Packit 971217
    case GL_FRAGMENT_SHADER:
Packit 971217
      return "fragment";
Packit 971217
    case GL_TESS_CONTROL_SHADER:
Packit 971217
      return "tesselation control";
Packit 971217
    case GL_TESS_EVALUATION_SHADER:
Packit 971217
      return "tesselation evaluation";
Packit 971217
    case GL_GEOMETRY_SHADER:
Packit 971217
      return "geometry";
Packit 971217
    case GL_COMPUTE_SHADER:
Packit 971217
      return "compute";
Packit 971217
    default:
Packit 971217
      return "unknown";
Packit 971217
  }
Packit 971217
}
Packit 971217
Packit 971217
static gboolean
Packit 971217
_ensure_shader (GstGLSLStage * stage)
Packit 971217
{
Packit 971217
  if (stage->priv->handle)
Packit 971217
    return TRUE;
Packit 971217
Packit 971217
  if (!(stage->priv->handle =
Packit 971217
          stage->priv->vtable.CreateShader (stage->priv->type)))
Packit 971217
    return FALSE;
Packit 971217
Packit 971217
  return stage->priv->handle != 0;
Packit 971217
}
Packit 971217
Packit 971217
/**
Packit 971217
 * gst_glsl_stage_new_with_strings:
Packit 971217
 * @context: a #GstGLContext
Packit 971217
 * @type: the GL enum shader stage type
Packit 971217
 * @version: the #GstGLSLVersion
Packit 971217
 * @profile: the #GstGLSLProfile
Packit 971217
 * @n_strings: the number of strings in @str
Packit 971217
 * @str: (array length=n_strings):
Packit 971217
 *     an array of strings concatted together to produce a shader
Packit 971217
 *
Packit 971217
 * Returns: (transfer floating): a new #GstGLSLStage of the specified @type
Packit 971217
 *
Packit 971217
 * Since: 1.8
Packit 971217
 */
Packit 971217
GstGLSLStage *
Packit 971217
gst_glsl_stage_new_with_strings (GstGLContext * context, guint type,
Packit 971217
    GstGLSLVersion version, GstGLSLProfile profile, gint n_strings,
Packit 971217
    const gchar ** str)
Packit 971217
{
Packit 971217
  GstGLSLStage *stage;
Packit 971217
Packit 971217
  g_return_val_if_fail (GST_IS_GL_CONTEXT (context), NULL);
Packit 971217
  g_return_val_if_fail (_is_valid_shader_type (type), NULL);
Packit 971217
Packit 971217
  stage = g_object_new (GST_TYPE_GLSL_STAGE, NULL);
Packit 971217
  /* FIXME: GInittable */
Packit 971217
  if (!_gst_glsl_funcs_fill (&stage->priv->vtable, context)) {
Packit 971217
    gst_object_unref (stage);
Packit 971217
    return NULL;
Packit 971217
  }
Packit 971217
Packit 971217
  stage->context = gst_object_ref (context);
Packit 971217
  stage->priv->type = type;
Packit 971217
  if (!gst_glsl_stage_set_strings (stage, version, profile, n_strings, str)) {
Packit 971217
    gst_object_unref (stage);
Packit 971217
    return NULL;
Packit 971217
  }
Packit 971217
Packit 971217
  return stage;
Packit 971217
}
Packit 971217
Packit 971217
/**
Packit 971217
 * gst_glsl_stage_new_with_string:
Packit 971217
 * @context: a #GstGLContext
Packit 971217
 * @type: the GL enum shader stage type
Packit 971217
 * @version: the #GstGLSLVersion
Packit 971217
 * @profile: the #GstGLSLProfile
Packit 971217
 * @str: a shader string
Packit 971217
 *
Packit 971217
 * Returns: (transfer floating): a new #GstGLSLStage of the specified @type
Packit 971217
 *
Packit 971217
 * Since: 1.8
Packit 971217
 */
Packit 971217
GstGLSLStage *
Packit 971217
gst_glsl_stage_new_with_string (GstGLContext * context, guint type,
Packit 971217
    GstGLSLVersion version, GstGLSLProfile profile, const gchar * str)
Packit 971217
{
Packit 971217
  return gst_glsl_stage_new_with_strings (context, type, version, profile, 1,
Packit 971217
      &str);
Packit 971217
}
Packit 971217
Packit 971217
/**
Packit 971217
 * gst_glsl_stage_new:
Packit 971217
 * @context: a #GstGLContext
Packit 971217
 * @type: the GL enum shader stage type
Packit 971217
 *
Packit 971217
 * Returns: (transfer floating): a new #GstGLSLStage of the specified @type
Packit 971217
 *
Packit 971217
 * Since: 1.8
Packit 971217
 */
Packit 971217
GstGLSLStage *
Packit 971217
gst_glsl_stage_new (GstGLContext * context, guint type)
Packit 971217
{
Packit 971217
  return gst_glsl_stage_new_with_string (context, type, GST_GLSL_VERSION_NONE,
Packit 971217
      GST_GLSL_PROFILE_NONE, NULL);
Packit 971217
}
Packit 971217
Packit 971217
/**
Packit 971217
 * gst_glsl_stage_new_with_default_vertex:
Packit 971217
 * @context: a #GstGLContext
Packit 971217
 *
Packit 971217
 * Returns: (transfer floating): a new #GstGLSLStage with the default vertex shader
Packit 971217
 *
Packit 971217
 * Since: 1.8
Packit 971217
 */
Packit 971217
GstGLSLStage *
Packit 971217
gst_glsl_stage_new_default_vertex (GstGLContext * context)
Packit 971217
{
Packit 971217
  return gst_glsl_stage_new_with_string (context, GL_VERTEX_SHADER,
Packit 971217
      GST_GLSL_VERSION_NONE,
Packit 971217
      GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
Packit 971217
      gst_gl_shader_string_vertex_default);
Packit 971217
}
Packit 971217
Packit 971217
/**
Packit 971217
 * gst_glsl_stage_new_with_default_fragment:
Packit 971217
 * @context: a #GstGLContext
Packit 971217
 *
Packit 971217
 * Returns: (transfer floating): a new #GstGLSLStage with the default fragment shader
Packit 971217
 *
Packit 971217
 * Since: 1.8
Packit 971217
 */
Packit 971217
GstGLSLStage *
Packit 971217
gst_glsl_stage_new_default_fragment (GstGLContext * context)
Packit 971217
{
Packit 971217
  return gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
Packit 971217
      GST_GLSL_VERSION_NONE,
Packit 971217
      GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
Packit 971217
      gst_gl_shader_string_fragment_default);
Packit 971217
}
Packit 971217
Packit 971217
/**
Packit 971217
 * gst_glsl_stage_set_strings:
Packit 971217
 * @stage: a #GstGLSLStage
Packit 971217
 * @version: a #GstGLSLVersion
Packit 971217
 * @profile: a #GstGLSLProfile
Packit 971217
 * @n_strings: number of strings in @str
Packit 971217
 * @str: (array length=n_strings) (transfer none): a GLSL shader string
Packit 971217
 *
Packit 971217
 * Replaces the current shader string with @str.
Packit 971217
 *
Packit 971217
 * Since: 1.8
Packit 971217
 */
Packit 971217
gboolean
Packit 971217
gst_glsl_stage_set_strings (GstGLSLStage * stage, GstGLSLVersion version,
Packit 971217
    GstGLSLProfile profile, gint n_strings, const gchar ** str)
Packit 971217
{
Packit 971217
  gint i;
Packit 971217
Packit 971217
  g_return_val_if_fail (GST_IS_GLSL_STAGE (stage), FALSE);
Packit 971217
  g_return_val_if_fail (n_strings > 0, FALSE);
Packit 971217
  g_return_val_if_fail (str != NULL, FALSE);
Packit 971217
Packit 971217
  if (!gst_gl_context_supports_glsl_profile_version (stage->context, version,
Packit 971217
          profile)) {
Packit 971217
    const gchar *version_str = gst_glsl_version_to_string (version);
Packit 971217
    const gchar *profile_str = gst_glsl_profile_to_string (profile);
Packit 971217
    GST_ERROR_OBJECT (stage, "GL context does not support version %s and "
Packit 971217
        "profile %s", version_str, profile_str);
Packit 971217
    return FALSE;
Packit 971217
  }
Packit 971217
Packit 971217
  stage->priv->version = version;
Packit 971217
  stage->priv->profile = profile;
Packit 971217
Packit 971217
  for (i = 0; i < stage->priv->n_strings; i++) {
Packit 971217
    g_free (stage->priv->strings[i]);
Packit 971217
  }
Packit 971217
Packit 971217
  if (stage->priv->n_strings < n_strings) {
Packit 971217
    /* only realloc if we need more space */
Packit 971217
    g_free (stage->priv->strings);
Packit 971217
    stage->priv->strings = g_new0 (gchar *, n_strings);
Packit 971217
  }
Packit 971217
Packit 971217
  for (i = 0; i < n_strings; i++)
Packit 971217
    stage->priv->strings[i] = g_strdup (str[i]);
Packit 971217
  stage->priv->n_strings = n_strings;
Packit 971217
Packit 971217
  return TRUE;
Packit 971217
}
Packit 971217
Packit 971217
/**
Packit 971217
 * gst_glsl_stage_get_shader_type:
Packit 971217
 * @stage: a #GstGLSLStage
Packit 971217
 *
Packit 971217
 * Returns: The GL shader type for this shader stage
Packit 971217
 *
Packit 971217
 * Since: 1.8
Packit 971217
 */
Packit 971217
guint
Packit 971217
gst_glsl_stage_get_shader_type (GstGLSLStage * stage)
Packit 971217
{
Packit 971217
  g_return_val_if_fail (GST_IS_GLSL_STAGE (stage), 0);
Packit 971217
Packit 971217
  return stage->priv->type;
Packit 971217
}
Packit 971217
Packit 971217
/**
Packit 971217
 * gst_glsl_stage_get_handle:
Packit 971217
 * @stage: a #GstGLSLStage
Packit 971217
 *
Packit 971217
 * Returns: The GL handle for this shader stage
Packit 971217
 *
Packit 971217
 * Since: 1.8
Packit 971217
 */
Packit 971217
guint
Packit 971217
gst_glsl_stage_get_handle (GstGLSLStage * stage)
Packit 971217
{
Packit 971217
  g_return_val_if_fail (GST_IS_GLSL_STAGE (stage), 0);
Packit 971217
  g_return_val_if_fail (stage->priv->compiled, 0);
Packit 971217
Packit 971217
  return stage->priv->handle;
Packit 971217
}
Packit 971217
Packit 971217
/**
Packit 971217
 * gst_glsl_stage_get_version:
Packit 971217
 * @stage: a #GstGLSLStage
Packit 971217
 *
Packit 971217
 * Returns: The GLSL version for the current shader stage
Packit 971217
 *
Packit 971217
 * Since: 1.8
Packit 971217
 */
Packit 971217
GstGLSLVersion
Packit 971217
gst_glsl_stage_get_version (GstGLSLStage * stage)
Packit 971217
{
Packit 971217
  g_return_val_if_fail (GST_IS_GLSL_STAGE (stage), 0);
Packit 971217
Packit 971217
  return stage->priv->version;
Packit 971217
}
Packit 971217
Packit 971217
/**
Packit 971217
 * gst_glsl_stage_get_profile:
Packit 971217
 * @stage: a #GstGLSLStage
Packit 971217
 *
Packit 971217
 * Returns: The GLSL profile for the current shader stage
Packit 971217
 *
Packit 971217
 * Since: 1.8
Packit 971217
 */
Packit 971217
GstGLSLProfile
Packit 971217
gst_glsl_stage_get_profile (GstGLSLStage * stage)
Packit 971217
{
Packit 971217
  g_return_val_if_fail (GST_IS_GLSL_STAGE (stage), 0);
Packit 971217
Packit 971217
  return stage->priv->profile;
Packit 971217
}
Packit 971217
Packit 971217
static void
Packit 971217
_maybe_prepend_version (GstGLSLStage * stage, gchar ** shader_str,
Packit 971217
    gint * n_vertex_sources, const gchar *** vertex_sources)
Packit 971217
{
Packit 971217
  gint n = *n_vertex_sources;
Packit 971217
  gboolean add_header = FALSE;
Packit 971217
  gint i, j;
Packit 971217
Packit 971217
  /* FIXME: this all an educated guess */
Packit 971217
  if (gst_gl_context_check_gl_version (stage->context, GST_GL_API_OPENGL3, 3, 0)
Packit 971217
      && (stage->priv->profile & GST_GLSL_PROFILE_ES) != 0
Packit 971217
      && !_gst_glsl_shader_string_find_version (shader_str[0])) {
Packit 971217
    add_header = TRUE;
Packit 971217
    n++;
Packit 971217
  }
Packit 971217
Packit 971217
  *vertex_sources = g_malloc0 (n * sizeof (gchar *));
Packit 971217
Packit 971217
  i = 0;
Packit 971217
  if (add_header)
Packit 971217
    (*vertex_sources)[i++] = es2_version_header;
Packit 971217
Packit 971217
  for (j = 0; j < stage->priv->n_strings; i++, j++)
Packit 971217
    (*vertex_sources)[i] = shader_str[j];
Packit 971217
  *n_vertex_sources = n;
Packit 971217
}
Packit 971217
Packit 971217
struct compile
Packit 971217
{
Packit 971217
  GstGLSLStage *stage;
Packit 971217
  GError **error;
Packit 971217
  gboolean result;
Packit 971217
};
Packit 971217
Packit 971217
static void
Packit 971217
_compile_shader (GstGLContext * context, struct compile *data)
Packit 971217
{
Packit 971217
  GstGLSLStagePrivate *priv = data->stage->priv;
Packit 971217
  GstGLSLFuncs *vtable = &data->stage->priv->vtable;
Packit 971217
  const GstGLFuncs *gl = context->gl_vtable;
Packit 971217
  const gchar **vertex_sources;
Packit 971217
  gchar info_buffer[2048];
Packit 971217
  gint n_vertex_sources;
Packit 971217
  GLint status;
Packit 971217
  gint len;
Packit 971217
  gint i;
Packit 971217
Packit 971217
  if (data->stage->priv->compiled) {
Packit 971217
    data->result = TRUE;
Packit 971217
    return;
Packit 971217
  }
Packit 971217
Packit 971217
  if (!_ensure_shader (data->stage)) {
Packit 971217
    g_set_error (data->error, GST_GLSL_ERROR, GST_GLSL_ERROR_COMPILE,
Packit 971217
        "Failed to create shader object");
Packit 971217
    data->result = FALSE;
Packit 971217
    return;
Packit 971217
  }
Packit 971217
Packit 971217
  n_vertex_sources = data->stage->priv->n_strings;
Packit 971217
  _maybe_prepend_version (data->stage, priv->strings, &n_vertex_sources,
Packit 971217
      &vertex_sources);
Packit 971217
Packit 971217
  GST_TRACE_OBJECT (data->stage, "compiling shader:");
Packit 971217
  for (i = 0; i < n_vertex_sources; i++) {
Packit 971217
    GST_TRACE_OBJECT (data->stage, "%s", vertex_sources[i]);
Packit 971217
  }
Packit 971217
Packit 971217
  gl->ShaderSource (priv->handle, n_vertex_sources,
Packit 971217
      (const gchar **) vertex_sources, NULL);
Packit 971217
  gl->CompileShader (priv->handle);
Packit 971217
  g_free (vertex_sources);
Packit 971217
  /* FIXME: supported threaded GLSL compilers and don't destroy compilation
Packit 971217
   * performance by getting the compilation result directly after compilation */
Packit 971217
  status = GL_FALSE;
Packit 971217
  vtable->GetShaderiv (priv->handle, GL_COMPILE_STATUS, &status);
Packit 971217
Packit 971217
  len = 0;
Packit 971217
  vtable->GetShaderInfoLog (priv->handle, sizeof (info_buffer) - 1, &len,
Packit 971217
      info_buffer);
Packit 971217
  info_buffer[len] = '\0';
Packit 971217
Packit 971217
  if (status != GL_TRUE) {
Packit 971217
    GST_ERROR_OBJECT (data->stage, "%s shader compilation failed:%s",
Packit 971217
        _shader_type_to_string (priv->type), info_buffer);
Packit 971217
Packit 971217
    g_set_error (data->error, GST_GLSL_ERROR, GST_GLSL_ERROR_COMPILE,
Packit 971217
        "%s shader compilation failed:%s",
Packit 971217
        _shader_type_to_string (priv->type), info_buffer);
Packit 971217
Packit 971217
    vtable->DeleteShader (priv->handle);
Packit 971217
    data->result = FALSE;
Packit 971217
    return;
Packit 971217
  } else if (len > 1) {
Packit 971217
    GST_FIXME_OBJECT (data->stage, "%s shader info log:%s",
Packit 971217
        _shader_type_to_string (priv->type), info_buffer);
Packit 971217
  }
Packit 971217
Packit 971217
  data->result = TRUE;
Packit 971217
}
Packit 971217
Packit 971217
/**
Packit 971217
 * gst_glsl_stage_compile:
Packit 971217
 * @stage: a #GstGLSLStage
Packit 971217
 * @error: a #GError to use on failure
Packit 971217
 *
Packit 971217
 * Returns: whether the compilation suceeded
Packit 971217
 *
Packit 971217
 * Since: 1.8
Packit 971217
 */
Packit 971217
gboolean
Packit 971217
gst_glsl_stage_compile (GstGLSLStage * stage, GError ** error)
Packit 971217
{
Packit 971217
  struct compile data;
Packit 971217
Packit 971217
  g_return_val_if_fail (GST_IS_GLSL_STAGE (stage), FALSE);
Packit 971217
Packit 971217
  if (!stage->priv->strings) {
Packit 971217
    g_set_error (error, GST_GLSL_ERROR, GST_GLSL_ERROR_COMPILE,
Packit 971217
        "No shader source to compile");
Packit 971217
    return FALSE;
Packit 971217
  }
Packit 971217
Packit 971217
  data.stage = stage;
Packit 971217
  data.error = error;
Packit 971217
Packit 971217
  gst_gl_context_thread_add (stage->context,
Packit 971217
      (GstGLContextThreadFunc) _compile_shader, &data);
Packit 971217
Packit 971217
  stage->priv->compiled = TRUE;
Packit 971217
Packit 971217
  return data.result;
Packit 971217
}