summaryrefslogtreecommitdiff
path: root/gst-libs/gst/gl/gstglslstage.c
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim@centricular.com>2017-12-11 12:59:09 +0000
committerTim-Philipp Müller <tim@centricular.com>2017-12-19 12:02:31 +0000
commit769a21d0bb310906b880c07da0e1e2376e11c187 (patch)
tree02b93bbe659389c940abd69b3a214cfa05f6c501 /gst-libs/gst/gl/gstglslstage.c
parent43631c63ea76c524f96488dbdf4f4e20fa764626 (diff)
gl: remove GStreamer OpenGL integration library and move to -base
https://bugzilla.gnome.org/show_bug.cgi?id=754094
Diffstat (limited to 'gst-libs/gst/gl/gstglslstage.c')
-rw-r--r--gst-libs/gst/gl/gstglslstage.c549
1 files changed, 0 insertions, 549 deletions
diff --git a/gst-libs/gst/gl/gstglslstage.c b/gst-libs/gst/gl/gstglslstage.c
deleted file mode 100644
index 0205f384f..000000000
--- a/gst-libs/gst/gl/gstglslstage.c
+++ /dev/null
@@ -1,549 +0,0 @@
-/*
- * GStreamer
- * Copyright (C) 2015 Matthew Waters <matthew@centricular.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.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "gstglslstage.h"
-
-#include "gl.h"
-#include "gstglfuncs.h"
-#include "gstglsl_private.h"
-
-#ifndef GL_GEOMETRY_SHADER
-#define GL_GEOMETRY_SHADER 0x8DD9
-#endif
-#ifndef GL_COMPUTE_SHADER
-#define GL_COMPUTE_SHADER 0x91B9
-#endif
-#ifndef GL_TESS_CONTROL_SHADER
-#define GL_TESS_CONTROL_SHADER 0x8E88
-#endif
-#ifndef GL_TESS_EVALUATION_SHADER
-#define GL_TESS_EVALUATION_SHADER 0x8E87
-#endif
-
-/**
- * SECTION:gstglslstage
- * @short_description: object for dealing with OpenGL shader stages
- * @title: GstGLSLStage
- * @see_also: #GstGLShader
- *
- * #GstGLSLStage holds and represents a single OpenGL shader stage.
- */
-
-static const gchar *es2_version_header = "#version 100\n";
-
-GST_DEBUG_CATEGORY_STATIC (gst_glsl_stage_debug);
-#define GST_CAT_DEFAULT gst_glsl_stage_debug
-
-G_DEFINE_TYPE_WITH_CODE (GstGLSLStage, gst_glsl_stage, GST_TYPE_OBJECT,
- GST_DEBUG_CATEGORY_INIT (gst_glsl_stage_debug, "glslstage", 0,
- "GLSL Stage");
- );
-
-#define GST_GLSL_STAGE_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE((o), GST_TYPE_GLSL_STAGE, GstGLSLStagePrivate))
-
-struct _GstGLSLStagePrivate
-{
- GstGLSLFuncs vtable;
-
- GLenum type;
- GLhandleARB handle;
- GstGLSLVersion version;
- GstGLSLProfile profile;
- gchar **strings;
- gint n_strings;
-
- gboolean compiled;
-};
-
-static void
-gst_glsl_stage_finalize (GObject * object)
-{
- GstGLSLStage *stage = GST_GLSL_STAGE (object);
- gint i;
-
- if (stage->context) {
- gst_object_unref (stage->context);
- stage->context = NULL;
- }
-
- for (i = 0; i < stage->priv->n_strings; i++) {
- g_free (stage->priv->strings[i]);
- }
- g_free (stage->priv->strings);
- stage->priv->strings = NULL;
-
- G_OBJECT_CLASS (gst_glsl_stage_parent_class)->finalize (object);
-}
-
-static void
-gst_glsl_stage_set_property (GObject * object,
- guint prop_id, const GValue * value, GParamSpec * pspec)
-{
- switch (prop_id) {
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-gst_glsl_stage_get_property (GObject * object,
- guint prop_id, GValue * value, GParamSpec * pspec)
-{
- switch (prop_id) {
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-
-}
-
-static void
-gst_glsl_stage_class_init (GstGLSLStageClass * klass)
-{
- GObjectClass *obj_class = G_OBJECT_CLASS (klass);
-
- g_type_class_add_private (klass, sizeof (GstGLSLStagePrivate));
-
- obj_class->finalize = gst_glsl_stage_finalize;
- obj_class->set_property = gst_glsl_stage_set_property;
- obj_class->get_property = gst_glsl_stage_get_property;
-}
-
-static void
-gst_glsl_stage_init (GstGLSLStage * stage)
-{
- stage->priv = GST_GLSL_STAGE_GET_PRIVATE (stage);
-}
-
-static gboolean
-_is_valid_shader_type (GLenum type)
-{
- switch (type) {
- case GL_VERTEX_SHADER:
- case GL_FRAGMENT_SHADER:
- case GL_TESS_CONTROL_SHADER:
- case GL_TESS_EVALUATION_SHADER:
- case GL_GEOMETRY_SHADER:
- case GL_COMPUTE_SHADER:
- return TRUE;
- default:
- return FALSE;
- }
-}
-
-static const gchar *
-_shader_type_to_string (GLenum type)
-{
- switch (type) {
- case GL_VERTEX_SHADER:
- return "vertex";
- case GL_FRAGMENT_SHADER:
- return "fragment";
- case GL_TESS_CONTROL_SHADER:
- return "tesselation control";
- case GL_TESS_EVALUATION_SHADER:
- return "tesselation evaluation";
- case GL_GEOMETRY_SHADER:
- return "geometry";
- case GL_COMPUTE_SHADER:
- return "compute";
- default:
- return "unknown";
- }
-}
-
-static gboolean
-_ensure_shader (GstGLSLStage * stage)
-{
- if (stage->priv->handle)
- return TRUE;
-
- if (!(stage->priv->handle =
- stage->priv->vtable.CreateShader (stage->priv->type)))
- return FALSE;
-
- return stage->priv->handle != 0;
-}
-
-/**
- * gst_glsl_stage_new_with_strings:
- * @context: a #GstGLContext
- * @type: the GL enum shader stage type
- * @version: the #GstGLSLVersion
- * @profile: the #GstGLSLProfile
- * @n_strings: the number of strings in @str
- * @str: an array of strings concatted together to produce a shader
- *
- * Returns: (transfer floating): a new #GstGLSLStage of the specified @type
- *
- * Since: 1.8
- */
-GstGLSLStage *
-gst_glsl_stage_new_with_strings (GstGLContext * context, guint type,
- GstGLSLVersion version, GstGLSLProfile profile, gint n_strings,
- const gchar ** str)
-{
- GstGLSLStage *stage;
-
- g_return_val_if_fail (GST_IS_GL_CONTEXT (context), NULL);
- g_return_val_if_fail (_is_valid_shader_type (type), NULL);
-
- stage = g_object_new (GST_TYPE_GLSL_STAGE, NULL);
- /* FIXME: GInittable */
- if (!_gst_glsl_funcs_fill (&stage->priv->vtable, context)) {
- gst_object_unref (stage);
- return NULL;
- }
-
- stage->context = gst_object_ref (context);
- stage->priv->type = type;
- if (!gst_glsl_stage_set_strings (stage, version, profile, n_strings, str)) {
- gst_object_unref (stage);
- return NULL;
- }
-
- return stage;
-}
-
-/**
- * gst_glsl_stage_new_with_string:
- * @context: a #GstGLContext
- * @type: the GL enum shader stage type
- * @version: the #GstGLSLVersion
- * @profile: the #GstGLSLProfile
- * @str: a shader string
- *
- * Returns: (transfer floating): a new #GstGLSLStage of the specified @type
- *
- * Since: 1.8
- */
-GstGLSLStage *
-gst_glsl_stage_new_with_string (GstGLContext * context, guint type,
- GstGLSLVersion version, GstGLSLProfile profile, const gchar * str)
-{
- return gst_glsl_stage_new_with_strings (context, type, version, profile, 1,
- &str);
-}
-
-/**
- * gst_glsl_stage_new:
- * @context: a #GstGLContext
- * @type: the GL enum shader stage type
- *
- * Returns: (transfer floating): a new #GstGLSLStage of the specified @type
- *
- * Since: 1.8
- */
-GstGLSLStage *
-gst_glsl_stage_new (GstGLContext * context, guint type)
-{
- return gst_glsl_stage_new_with_string (context, type, GST_GLSL_VERSION_NONE,
- GST_GLSL_PROFILE_NONE, NULL);
-}
-
-/**
- * gst_glsl_stage_new_with_default_vertex:
- * @context: a #GstGLContext
- *
- * Returns: (transfer floating): a new #GstGLSLStage with the default vertex shader
- *
- * Since: 1.8
- */
-GstGLSLStage *
-gst_glsl_stage_new_default_vertex (GstGLContext * context)
-{
- return gst_glsl_stage_new_with_string (context, GL_VERTEX_SHADER,
- GST_GLSL_VERSION_NONE,
- GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
- gst_gl_shader_string_vertex_default);
-}
-
-/**
- * gst_glsl_stage_new_with_default_fragment:
- * @context: a #GstGLContext
- *
- * Returns: (transfer floating): a new #GstGLSLStage with the default fragment shader
- *
- * Since: 1.8
- */
-GstGLSLStage *
-gst_glsl_stage_new_default_fragment (GstGLContext * context)
-{
- return gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
- GST_GLSL_VERSION_NONE,
- GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
- gst_gl_shader_string_fragment_default);
-}
-
-/**
- * gst_glsl_stage_set_strings:
- * @stage: a #GstGLSLStage
- * @version: a #GstGLSLVersion
- * @profile: a #GstGLSLProfile
- * @n_strings: number of strings in @str
- * @str: (transfer none): a GLSL shader string
- *
- * Replaces the current shader string with @str.
- *
- * Since: 1.8
- */
-gboolean
-gst_glsl_stage_set_strings (GstGLSLStage * stage, GstGLSLVersion version,
- GstGLSLProfile profile, gint n_strings, const gchar ** str)
-{
- gint i;
-
- g_return_val_if_fail (GST_IS_GLSL_STAGE (stage), FALSE);
- g_return_val_if_fail (n_strings > 0, FALSE);
- g_return_val_if_fail (str != NULL, FALSE);
-
- if (!gst_gl_context_supports_glsl_profile_version (stage->context, version,
- profile)) {
- const gchar *version_str = gst_glsl_version_to_string (version);
- const gchar *profile_str = gst_glsl_profile_to_string (profile);
- GST_ERROR_OBJECT (stage, "GL context does not support version %s and "
- "profile %s", version_str, profile_str);
- return FALSE;
- }
-
- stage->priv->version = version;
- stage->priv->profile = profile;
-
- for (i = 0; i < stage->priv->n_strings; i++) {
- g_free (stage->priv->strings[i]);
- }
-
- if (stage->priv->n_strings < n_strings) {
- /* only realloc if we need more space */
- g_free (stage->priv->strings);
- stage->priv->strings = g_new0 (gchar *, n_strings);
- }
-
- for (i = 0; i < n_strings; i++)
- stage->priv->strings[i] = g_strdup (str[i]);
- stage->priv->n_strings = n_strings;
-
- return TRUE;
-}
-
-/**
- * gst_glsl_stage_get_shader_type:
- * @stage: a #GstGLSLStage
- *
- * Returns: The GL shader type for this shader stage
- *
- * Since: 1.8
- */
-guint
-gst_glsl_stage_get_shader_type (GstGLSLStage * stage)
-{
- g_return_val_if_fail (GST_IS_GLSL_STAGE (stage), 0);
-
- return stage->priv->type;
-}
-
-/**
- * gst_glsl_stage_get_handle:
- * @stage: a #GstGLSLStage
- *
- * Returns: The GL handle for this shader stage
- *
- * Since: 1.8
- */
-guint
-gst_glsl_stage_get_handle (GstGLSLStage * stage)
-{
- g_return_val_if_fail (GST_IS_GLSL_STAGE (stage), 0);
- g_return_val_if_fail (stage->priv->compiled, 0);
-
- return stage->priv->handle;
-}
-
-/**
- * gst_glsl_stage_get_version:
- * @stage: a #GstGLSLStage
- *
- * Returns: The GLSL version for the current shader stage
- *
- * Since: 1.8
- */
-GstGLSLVersion
-gst_glsl_stage_get_version (GstGLSLStage * stage)
-{
- g_return_val_if_fail (GST_IS_GLSL_STAGE (stage), 0);
-
- return stage->priv->version;
-}
-
-/**
- * gst_glsl_stage_get_profile:
- * @stage: a #GstGLSLStage
- *
- * Returns: The GLSL profile for the current shader stage
- *
- * Since: 1.8
- */
-GstGLSLProfile
-gst_glsl_stage_get_profile (GstGLSLStage * stage)
-{
- g_return_val_if_fail (GST_IS_GLSL_STAGE (stage), 0);
-
- return stage->priv->profile;
-}
-
-static void
-_maybe_prepend_version (GstGLSLStage * stage, gchar ** shader_str,
- gint * n_vertex_sources, const gchar *** vertex_sources)
-{
- gint n = *n_vertex_sources;
- gboolean add_header = FALSE;
- gint i, j;
-
- /* FIXME: this all an educated guess */
- if (gst_gl_context_check_gl_version (stage->context, GST_GL_API_OPENGL3, 3, 0)
- && (stage->priv->profile & GST_GLSL_PROFILE_ES) != 0
- && !_gst_glsl_shader_string_find_version (shader_str[0])) {
- add_header = TRUE;
- n++;
- }
-
- *vertex_sources = g_malloc0 (n * sizeof (gchar *));
-
- i = 0;
- if (add_header)
- (*vertex_sources)[i++] = es2_version_header;
-
- for (j = 0; j < stage->priv->n_strings; i++, j++)
- (*vertex_sources)[i] = shader_str[j];
- *n_vertex_sources = n;
-}
-
-struct compile
-{
- GstGLSLStage *stage;
- GError **error;
- gboolean result;
-};
-
-static void
-_compile_shader (GstGLContext * context, struct compile *data)
-{
- GstGLSLStagePrivate *priv = data->stage->priv;
- GstGLSLFuncs *vtable = &data->stage->priv->vtable;
- const GstGLFuncs *gl = context->gl_vtable;
- const gchar **vertex_sources;
- gchar info_buffer[2048];
- gint n_vertex_sources;
- GLint status;
- gint len;
- gint i;
-
- if (data->stage->priv->compiled) {
- data->result = TRUE;
- return;
- }
-
- if (!_ensure_shader (data->stage)) {
- g_set_error (data->error, GST_GLSL_ERROR, GST_GLSL_ERROR_COMPILE,
- "Failed to create shader object");
- data->result = FALSE;
- return;
- }
-
- n_vertex_sources = data->stage->priv->n_strings;
- _maybe_prepend_version (data->stage, priv->strings, &n_vertex_sources,
- &vertex_sources);
-
- GST_TRACE_OBJECT (data->stage, "compiling shader:");
- for (i = 0; i < n_vertex_sources; i++) {
- GST_TRACE_OBJECT (data->stage, "%s", vertex_sources[i]);
- }
-
- gl->ShaderSource (priv->handle, n_vertex_sources,
- (const gchar **) vertex_sources, NULL);
- gl->CompileShader (priv->handle);
- g_free (vertex_sources);
- /* FIXME: supported threaded GLSL compilers and don't destroy compilation
- * performance by getting the compilation result directly after compilation */
- status = GL_FALSE;
- vtable->GetShaderiv (priv->handle, GL_COMPILE_STATUS, &status);
-
- len = 0;
- vtable->GetShaderInfoLog (priv->handle, sizeof (info_buffer) - 1, &len,
- info_buffer);
- info_buffer[len] = '\0';
-
- if (status != GL_TRUE) {
- GST_ERROR_OBJECT (data->stage, "%s shader compilation failed:%s",
- _shader_type_to_string (priv->type), info_buffer);
-
- g_set_error (data->error, GST_GLSL_ERROR, GST_GLSL_ERROR_COMPILE,
- "%s shader compilation failed:%s",
- _shader_type_to_string (priv->type), info_buffer);
-
- vtable->DeleteShader (priv->handle);
- data->result = FALSE;
- return;
- } else if (len > 1) {
- GST_FIXME_OBJECT (data->stage, "%s shader info log:%s",
- _shader_type_to_string (priv->type), info_buffer);
- }
-
- data->result = TRUE;
-}
-
-/**
- * gst_glsl_stage_compile:
- * @stage: a #GstGLSLStage
- * @error: a #GError to use on failure
- *
- * Returns: whether the compilation suceeded
- *
- * Since: 1.8
- */
-gboolean
-gst_glsl_stage_compile (GstGLSLStage * stage, GError ** error)
-{
- struct compile data;
-
- g_return_val_if_fail (GST_IS_GLSL_STAGE (stage), FALSE);
-
- if (!stage->priv->strings) {
- g_set_error (error, GST_GLSL_ERROR, GST_GLSL_ERROR_COMPILE,
- "No shader source to compile");
- return FALSE;
- }
-
- data.stage = stage;
- data.error = error;
-
- gst_gl_context_thread_add (stage->context,
- (GstGLContextThreadFunc) _compile_shader, &data);
-
- stage->priv->compiled = TRUE;
-
- return data.result;
-}