summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@linux.intel.com>2011-06-16 15:43:43 +0100
committerEmmanuele Bassi <ebassi@linux.intel.com>2011-06-16 17:14:14 +0100
commitdf70fc68149d32d46b60acf78ae56492224ad391 (patch)
treea3841664a3a70f15cb7626d67529efc21cfd14e0
parent18df5c48f06c1b89c52c102dd0090f33dbe85427 (diff)
downloadclutter-df70fc68149d32d46b60acf78ae56492224ad391.tar.gz
[2.0] Remove ClutterShader
It's been deprecated and now we can finally remove it.
-rw-r--r--clutter/Makefile.am2
-rw-r--r--clutter/clutter-actor.c349
-rw-r--r--clutter/clutter-actor.h23
-rw-r--r--clutter/clutter-shader.c950
-rw-r--r--clutter/clutter-shader.h149
-rw-r--r--clutter/clutter-texture.c17
-rw-r--r--clutter/clutter-types.h4
-rw-r--r--clutter/clutter.h1
-rw-r--r--doc/reference/clutter/clutter-sections.txt82
-rw-r--r--tests/interactive/Makefile.am1
-rw-r--r--tests/interactive/test-shader.c416
11 files changed, 28 insertions, 1966 deletions
diff --git a/clutter/Makefile.am b/clutter/Makefile.am
index 071b786c9..940267936 100644
--- a/clutter/Makefile.am
+++ b/clutter/Makefile.am
@@ -113,7 +113,6 @@ source_h = \
$(srcdir)/clutter-script.h \
$(srcdir)/clutter-scriptable.h \
$(srcdir)/clutter-settings.h \
- $(srcdir)/clutter-shader.h \
$(srcdir)/clutter-shader-effect.h \
$(srcdir)/clutter-shader-types.h \
$(srcdir)/clutter-swipe-action.h \
@@ -199,7 +198,6 @@ source_c = \
$(srcdir)/clutter-script-parser.c \
$(srcdir)/clutter-scriptable.c \
$(srcdir)/clutter-settings.c \
- $(srcdir)/clutter-shader.c \
$(srcdir)/clutter-shader-effect.c \
$(srcdir)/clutter-shader-types.c \
$(srcdir)/clutter-swipe-action.c \
diff --git a/clutter/clutter-actor.c b/clutter/clutter-actor.c
index 81ba12b57..9c3128372 100644
--- a/clutter/clutter-actor.c
+++ b/clutter/clutter-actor.c
@@ -305,11 +305,9 @@
#include "clutter-profile.h"
#include "clutter-scriptable.h"
#include "clutter-script-private.h"
-#include "clutter-shader.h"
#include "clutter-stage-private.h"
#include "clutter-units.h"
-typedef struct _ShaderData ShaderData;
typedef struct _AnchorCoord AnchorCoord;
#define CLUTTER_ACTOR_GET_PRIVATE(obj) \
@@ -629,10 +627,6 @@ static void clutter_scriptable_iface_init (ClutterScriptableIface *iface);
static void clutter_animatable_iface_init (ClutterAnimatableIface *iface);
static void atk_implementor_iface_init (AtkImplementorIface *iface);
-static void clutter_actor_shader_pre_paint (ClutterActor *actor,
- gboolean repeat);
-static void clutter_actor_shader_post_paint (ClutterActor *actor);
-
/* These setters are all static for now, maybe they should be in the
* public API, but they are perhaps obscure enough to leave only as
* properties
@@ -691,8 +685,6 @@ static ClutterPaintVolume *_clutter_actor_get_paint_volume_mutable (ClutterActor
{ _transform; } \
cogl_matrix_translate ((m), -_tx, -_ty, -_tz); } G_STMT_END
-static GQuark quark_shader_data = 0;
-
G_DEFINE_ABSTRACT_TYPE_WITH_CODE (ClutterActor,
clutter_actor,
G_TYPE_INITIALLY_UNOWNED,
@@ -2649,12 +2641,6 @@ _clutter_actor_update_last_paint_volume (ClutterActor *self)
priv->last_paint_volume_valid = TRUE;
}
-static inline gboolean
-actor_has_shader_data (ClutterActor *self)
-{
- return g_object_get_qdata (G_OBJECT (self), quark_shader_data) != NULL;
-}
-
guint32
_clutter_actor_get_pick_id (ClutterActor *self)
{
@@ -2908,21 +2894,15 @@ clutter_actor_paint (ClutterActor *self)
}
if (priv->effects == NULL)
+ priv->next_effect_to_paint = NULL;
+ else
{
- if (actor_has_shader_data (self))
- clutter_actor_shader_pre_paint (self, FALSE);
- priv->next_effect_to_paint = NULL;
+ priv->next_effect_to_paint =
+ _clutter_meta_group_peek_metas (priv->effects);
}
- else
- priv->next_effect_to_paint =
- _clutter_meta_group_peek_metas (priv->effects);
clutter_actor_continue_paint (self);
- if (priv->effects == NULL &&
- actor_has_shader_data (self))
- clutter_actor_shader_post_paint (self);
-
if (G_UNLIKELY (clutter_paint_debug_flags & CLUTTER_DEBUG_PAINT_VOLUMES))
_clutter_actor_draw_paint_volume (self);
@@ -3789,8 +3769,6 @@ clutter_actor_class_init (ClutterActorClass *klass)
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GParamSpec *pspec;
- quark_shader_data = g_quark_from_static_string ("-clutter-actor-shader-data");
-
object_class->set_property = clutter_actor_set_property;
object_class->get_property = clutter_actor_get_property;
object_class->dispose = clutter_actor_dispose;
@@ -7694,26 +7672,6 @@ clutter_actor_get_name (ClutterActor *self)
}
/**
- * clutter_actor_get_gid:
- * @self: A #ClutterActor
- *
- * Retrieves the unique id for @self.
- *
- * Return value: Globally unique value for this object instance.
- *
- * Since: 0.6
- *
- * Deprecated: 1.8: The id is not used any longer.
- */
-guint32
-clutter_actor_get_gid (ClutterActor *self)
-{
- g_return_val_if_fail (CLUTTER_IS_ACTOR (self), 0);
-
- return self->priv->id;
-}
-
-/**
* clutter_actor_set_depth:
* @self: a #ClutterActor
* @depth: Z co-ord
@@ -9933,305 +9891,6 @@ G_DEFINE_BOXED_TYPE_WITH_CODE (ClutterVertex, clutter_vertex,
clutter_vertex_free,
CLUTTER_REGISTER_INTERVAL_PROGRESS (clutter_vertex_progress));
-struct _ShaderData
-{
- ClutterShader *shader;
-
- /* back pointer to the actor */
- ClutterActor *actor;
-
- /* list of values that should be set on the shader
- * before each paint cycle
- */
- GHashTable *value_hash;
-};
-
-static void
-shader_value_free (gpointer data)
-{
- GValue *var = data;
- g_value_unset (var);
- g_slice_free (GValue, var);
-}
-
-static void
-destroy_shader_data (gpointer data)
-{
- ShaderData *shader_data = data;
-
- if (shader_data == NULL)
- return;
-
- if (shader_data->shader != NULL)
- {
- g_object_unref (shader_data->shader);
- shader_data->shader = NULL;
- }
-
- if (shader_data->value_hash != NULL)
- {
- g_hash_table_destroy (shader_data->value_hash);
- shader_data->value_hash = NULL;
- }
-
- g_slice_free (ShaderData, shader_data);
-}
-
-
-/**
- * clutter_actor_get_shader:
- * @self: a #ClutterActor
- *
- * Queries the currently set #ClutterShader on @self.
- *
- * Return value: (transfer none): The currently set #ClutterShader
- * or %NULL if no shader is set.
- *
- * Since: 0.6
- *
- * Deprecated: 1.8: Use clutter_actor_get_effect() instead.
- */
-ClutterShader *
-clutter_actor_get_shader (ClutterActor *self)
-{
- ShaderData *shader_data;
-
- g_return_val_if_fail (CLUTTER_IS_ACTOR (self), NULL);
-
- shader_data = g_object_get_qdata (G_OBJECT (self), quark_shader_data);
- if (shader_data != NULL)
- return shader_data->shader;
-
- return NULL;
-}
-
-/**
- * clutter_actor_set_shader:
- * @self: a #ClutterActor
- * @shader: (allow-none): a #ClutterShader or %NULL to unset the shader.
- *
- * Sets the #ClutterShader to be used when rendering @self.
- *
- * If @shader is %NULL this function will unset any currently set shader
- * for the actor.
- *
- * <note>Any #ClutterEffect applied to @self will take the precedence
- * over the #ClutterShader set using this function.</note>
- *
- * Return value: %TRUE if the shader was successfully applied
- * or removed
- *
- * Since: 0.6
- *
- * Deprecated: 1.8: Use #ClutterShaderEffect and
- * clutter_actor_add_effect() instead.
- */
-gboolean
-clutter_actor_set_shader (ClutterActor *self,
- ClutterShader *shader)
-{
- ShaderData *shader_data;
-
- g_return_val_if_fail (CLUTTER_IS_ACTOR (self), FALSE);
- g_return_val_if_fail (shader == NULL || CLUTTER_IS_SHADER (shader), FALSE);
-
- if (shader != NULL)
- g_object_ref (shader);
- else
- {
- /* if shader passed in is NULL we destroy the shader */
- g_object_set_qdata (G_OBJECT (self), quark_shader_data, NULL);
- return TRUE;
- }
-
- shader_data = g_object_get_qdata (G_OBJECT (self), quark_shader_data);
- if (shader_data == NULL)
- {
- shader_data = g_slice_new (ShaderData);
- shader_data->actor = self;
- shader_data->shader = NULL;
- shader_data->value_hash =
- g_hash_table_new_full (g_str_hash, g_str_equal,
- g_free,
- shader_value_free);
-
- g_object_set_qdata_full (G_OBJECT (self), quark_shader_data,
- shader_data,
- destroy_shader_data);
- }
-
- if (shader_data->shader != NULL)
- g_object_unref (shader_data->shader);
-
- shader_data->shader = shader;
-
- clutter_actor_queue_redraw (self);
-
- return TRUE;
-}
-
-
-static void
-set_each_param (gpointer key,
- gpointer value,
- gpointer user_data)
-{
- ClutterShader *shader = user_data;
- const gchar *uniform = key;
- GValue *var = value;
-
- clutter_shader_set_uniform (shader, uniform, var);
-}
-
-static void
-clutter_actor_shader_pre_paint (ClutterActor *actor,
- gboolean repeat)
-{
- ShaderData *shader_data;
- ClutterShader *shader;
-
- shader_data = g_object_get_qdata (G_OBJECT (actor), quark_shader_data);
- if (shader_data == NULL)
- return;
-
- shader = shader_data->shader;
- if (shader != NULL)
- {
- clutter_shader_set_is_enabled (shader, TRUE);
-
- g_hash_table_foreach (shader_data->value_hash, set_each_param, shader);
-
- if (!repeat)
- _clutter_context_push_shader_stack (actor);
- }
-}
-
-static void
-clutter_actor_shader_post_paint (ClutterActor *actor)
-{
- ShaderData *shader_data;
- ClutterShader *shader;
-
- shader_data = g_object_get_qdata (G_OBJECT (actor), quark_shader_data);
- if (shader_data == NULL)
- return;
-
- shader = shader_data->shader;
- if (shader != NULL)
- {
- ClutterActor *head;
-
- clutter_shader_set_is_enabled (shader, FALSE);
-
- /* remove the actor from the shaders stack; if there is another
- * actor inside it, then call pre-paint again to set its shader
- * but this time with the second argument being TRUE, indicating
- * that we are re-applying an existing shader and thus should it
- * not be prepended to the stack
- */
- head = _clutter_context_pop_shader_stack (actor);
- if (head != NULL)
- clutter_actor_shader_pre_paint (head, TRUE);
- }
-}
-
-/**
- * clutter_actor_set_shader_param:
- * @self: a #ClutterActor
- * @param: the name of the parameter
- * @value: the value of the parameter
- *
- * Sets the value for a named parameter of the shader applied
- * to @actor.
- *
- * Since: 1.0
- *
- * Deprecated: 1.8: Use clutter_shader_effect_set_uniform_value() instead
- */
-void
-clutter_actor_set_shader_param (ClutterActor *self,
- const gchar *param,
- const GValue *value)
-{
- ShaderData *shader_data;
- GValue *var;
-
- g_return_if_fail (CLUTTER_IS_ACTOR (self));
- g_return_if_fail (param != NULL);
- g_return_if_fail (CLUTTER_VALUE_HOLDS_SHADER_FLOAT (value) ||
- CLUTTER_VALUE_HOLDS_SHADER_INT (value) ||
- CLUTTER_VALUE_HOLDS_SHADER_MATRIX (value) ||
- G_VALUE_HOLDS_FLOAT (value) ||
- G_VALUE_HOLDS_INT (value));
-
- shader_data = g_object_get_qdata (G_OBJECT (self), quark_shader_data);
- if (shader_data == NULL)
- return;
-
- var = g_slice_new0 (GValue);
- g_value_init (var, G_VALUE_TYPE (value));
- g_value_copy (value, var);
- g_hash_table_insert (shader_data->value_hash, g_strdup (param), var);
-
- clutter_actor_queue_redraw (self);
-}
-
-/**
- * clutter_actor_set_shader_param_float:
- * @self: a #ClutterActor
- * @param: the name of the parameter
- * @value: the value of the parameter
- *
- * Sets the value for a named float parameter of the shader applied
- * to @actor.
- *
- * Since: 0.8
- *
- * Deprecated: 1.8: Use clutter_shader_effect_set_uniform() instead
- */
-void
-clutter_actor_set_shader_param_float (ClutterActor *self,
- const gchar *param,
- gfloat value)
-{
- GValue var = { 0, };
-
- g_value_init (&var, G_TYPE_FLOAT);
- g_value_set_float (&var, value);
-
- clutter_actor_set_shader_param (self, param, &var);
-
- g_value_unset (&var);
-}
-
-/**
- * clutter_actor_set_shader_param_int:
- * @self: a #ClutterActor
- * @param: the name of the parameter
- * @value: the value of the parameter
- *
- * Sets the value for a named int parameter of the shader applied to
- * @actor.
- *
- * Since: 0.8
- *
- * Deprecated: 1.8: Use clutter_shader_effect_set_uniform() instead
- */
-void
-clutter_actor_set_shader_param_int (ClutterActor *self,
- const gchar *param,
- gint value)
-{
- GValue var = { 0, };
-
- g_value_init (&var, G_TYPE_INT);
- g_value_set_int (&var, value);
-
- clutter_actor_set_shader_param (self, param, &var);
-
- g_value_unset (&var);
-}
-
/**
* clutter_actor_is_rotated:
* @self: a #ClutterActor
diff --git a/clutter/clutter-actor.h b/clutter/clutter-actor.h
index 832d901af..06cf98b50 100644
--- a/clutter/clutter-actor.h
+++ b/clutter/clutter-actor.h
@@ -461,10 +461,6 @@ void clutter_actor_set_name (ClutterActor
const gchar *name);
const gchar * clutter_actor_get_name (ClutterActor *self);
-#ifndef CLUTTER_DISABLE_DEPRECATED
-guint32 clutter_actor_get_gid (ClutterActor *self);
-#endif
-
void clutter_actor_set_clip (ClutterActor *self,
gfloat xoff,
gfloat yoff,
@@ -533,25 +529,6 @@ gboolean clutter_actor_event (ClutterActor
ClutterEvent *event,
gboolean capture);
-#ifndef CLUTTER_DISABLE_DEPRECATED
-ClutterActor * clutter_get_actor_by_gid (guint32 id_);
-#endif
-
-#if !defined(CLUTTER_DISABLE_DEPRECATED) || defined(CLUTTER_COMPILATION)
-gboolean clutter_actor_set_shader (ClutterActor *self,
- ClutterShader *shader);
-ClutterShader * clutter_actor_get_shader (ClutterActor *self);
-void clutter_actor_set_shader_param (ClutterActor *self,
- const gchar *param,
- const GValue *value);
-void clutter_actor_set_shader_param_int (ClutterActor *self,
- const gchar *param,
- gint value);
-void clutter_actor_set_shader_param_float (ClutterActor *self,
- const gchar *param,
- gfloat value);
-#endif /* CLUTTER_DISABLE_DEPRECATED */
-
void clutter_actor_set_anchor_point (ClutterActor *self,
gfloat anchor_x,
gfloat anchor_y);
diff --git a/clutter/clutter-shader.c b/clutter/clutter-shader.c
deleted file mode 100644
index cf3b20c71..000000000
--- a/clutter/clutter-shader.c
+++ /dev/null
@@ -1,950 +0,0 @@
-/*
- * Clutter.
- *
- * An OpenGL based 'interactive canvas' library.
- *
- * Authored By: Matthew Allum <mallum@openedhand.com>
- * Øyvind Kolås <pippin@o-hand.com>
- * Emmanuele Bassi <ebassi@linux.intel.com>
- *
- * Copyright (C) 2007, 2008 OpenedHand
- * Copyright (C) 2009 Intel Corp
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- *
- *
- */
-
-/**
- * SECTION:clutter-shader
- * @short_description: Programmable pipeline abstraction
- *
- * #ClutterShader is an object providing an abstraction over the
- * OpenGL programmable pipeline. By using #ClutterShader<!-- -->s is
- * possible to override the drawing pipeline by using small programs
- * also known as "shaders".
- *
- * #ClutterShader is available since Clutter 0.6.
- *
- * #ClutterShader is deprecated since Clutter 1.8; use #ClutterShaderEffect
- * in newly written code.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <string.h>
-#include <stdlib.h>
-
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#include <glib.h>
-#include <glib/gi18n-lib.h>
-
-#include <cogl/cogl.h>
-
-#include "clutter-shader.h"
-
-#include "clutter-debug.h"
-#include "clutter-private.h"
-
-/* global list of shaders */
-static GList *clutter_shaders_list = NULL;
-
-#define CLUTTER_SHADER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), CLUTTER_TYPE_SHADER, ClutterShaderPrivate))
-
-struct _ClutterShaderPrivate
-{
- guint compiled : 1; /* Shader is bound to the GL context */
- guint is_enabled : 1;
- guint vertex_is_glsl : 1;
- guint fragment_is_glsl : 1;
-
- gchar *vertex_source; /* GLSL source for vertex shader */
- gchar *fragment_source; /* GLSL source for fragment shader */
-
- CoglHandle program;
-
- CoglHandle vertex_shader;
- CoglHandle fragment_shader;
-};
-
-enum
-{
- PROP_0,
-
- PROP_VERTEX_SOURCE,
- PROP_FRAGMENT_SOURCE,
- PROP_COMPILED,
- PROP_ENABLED,
-
- PROP_LAST
-};
-
-static GParamSpec *obj_props[PROP_LAST];
-
-G_DEFINE_TYPE (ClutterShader, clutter_shader, G_TYPE_OBJECT);
-
-static inline void
-clutter_shader_release_internal (ClutterShader *shader)
-{
- ClutterShaderPrivate *priv = shader->priv;
-
- if (!priv->compiled)
- return;
-
- g_assert (priv->program != COGL_INVALID_HANDLE);
-
- if (priv->vertex_is_glsl && priv->vertex_shader != COGL_INVALID_HANDLE)
- cogl_handle_unref (priv->vertex_shader);
-
- if (priv->fragment_is_glsl && priv->fragment_shader != COGL_INVALID_HANDLE)
- cogl_handle_unref (priv->fragment_shader);
-
- if (priv->program != COGL_INVALID_HANDLE)
- cogl_handle_unref (priv->program);
-
- priv->vertex_shader = COGL_INVALID_HANDLE;
- priv->fragment_shader = COGL_INVALID_HANDLE;
- priv->program = COGL_INVALID_HANDLE;
- priv->compiled = FALSE;
-}
-
-static void
-clutter_shader_finalize (GObject *object)
-{
- ClutterShader *shader;
- ClutterShaderPrivate *priv;
-
- shader = CLUTTER_SHADER (object);
- priv = shader->priv;
-
- clutter_shaders_list = g_list_remove (clutter_shaders_list, object);
-
- g_free (priv->fragment_source);
- g_free (priv->vertex_source);
-
- G_OBJECT_CLASS (clutter_shader_parent_class)->finalize (object);
-}
-
-static void
-clutter_shader_dispose (GObject *object)
-{
- ClutterShader *shader = CLUTTER_SHADER (object);
-
- clutter_shader_release_internal (shader);
-
- G_OBJECT_CLASS (clutter_shader_parent_class)->finalize (object);
-}
-
-static void
-clutter_shader_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- ClutterShader *shader = CLUTTER_SHADER(object);
-
- switch (prop_id)
- {
- case PROP_VERTEX_SOURCE:
- clutter_shader_set_vertex_source (shader,
- g_value_get_string (value), -1);
- break;
- case PROP_FRAGMENT_SOURCE:
- clutter_shader_set_fragment_source (shader,
- g_value_get_string (value), -1);
- break;
- case PROP_ENABLED:
- clutter_shader_set_is_enabled (shader, g_value_get_boolean (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-clutter_shader_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- ClutterShader *shader;
- ClutterShaderPrivate *priv;
-
- shader = CLUTTER_SHADER(object);
- priv = shader->priv;
-
- switch (prop_id)
- {
- case PROP_VERTEX_SOURCE:
- g_value_set_string (value, priv->vertex_source);
- break;
- case PROP_FRAGMENT_SOURCE:
- g_value_set_string (value, priv->fragment_source);
- break;
- case PROP_COMPILED:
- g_value_set_boolean (value, priv->compiled);
- break;
- case PROP_ENABLED:
- g_value_set_boolean (value, priv->is_enabled);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static GObject *
-clutter_shader_constructor (GType type,
- guint n_params,
- GObjectConstructParam *params)
-{
- GObjectClass *parent_class;
- GObject *object;
-
- parent_class = G_OBJECT_CLASS (clutter_shader_parent_class);
- object = parent_class->constructor (type, n_params, params);
-
- /* add this instance to the global list of shaders */
- clutter_shaders_list = g_list_prepend (clutter_shaders_list, object);
-
- return object;
-}
-
-static void
-clutter_shader_class_init (ClutterShaderClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- GParamSpec *pspec = NULL;
-
- object_class->finalize = clutter_shader_finalize;
- object_class->dispose = clutter_shader_dispose;
- object_class->set_property = clutter_shader_set_property;
- object_class->get_property = clutter_shader_get_property;
- object_class->constructor = clutter_shader_constructor;
-
- g_type_class_add_private (klass, sizeof (ClutterShaderPrivate));
-
- /**
- * ClutterShader:vertex-source:
- *
- * GLSL source code for the vertex shader part of the shader
- * program, if any
- *
- * Since: 0.6
- *
- * Deprecated: 1.8: Use #ClutterShaderEffect instead.
- */
- pspec = g_param_spec_string ("vertex-source",
- P_("Vertex Source"),
- P_("Source of vertex shader"),
- NULL,
- CLUTTER_PARAM_READWRITE);
- obj_props[PROP_VERTEX_SOURCE] = pspec;
- g_object_class_install_property (object_class, PROP_VERTEX_SOURCE, pspec);
-
- /**
- * ClutterShader:fragment-source:
- *
- * GLSL source code for the fragment shader part of the shader program.
- *
- * Since: 0.6
- *
- * Deprecated: 1.8: Use #ClutterShaderEffect instead.
- */
- pspec = g_param_spec_string ("fragment-source",
- P_("Fragment Source"),
- P_("Source of fragment shader"),
- NULL,
- CLUTTER_PARAM_READWRITE);
- obj_props[PROP_FRAGMENT_SOURCE] = pspec;
- g_object_class_install_property (object_class, PROP_FRAGMENT_SOURCE, pspec);
-
- /**
- * ClutterShader:compiled:
- *
- * Whether the shader is compiled and linked, ready for use
- * in the GL context.
- *
- * Since: 0.8
- *
- * Deprecated: 1.8: Use #ClutterShaderEffect instead.
- */
- pspec = g_param_spec_boolean ("compiled",
- P_("Compiled"),
- P_("Whether the shader is compiled and linked"),
- FALSE,
- CLUTTER_PARAM_READABLE);
- obj_props[PROP_COMPILED] = pspec;
- g_object_class_install_property (object_class, PROP_COMPILED, pspec);
-
- /**
- * ClutterShader:enabled:
- *
- * Whether the shader is currently used in the GL rendering pipeline.
- *
- * Since: 0.6
- *
- * Deprecated: 1.8: Use #ClutterShaderEffect instead.
- */
- pspec = g_param_spec_boolean ("enabled",
- P_("Enabled"),
- P_("Whether the shader is enabled"),
- FALSE,
- CLUTTER_PARAM_READWRITE);
- obj_props[PROP_ENABLED] = pspec;
- g_object_class_install_property (object_class, PROP_ENABLED, pspec);
-}
-
-static void
-clutter_shader_init (ClutterShader *self)
-{
- ClutterShaderPrivate *priv;
-
- priv = self->priv = CLUTTER_SHADER_GET_PRIVATE (self);
-
- priv->compiled = FALSE;
-
- priv->vertex_source = NULL;
- priv->fragment_source = NULL;
-
- priv->program = COGL_INVALID_HANDLE;
- priv->vertex_shader = COGL_INVALID_HANDLE;
- priv->fragment_shader = COGL_INVALID_HANDLE;
-}
-
-/**
- * clutter_shader_new:
- *
- * Create a new #ClutterShader instance.
- *
- * Return value: a new #ClutterShader.
- *
- * Since: 0.6
- *
- * Deprecated: 1.8: Use #ClutterShaderEffect instead.
- */
-ClutterShader *
-clutter_shader_new (void)
-{
- return g_object_new (CLUTTER_TYPE_SHADER, NULL);
-}
-
-static inline void
-clutter_shader_set_source (ClutterShader *shader,
- ClutterShaderType shader_type,
- const gchar *data,
- gssize length)
-{
- ClutterShaderPrivate *priv = shader->priv;
- gboolean is_glsl = FALSE;
-
- if (length < 0)
- length = strlen (data);
-
- g_object_freeze_notify (G_OBJECT (shader));
-
- /* release shader if bound when changing the source, the shader will
- * automatically be rebound on the next use.
- */
- if (clutter_shader_is_compiled (shader))
- clutter_shader_release (shader);
-
- is_glsl = !g_str_has_prefix (data, "!!ARBfp");
-
- CLUTTER_NOTE (SHADER,
- "setting %s shader (GLSL:%s, len:%" G_GSSIZE_FORMAT ")",
- shader_type == CLUTTER_VERTEX_SHADER ? "vertex" : "fragment",
- is_glsl ? "yes" : "no",
- length);
-
- switch (shader_type)
- {
- case CLUTTER_FRAGMENT_SHADER:
- g_free (priv->fragment_source);
-
- priv->fragment_source = g_strndup (data, length);
- priv->fragment_is_glsl = is_glsl;
- g_object_notify_by_pspec (G_OBJECT (shader), obj_props[PROP_FRAGMENT_SOURCE]);
- break;
-
- case CLUTTER_VERTEX_SHADER:
- g_free (priv->vertex_source);
-
- priv->vertex_source = g_strndup (data, length);
- priv->vertex_is_glsl = is_glsl;
- g_object_notify_by_pspec (G_OBJECT (shader), obj_props[PROP_VERTEX_SOURCE]);
- break;
- }
-
- g_object_thaw_notify (G_OBJECT (shader));
-}
-
-/**
- * clutter_shader_set_fragment_source:
- * @shader: a #ClutterShader
- * @data: GLSL source code.
- * @length: length of source buffer (currently ignored)
- *
- * Sets the GLSL source code to be used by a #ClutterShader for the fragment
- * program.
- *
- * Since: 0.6
- *
- * Deprecated: 1.8: Use #ClutterShaderEffect instead.
- */
-void
-clutter_shader_set_fragment_source (ClutterShader *shader,
- const gchar *data,
- gssize length)
-{
- g_return_if_fail (CLUTTER_IS_SHADER (shader));
- g_return_if_fail (data != NULL);
-
- clutter_shader_set_source (shader, CLUTTER_FRAGMENT_SHADER, data, length);
-}
-
-/**
- * clutter_shader_set_vertex_source:
- * @shader: a #ClutterShader
- * @data: GLSL source code.
- * @length: length of source buffer (currently ignored)
- *
- * Sets the GLSL source code to be used by a #ClutterShader for the vertex
- * program.
- *
- * Since: 0.6
- *
- * Deprecated: 1.8: Use #ClutterShaderEffect instead.
- */
-void
-clutter_shader_set_vertex_source (ClutterShader *shader,
- const gchar *data,
- gssize length)
-{
- g_return_if_fail (CLUTTER_IS_SHADER (shader));
- g_return_if_fail (data != NULL);
-
- clutter_shader_set_source (shader, CLUTTER_VERTEX_SHADER, data, length);
-}
-
-static const gchar *
-clutter_shader_get_source (ClutterShader *shader,
- ClutterShaderType shader_type)
-{
- switch (shader_type)
- {
- case CLUTTER_FRAGMENT_SHADER:
- return shader->priv->fragment_source;
-
- case CLUTTER_VERTEX_SHADER:
- return shader->priv->vertex_source;
- }
-
- return NULL;
-}
-
-static CoglHandle
-clutter_shader_get_cogl_shader (ClutterShader *shader,
- ClutterShaderType shader_type)
-{
- switch (shader_type)
- {
- case CLUTTER_FRAGMENT_SHADER:
- return shader->priv->fragment_shader;
-
- case CLUTTER_VERTEX_SHADER:
- return shader->priv->vertex_shader;
- }
-
- return COGL_INVALID_HANDLE;
-}
-
-static gboolean
-clutter_shader_glsl_bind (ClutterShader *self,
- ClutterShaderType shader_type,
- GError **error)
-{
- ClutterShaderPrivate *priv = self->priv;
- CoglHandle shader = COGL_INVALID_HANDLE;
-
- switch (shader_type)
- {
- case CLUTTER_VERTEX_SHADER:
- shader = cogl_create_shader (COGL_SHADER_TYPE_VERTEX);
- cogl_shader_source (shader, priv->vertex_source);
-
- priv->vertex_shader = shader;
- break;
-
- case CLUTTER_FRAGMENT_SHADER:
- shader = cogl_create_shader (COGL_SHADER_TYPE_FRAGMENT);
- cogl_shader_source (shader, priv->fragment_source);
-
- priv->fragment_shader = shader;
- break;
- }
-
- g_assert (shader != COGL_INVALID_HANDLE);
-
- cogl_shader_compile (shader);
- if (!cogl_shader_is_compiled (shader))
- {
- gchar *log_buf;
-
- log_buf = cogl_shader_get_info_log (shader);
-
- /* translators: the first %s is the type of the shader, either
- * Vertex shader or Fragment shader; the second %s is the actual
- * error as reported by COGL
- */
- g_set_error (error, CLUTTER_SHADER_ERROR,
- CLUTTER_SHADER_ERROR_COMPILE,
- _("%s compilation failed: %s"),
- shader_type == CLUTTER_VERTEX_SHADER ? _("Vertex shader")
- : _("Fragment shader"),
- log_buf);
-
- g_free (log_buf);
-
- return FALSE;
- }
-
- cogl_program_attach_shader (priv->program, shader);
-
- return TRUE;
-}
-
-static gboolean
-bind_glsl_shader (ClutterShader *self,
- GError **error)
-{
- ClutterShaderPrivate *priv = self->priv;
- GError *bind_error = NULL;
- gboolean res;
-
- priv->program = cogl_create_program ();
-
- if (priv->vertex_is_glsl && priv->vertex_source != COGL_INVALID_HANDLE)
- {
- res = clutter_shader_glsl_bind (self,
- CLUTTER_VERTEX_SHADER,
- &bind_error);
-
- if (!res)
- {
- g_propagate_error (error, bind_error);
- return FALSE;
- }
- }
-
- if (priv->fragment_is_glsl && priv->fragment_source != COGL_INVALID_HANDLE)
- {
- res = clutter_shader_glsl_bind (self,
- CLUTTER_FRAGMENT_SHADER,
- &bind_error);
-
- if (!res)
- {
- g_propagate_error (error, bind_error);
- return FALSE;
- }
- }
-
- cogl_program_link (priv->program);
-
- return TRUE;
-}
-
-/**
- * clutter_shader_compile:
- * @shader: a #ClutterShader
- * @error: return location for a #GError, or %NULL
- *
- * Compiles and links GLSL sources set for vertex and fragment shaders for
- * a #ClutterShader. If the compilation fails and a #GError return location is
- * provided the error will contain the errors from the compiler, if any.
- *
- * Return value: returns TRUE if the shader was succesfully compiled.
- *
- * Since: 0.8
- *
- * Deprecated: 1.8: Use #ClutterShaderEffect instead.
- */
-gboolean
-clutter_shader_compile (ClutterShader *shader,
- GError **error)
-{
- ClutterShaderPrivate *priv;
-
- g_return_val_if_fail (CLUTTER_IS_SHADER (shader), FALSE);
-
- priv = shader->priv;
-
- if (priv->compiled)
- return priv->compiled;
-
- if ((priv->vertex_source != COGL_INVALID_HANDLE && !priv->vertex_is_glsl) ||
- (priv->fragment_source != COGL_INVALID_HANDLE && !priv->fragment_is_glsl))
- {
- /* XXX: Could remove this check, since we only advertise support for GLSL
- * shaders anyways. */
- g_set_error (error, CLUTTER_SHADER_ERROR,
- CLUTTER_SHADER_ERROR_NO_ASM,
- "ASM shaders not supported");
- priv->compiled = FALSE;
- return priv->compiled;
- }
-
- if (!clutter_feature_available (CLUTTER_FEATURE_SHADERS_GLSL))
- {
- g_set_error (error, CLUTTER_SHADER_ERROR,
- CLUTTER_SHADER_ERROR_NO_GLSL,
- "GLSL shaders not supported");
- priv->compiled = FALSE;
- return priv->compiled;
- }
-
- priv->compiled = bind_glsl_shader (shader, error);
- g_object_notify_by_pspec (G_OBJECT (shader), obj_props[PROP_COMPILED]);
-
- return priv->compiled;
-}
-
-/**
- * clutter_shader_release:
- * @shader: a #ClutterShader
- *
- * Frees up any GL context resources held by the shader.
- *
- * Since: 0.6
- *
- * Deprecated: 1.8: Use #ClutterShaderEffect instead.
- */
-void
-clutter_shader_release (ClutterShader *shader)
-{
- g_return_if_fail (CLUTTER_IS_SHADER (shader));
-
- clutter_shader_release_internal (shader);
-
- g_object_notify_by_pspec (G_OBJECT (shader), obj_props[PROP_COMPILED]);
-}
-
-/**
- * clutter_shader_is_compiled:
- * @shader: a #ClutterShader
- *
- * Checks whether @shader is is currently compiled, linked and bound
- * to the GL context.
- *
- * Return value: %TRUE if the shader is compiled, linked and ready for use.
- *
- * Since: 0.8
- *
- * Deprecated: 1.8: Use #ClutterShaderEffect instead.
- */
-gboolean
-clutter_shader_is_compiled (ClutterShader *shader)
-{
- g_return_val_if_fail (CLUTTER_IS_SHADER (shader), FALSE);
-
- return shader->priv->compiled;
-}
-
-/**
- * clutter_shader_set_is_enabled:
- * @shader: a #ClutterShader
- * @enabled: The new state of the shader.
- *
- * Enables a shader. This function will attempt to compile and link
- * the shader, if it isn't already.
- *
- * When @enabled is %FALSE the default state of the GL pipeline will be
- * used instead.
- *
- * Since: 0.6
- *
- * Deprecated: 1.8: Use #ClutterShaderEffect instead.
- */
-void
-clutter_shader_set_is_enabled (ClutterShader *shader,
- gboolean enabled)
-{
- ClutterShaderPrivate *priv;
-
- g_return_if_fail (CLUTTER_IS_SHADER (shader));
-
- priv = shader->priv;
-
- if (priv->is_enabled != enabled)
- {
- GError *error = NULL;
- gboolean res;
-
- res = clutter_shader_compile (shader, &error);
- if (!res)
- {
- g_warning ("Unable to bind the shader: %s",
- error ? error->message : "unknown error");
- if (error)
- g_error_free (error);
-
- return;
- }
-
- priv->is_enabled = enabled;
-
- if (priv->is_enabled)
- cogl_program_use (priv->program);
- else
- cogl_program_use (COGL_INVALID_HANDLE);
-
- g_object_notify_by_pspec (G_OBJECT (shader), obj_props[PROP_ENABLED]);
- }
-}
-
-/**
- * clutter_shader_get_is_enabled:
- * @shader: a #ClutterShader
- *
- * Checks whether @shader is enabled.
- *
- * Return value: %TRUE if the shader is enabled.
- *
- * Since: 0.6
- *
- * Deprecated: 1.8: Use #ClutterShaderEffect instead.
- */
-gboolean
-clutter_shader_get_is_enabled (ClutterShader *shader)
-{
- g_return_val_if_fail (CLUTTER_IS_SHADER (shader), FALSE);
-
- return shader->priv->is_enabled;
-}
-
-/**
- * clutter_shader_set_uniform:
- * @shader: a #ClutterShader.
- * @name: name of uniform in GLSL shader program to set.
- * @value: a #ClutterShaderFloat, #ClutterShaderInt or #ClutterShaderMatrix
- * #GValue.
- *
- * Sets a user configurable variable in the GLSL shader programs attached to
- * a #ClutterShader.
- *
- * Since: 1.0
- *
- * Deprecated: 1.8: Use #ClutterShaderEffect instead.
- */
-void
-clutter_shader_set_uniform (ClutterShader *shader,
- const gchar *name,
- const GValue *value)
-{
- ClutterShaderPrivate *priv;
- GLint location = 0;
- gsize size;
-
- g_return_if_fail (CLUTTER_IS_SHADER (shader));
- g_return_if_fail (name != NULL);
- g_return_if_fail (value != NULL);
- g_return_if_fail (CLUTTER_VALUE_HOLDS_SHADER_FLOAT (value) ||
- CLUTTER_VALUE_HOLDS_SHADER_INT (value) ||
- CLUTTER_VALUE_HOLDS_SHADER_MATRIX (value) ||
- G_VALUE_HOLDS_FLOAT (value) ||
- G_VALUE_HOLDS_INT (value));
-
- priv = shader->priv;
- g_return_if_fail (priv->program != COGL_INVALID_HANDLE);
-
- location = cogl_program_get_uniform_location (priv->program, name);
-
- if (CLUTTER_VALUE_HOLDS_SHADER_FLOAT (value))
- {
- const GLfloat *floats;
-
- floats = clutter_value_get_shader_float (value, &size);
- cogl_program_set_uniform_float (priv->program,
- location, size, 1, floats);
- }
- else if (CLUTTER_VALUE_HOLDS_SHADER_INT (value))
- {
- const int *ints;
-
- ints = clutter_value_get_shader_int (value, &size);
- cogl_program_set_uniform_int (priv->program,
- location, size, 1, ints);
- }
- else if (CLUTTER_VALUE_HOLDS_SHADER_MATRIX (value))
- {
- const GLfloat *matrix;
-
- matrix = clutter_value_get_shader_matrix (value, &size);
- cogl_program_set_uniform_matrix (priv->program,
- location, size, 1, FALSE, matrix);
- }
- else if (G_VALUE_HOLDS_FLOAT (value))
- {
- GLfloat float_val = g_value_get_float (value);
-
- cogl_program_set_uniform_float (priv->program,
- location, 1, 1, &float_val);
- }
- else if (G_VALUE_HOLDS_INT (value))
- {
- int int_val = g_value_get_int (value);
-
- cogl_program_set_uniform_int (priv->program,
- location, 1, 1, &int_val);
- }
- else
- g_assert_not_reached ();
-}
-
-/*
- * _clutter_shader_release_all:
- *
- * Iterate through all #ClutterShaders and tell them to release GL context
- * related sources.
- */
-void
-_clutter_shader_release_all (void)
-{
- g_list_foreach (clutter_shaders_list,
- (GFunc) clutter_shader_release,
- NULL);
-}
-
-/**
- * clutter_shader_get_fragment_source:
- * @shader: a #ClutterShader
- *
- * Query the current GLSL fragment source set on @shader.
- *
- * Return value: the source of the fragment shader for this
- * ClutterShader object or %NULL. The returned string is owned by the
- * shader object and should never be modified or freed
- *
- * Since: 0.6
- *
- * Deprecated: 1.8: Use #ClutterShaderEffect instead.
- */
-const gchar *
-clutter_shader_get_fragment_source (ClutterShader *shader)
-{
- g_return_val_if_fail (CLUTTER_IS_SHADER (shader), NULL);
-
- return clutter_shader_get_source (shader, CLUTTER_FRAGMENT_SHADER);
-}
-
-/**
- * clutter_shader_get_vertex_source:
- * @shader: a #ClutterShader
- *
- * Query the current GLSL vertex source set on @shader.
- *
- * Return value: the source of the vertex shader for this
- * ClutterShader object or %NULL. The returned string is owned by the
- * shader object and should never be modified or freed
- *
- * Since: 0.6
- *
- * Deprecated: 1.8: Use #ClutterShaderEffect instead.
- */
-const gchar *
-clutter_shader_get_vertex_source (ClutterShader *shader)
-{
- g_return_val_if_fail (CLUTTER_IS_SHADER (shader), NULL);
-
- return clutter_shader_get_source (shader, CLUTTER_VERTEX_SHADER);
-}
-
-/**
- * clutter_shader_get_cogl_program:
- * @shader: a #ClutterShader
- *
- * Retrieves the underlying #CoglHandle for the shader program.
- *
- * Return value: (transfer none): A #CoglHandle for the shader program,
- * or %NULL. The handle is owned by the #ClutterShader and it should
- * not be unreferenced
- *
- * Since: 1.0
- *
- * Deprecated: 1.8: Use #ClutterShaderEffect instead.
- */
-CoglHandle
-clutter_shader_get_cogl_program (ClutterShader *shader)
-{
- g_return_val_if_fail (CLUTTER_IS_SHADER (shader), NULL);
-
- return shader->priv->program;
-}
-
-/**
- * clutter_shader_get_cogl_fragment_shader:
- * @shader: a #ClutterShader
- *
- * Retrieves the underlying #CoglHandle for the fragment shader.
- *
- * Return value: (transfer none): A #CoglHandle for the fragment
- * shader, or %NULL. The handle is owned by the #ClutterShader
- * and it should not be unreferenced
- *
- * Since: 1.0
- *
- * Deprecated: 1.8: Use #ClutterShaderEffect instead.
- */
-CoglHandle
-clutter_shader_get_cogl_fragment_shader (ClutterShader *shader)
-{
- g_return_val_if_fail (CLUTTER_IS_SHADER (shader), NULL);
-
- return clutter_shader_get_cogl_shader (shader, CLUTTER_FRAGMENT_SHADER);
-}
-
-/**
- * clutter_shader_get_cogl_vertex_shader:
- * @shader: a #ClutterShader
- *
- * Retrieves the underlying #CoglHandle for the vertex shader.
- *
- * Return value: (transfer none): A #CoglHandle for the vertex
- * shader, or %NULL. The handle is owned by the #ClutterShader
- * and it should not be unreferenced
- *
- * Since: 1.0
- *
- * Deprecated: 1.8: Use #ClutterShaderEffect instead.
- */
-CoglHandle
-clutter_shader_get_cogl_vertex_shader (ClutterShader *shader)
-{
- g_return_val_if_fail (CLUTTER_IS_SHADER (shader), NULL);
-
- return clutter_shader_get_cogl_shader (shader, CLUTTER_VERTEX_SHADER);
-}
-
-GQuark
-clutter_shader_error_quark (void)
-{
- return g_quark_from_static_string ("clutter-shader-error");
-}
diff --git a/clutter/clutter-shader.h b/clutter/clutter-shader.h
deleted file mode 100644
index 2604fe55e..000000000
--- a/clutter/clutter-shader.h
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Clutter.
- *
- * An OpenGL based 'interactive canvas' library.
- *
- * Authored By Matthew Allum <mallum@openedhand.com>
- * Øyvind Kolås <pippin@o-hand.com>
- *
- * Copyright (C) 2007 OpenedHand
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
-#error "Only <clutter/clutter.h> can be included directly."
-#endif
-
-#ifndef __CLUTTER_SHADER_H__
-#define __CLUTTER_SHADER_H__
-
-#include <clutter/clutter-types.h>
-#include <clutter/clutter-shader-types.h>
-
-G_BEGIN_DECLS
-
-#if !defined(CLUTTER_DISABLE_DEPRECATED) || defined(CLUTTER_COMPILATION)
-
-#define CLUTTER_TYPE_SHADER (clutter_shader_get_type ())
-#define CLUTTER_SHADER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), CLUTTER_TYPE_SHADER, ClutterShader))
-#define CLUTTER_SHADER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), CLUTTER_TYPE_SHADER, ClutterShaderClass))
-#define CLUTTER_IS_SHADER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), CLUTTER_TYPE_SHADER))
-#define CLUTTER_IS_SHADER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), CLUTTER_TYPE_SHADER))
-#define CLUTTER_SHADER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), CLUTTER_TYPE_SHADER, ClutterShaderClass))
-
-/**
- * CLUTTER_SHADER_ERROR:
- *
- * Error domain for #ClutterShader errors
- *
- * Since: 0.6
- *
- * Deprecated: 1.8
- */
-#define CLUTTER_SHADER_ERROR (clutter_shader_error_quark ())
-
-/**
- * ClutterShaderError:
- * @CLUTTER_SHADER_ERROR_NO_ASM: No ASM shaders support
- * @CLUTTER_SHADER_ERROR_NO_GLSL: No GLSL shaders support
- * @CLUTTER_SHADER_ERROR_COMPILE: Compilation error
- *
- * #ClutterShader error enumeration
- *
- * Since: 0.6
- *
- * Deprecated: 1.8
- */
-typedef enum {
- CLUTTER_SHADER_ERROR_NO_ASM,
- CLUTTER_SHADER_ERROR_NO_GLSL,
- CLUTTER_SHADER_ERROR_COMPILE
-} ClutterShaderError;
-
-typedef struct _ClutterShaderPrivate ClutterShaderPrivate;
-typedef struct _ClutterShaderClass ClutterShaderClass;
-
-/**
- * ClutterShader:
- *
- * The #ClutterShader structure contains only private data
- * and should be accessed using the provided API
- *
- * Since: 0.6
- *
- * Deprecated: 1.8: Use #ClutterShaderEffect instead
- */
-struct _ClutterShader
-{
- /*< private >*/
- GObject parent;
- ClutterShaderPrivate *priv;
-};
-
-/**
- * ClutterShaderClass:
- *
- * The #ClutterShaderClass structure contains only private data
- *
- * Since: 0.6
- *
- * Deprecated: 1.8: Use #ClutterShaderEffectClass instead
- */
-struct _ClutterShaderClass
-{
- /*< private >*/
- GObjectClass parent_class;
-};
-
-GQuark clutter_shader_error_quark (void);
-GType clutter_shader_get_type (void) G_GNUC_CONST;
-
-ClutterShader * clutter_shader_new (void);
-
-void clutter_shader_set_is_enabled (ClutterShader *shader,
- gboolean enabled);
-gboolean clutter_shader_get_is_enabled (ClutterShader *shader);
-
-gboolean clutter_shader_compile (ClutterShader *shader,
- GError **error);
-void clutter_shader_release (ClutterShader *shader);
-gboolean clutter_shader_is_compiled (ClutterShader *shader);
-
-void clutter_shader_set_vertex_source (ClutterShader *shader,
- const gchar *data,
- gssize length);
-void clutter_shader_set_fragment_source (ClutterShader *shader,
- const gchar *data,
- gssize length);
-
-const gchar * clutter_shader_get_vertex_source (ClutterShader *shader);
-const gchar * clutter_shader_get_fragment_source (ClutterShader *shader);
-
-void clutter_shader_set_uniform (ClutterShader *shader,
- const gchar *name,
- const GValue *value);
-
-CoglHandle clutter_shader_get_cogl_program (ClutterShader *shader);
-CoglHandle clutter_shader_get_cogl_fragment_shader (ClutterShader *shader);
-CoglHandle clutter_shader_get_cogl_vertex_shader (ClutterShader *shader);
-
-/* private */
-void _clutter_shader_release_all (void);
-
-#endif /* CLUTTER_DISABLE_DEPRECATED */
-
-G_END_DECLS
-
-#endif /* __CLUTTER_SHADER_H__ */
diff --git a/clutter/clutter-texture.c b/clutter/clutter-texture.c
index b21fa0626..4a917064d 100644
--- a/clutter/clutter-texture.c
+++ b/clutter/clutter-texture.c
@@ -54,7 +54,6 @@
#include "clutter-marshal.h"
#include "clutter-private.h"
#include "clutter-scriptable.h"
-#include "clutter-shader.h"
#include "clutter-stage-private.h"
#include "clutter-util.h"
@@ -476,22 +475,10 @@ update_fbo (ClutterActor *self)
{
ClutterTexture *texture = CLUTTER_TEXTURE (self);
ClutterTexturePrivate *priv = texture->priv;
- ClutterActor *head;
- ClutterShader *shader = NULL;
ClutterActor *stage = NULL;
CoglMatrix projection;
CoglColor transparent_col;
- head = _clutter_context_peek_shader_stack ();
- if (head != NULL)
- shader = clutter_actor_get_shader (head);
-
- /* Temporarily turn off the shader on the top of the context's
- * shader stack, to restore the GL pipeline to it's natural state.
- */
- if (shader != NULL)
- clutter_shader_set_is_enabled (shader, FALSE);
-
/* Redirect drawing to the fbo */
cogl_push_framebuffer (priv->fbo_handle);
@@ -559,10 +546,6 @@ update_fbo (ClutterActor *self)
/* Restore drawing to the previous framebuffer */
cogl_pop_framebuffer ();
-
- /* If there is a shader on top of the shader stack, turn it back on. */
- if (shader != NULL)
- clutter_shader_set_is_enabled (shader, TRUE);
}
static void
diff --git a/clutter/clutter-types.h b/clutter/clutter-types.h
index 59e689e55..a19a77b55 100644
--- a/clutter/clutter-types.h
+++ b/clutter/clutter-types.h
@@ -53,10 +53,6 @@ typedef struct _ClutterAction ClutterAction;
typedef struct _ClutterConstraint ClutterConstraint;
typedef struct _ClutterEffect ClutterEffect;
-#if !defined(CLUTTER_DISABLE_DEPRECATED) || defined(CLUTTER_COMPILATION)
-typedef struct _ClutterShader ClutterShader;
-#endif
-
typedef struct _ClutterColor ClutterColor;
typedef union _ClutterEvent ClutterEvent;
diff --git a/clutter/clutter.h b/clutter/clutter.h
index d64a9b722..b9d8815f1 100644
--- a/clutter/clutter.h
+++ b/clutter/clutter.h
@@ -93,7 +93,6 @@
#include "clutter-scriptable.h"
#include "clutter-script.h"
#include "clutter-settings.h"
-#include "clutter-shader.h"
#include "clutter-shader-effect.h"
#include "clutter-shader-types.h"
#include "clutter-swipe-action.h"
diff --git a/doc/reference/clutter/clutter-sections.txt b/doc/reference/clutter/clutter-sections.txt
index 44fd85ddd..0167abae6 100644
--- a/doc/reference/clutter/clutter-sections.txt
+++ b/doc/reference/clutter/clutter-sections.txt
@@ -1570,64 +1570,6 @@ clutter_score_get_type
</SECTION>
<SECTION>
-<FILE>clutter-shader</FILE>
-<TITLE>Shaders</TITLE>
-ClutterShaderError
-ClutterShader
-ClutterShaderClass
-clutter_shader_new
-clutter_shader_set_vertex_source
-clutter_shader_get_vertex_source
-clutter_shader_set_fragment_source
-clutter_shader_get_fragment_source
-clutter_shader_compile
-clutter_shader_release
-clutter_shader_is_compiled
-clutter_shader_set_is_enabled
-clutter_shader_get_is_enabled
-
-<SUBSECTION>
-clutter_shader_set_uniform
-clutter_shader_get_cogl_program
-clutter_shader_get_cogl_fragment_shader
-clutter_shader_get_cogl_vertex_shader
-
-<SUBSECTION>
-CLUTTER_VALUE_HOLDS_SHADER_FLOAT
-clutter_value_set_shader_float
-clutter_value_get_shader_float
-CLUTTER_VALUE_HOLDS_SHADER_INT
-clutter_value_set_shader_int
-clutter_value_get_shader_int
-CLUTTER_VALUE_HOLDS_SHADER_MATRIX
-clutter_value_set_shader_matrix
-clutter_value_get_shader_matrix
-
-<SUBSECTION Standard>
-CLUTTER_IS_SHADER
-CLUTTER_IS_SHADER_CLASS
-CLUTTER_SHADER
-CLUTTER_SHADER_CLASS
-CLUTTER_SHADER_ERROR
-CLUTTER_SHADER_GET_CLASS
-CLUTTER_TYPE_SHADER
-CLUTTER_TYPE_SHADER_FLOAT
-CLUTTER_TYPE_SHADER_INT
-CLUTTER_TYPE_SHADER_MATRIX
-
-<SUBSECTION Private>
-ClutterShaderPrivate
-clutter_shader_get_type
-ClutterShaderFloat
-clutter_shader_float_get_type
-ClutterShaderInt
-clutter_shader_int_get_type
-ClutterShaderMatrix
-clutter_shader_matrix_get_type
-clutter_shader_error_quark
-</SECTION>
-
-<SECTION>
<TITLE>Implicit Animations</TITLE>
<FILE>clutter-animation</FILE>
ClutterAnimation
@@ -2525,10 +2467,23 @@ ClutterShaderEffectClass
clutter_shader_effect_new
clutter_shader_effect_set_uniform
clutter_shader_effect_set_uniform_value
+
<SUBSECTION>
clutter_shader_effect_set_shader_source
clutter_shader_effect_get_program
clutter_shader_effect_get_shader
+
+<SUBSECTION>
+CLUTTER_VALUE_HOLDS_SHADER_FLOAT
+clutter_value_set_shader_float
+clutter_value_get_shader_float
+CLUTTER_VALUE_HOLDS_SHADER_INT
+clutter_value_set_shader_int
+clutter_value_get_shader_int
+CLUTTER_VALUE_HOLDS_SHADER_MATRIX
+clutter_value_set_shader_matrix
+clutter_value_get_shader_matrix
+
<SUBSECTION Standard>
CLUTTER_TYPE_SHADER_EFFECT
CLUTTER_SHADER_EFFECT
@@ -2536,9 +2491,20 @@ CLUTTER_SHADER_EFFECT_CLASS
CLUTTER_IS_SHADER_EFFECT
CLUTTER_IS_SHADER_EFFECT_CLASS
CLUTTER_SHADER_EFFECT_GET_CLASS
+CLUTTER_TYPE_SHADER
+CLUTTER_TYPE_SHADER_FLOAT
+CLUTTER_TYPE_SHADER_INT
+CLUTTER_TYPE_SHADER_MATRIX
+
<SUBSECTION Private>
ClutterShaderEffectPrivate
clutter_shader_effect_get_type
+ClutterShaderFloat
+clutter_shader_float_get_type
+ClutterShaderInt
+clutter_shader_int_get_type
+ClutterShaderMatrix
+clutter_shader_matrix_get_type
</SECTION>
<SECTION>
diff --git a/tests/interactive/Makefile.am b/tests/interactive/Makefile.am
index 7ed17e539..61fb6fcc5 100644
--- a/tests/interactive/Makefile.am
+++ b/tests/interactive/Makefile.am
@@ -16,7 +16,6 @@ UNIT_TESTS = \
test-model.c \
test-grab.c \
test-fullscreen.c \
- test-shader.c \
test-cogl-shader-arbfp.c \
test-cogl-shader-glsl.c \
test-animator.c \
diff --git a/tests/interactive/test-shader.c b/tests/interactive/test-shader.c
deleted file mode 100644
index 79a014b88..000000000
--- a/tests/interactive/test-shader.c
+++ /dev/null
@@ -1,416 +0,0 @@
-/*#define TEST_GROUP */
-
-#undef CLUTTER_DISABLE_DEPRECATED
-
-#include <clutter/clutter.h>
-
-#include <errno.h>
-#include <stdlib.h>
-#include <glib.h>
-#include <gmodule.h>
-
-/* Dynamic branching appeared in "Shader Model 3.0" that low-end IGPs
- * don't support.
- */
-#define GPU_SUPPORTS_DYNAMIC_BRANCHING 0
-
-typedef struct
-{
- gchar *name;
- gchar *source;
-} ShaderSource;
-
-/* a couple of boilerplate defines that are common amongst all the
- * sample shaders
- */
-
-/* FRAGMENT_SHADER_BEGIN: generate boilerplate with a local vec4 color already
- * initialized, from a sampler2D in a variable tex.
- */
-#define FRAGMENT_SHADER_VARS \
- "uniform sampler2D tex;" \
- "uniform float x_step, y_step;" \
-
-#define FRAGMENT_SHADER_BEGIN \
- "void main (){" \
- " vec4 color = texture2D (tex, vec2(cogl_tex_coord_in[0]));"
-
-/* FRAGMENT_SHADER_END: apply the changed color to the output buffer correctly
- * blended with the gl specified color (makes the opacity of actors work
- * correctly).
- */
-#define FRAGMENT_SHADER_END \
- " gl_FragColor = color;" \
- " gl_FragColor = gl_FragColor * cogl_color_in;" \
- "}"
-
-static ShaderSource shaders[]=
- {
- {"brightness-contrast",
- FRAGMENT_SHADER_VARS
- "uniform float brightness, contrast;"
- FRAGMENT_SHADER_BEGIN
- " color.rgb /= color.a;"
- " color.rgb = (color.rgb - vec3(0.5, 0.5, 0.5)) * contrast + "
- "vec3 (brightness + 0.5, brightness + 0.5, brightness + 0.5);"
- " color.rgb *= color.a;"
- FRAGMENT_SHADER_END
- },
-
- {"box-blur",
- FRAGMENT_SHADER_VARS
-
-#if GPU_SUPPORTS_DYNAMIC_BRANCHING
- "uniform float radius;"
- FRAGMENT_SHADER_BEGIN
- "float u, v;"
- "int count = 1;"
- "for (u=-radius;u<radius;u++)"
- " for (v=-radius;v<radius;v++)"
- " {"
- " color += texture2D(tex, "
- " vec2(cogl_tex_coord_in[0].s + u * 2.0 * x_step, "
- " cogl_tex_coord_in[0].t + v * 2.0 * y_step));"
- " count ++;"
- " }"
- "color = color / float(count);"
- FRAGMENT_SHADER_END
-#else
- "vec4 get_rgba_rel(sampler2D tex, float dx, float dy)"
- "{"
- " return texture2D (tex, cogl_tex_coord_in[0].st "
- " + vec2(dx, dy) * 2.0);"
- "}"
-
- FRAGMENT_SHADER_BEGIN
- " float count = 1.0;"
- " color += get_rgba_rel (tex, -x_step, -y_step); count++;"
- " color += get_rgba_rel (tex, -x_step, 0.0); count++;"
- " color += get_rgba_rel (tex, -x_step, y_step); count++;"
- " color += get_rgba_rel (tex, 0.0, -y_step); count++;"
- " color += get_rgba_rel (tex, 0.0, 0.0); count++;"
- " color += get_rgba_rel (tex, 0.0, y_step); count++;"
- " color += get_rgba_rel (tex, x_step, -y_step); count++;"
- " color += get_rgba_rel (tex, x_step, 0.0); count++;"
- " color += get_rgba_rel (tex, x_step, y_step); count++;"
- " color = color / count;"
- FRAGMENT_SHADER_END
-#endif
- },
-
- {"invert",
- FRAGMENT_SHADER_VARS
- FRAGMENT_SHADER_BEGIN
- " color.rgb /= color.a;"
- " color.rgb = vec3(1.0, 1.0, 1.0) - color.rgb;\n"
- " color.rgb *= color.a;"
- FRAGMENT_SHADER_END
- },
-
- {"brightness-contrast",
- FRAGMENT_SHADER_VARS
- "uniform float brightness;"
- "uniform float contrast;"
- FRAGMENT_SHADER_BEGIN
- " color.rgb /= color.a;"
- " color.r = (color.r - 0.5) * contrast + brightness + 0.5;"
- " color.g = (color.g - 0.5) * contrast + brightness + 0.5;"
- " color.b = (color.b - 0.5) * contrast + brightness + 0.5;"
- " color.rgb *= color.a;"
- FRAGMENT_SHADER_END
- },
-
- {"gray",
- FRAGMENT_SHADER_VARS
- FRAGMENT_SHADER_BEGIN
- " float avg = (color.r + color.g + color.b) / 3.0;"
- " color.r = avg;"
- " color.g = avg;"
- " color.b = avg;"
- FRAGMENT_SHADER_END
- },
-
- {"combined-mirror",
- FRAGMENT_SHADER_VARS
- FRAGMENT_SHADER_BEGIN
- " vec4 colorB = texture2D (tex, vec2(cogl_tex_coord_in[0].ts));"
- " float avg = (color.r + color.g + color.b) / 3.0;"
- " color.r = avg;"
- " color.g = avg;"
- " color.b = avg;"
- " color = (color + colorB)/2.0;"
- FRAGMENT_SHADER_END
- },
-
- {"edge-detect",
- FRAGMENT_SHADER_VARS
- "float get_avg_rel(sampler2D texB, float dx, float dy)"
- "{"
- " vec4 colorB = texture2D (texB, cogl_tex_coord_in[0].st + vec2(dx, dy));"
- " return (colorB.r + colorB.g + colorB.b) / 3.0;"
- "}"
- FRAGMENT_SHADER_BEGIN
- " mat3 sobel_h = mat3( 1.0, 2.0, 1.0,"
- " 0.0, 0.0, 0.0,"
- " -1.0, -2.0, -1.0);"
- " mat3 sobel_v = mat3( 1.0, 0.0, -1.0,"
- " 2.0, 0.0, -2.0,"
- " 1.0, 0.0, -1.0);"
- " mat3 map = mat3( get_avg_rel(tex, -x_step, -y_step),"
- " get_avg_rel(tex, -x_step, 0.0),"
- " get_avg_rel(tex, -x_step, y_step),"
- " get_avg_rel(tex, 0.0, -y_step),"
- " get_avg_rel(tex, 0.0, 0.0),"
- " get_avg_rel(tex, 0.0, y_step),"
- " get_avg_rel(tex, x_step, -y_step),"
- " get_avg_rel(tex, x_step, 0.0),"
- " get_avg_rel(tex, x_step, y_step) );"
- " mat3 gh = sobel_h * map;"
- " mat3 gv = map * sobel_v;"
- " float avgh = (gh[0][0] + gh[0][1] + gh[0][2] +"
- " gh[1][0] + gh[1][1] + gh[1][2] +"
- " gh[2][0] + gh[2][1] + gh[2][2]) / 18.0 + 0.5;"
- " float avgv = (gv[0][0] + gv[0][1] + gv[0][2] +"
- " gv[1][0] + gv[1][1] + gv[1][2] +"
- " gv[2][0] + gv[2][1] + gv[2][2]) / 18.0 + 0.5;"
- " float avg = (avgh + avgv) / 2.0;"
- " color.r = avg * color.r;"
- " color.g = avg * color.g;"
- " color.b = avg * color.b;"
- FRAGMENT_SHADER_END
- },
- /* Terminating NULL sentinel */
- {NULL, NULL}
-};
-
-static gint shader_no = 0;
-
-static int
-next_p2 (gint a)
-{
- int rval = 1;
-
- while (rval < a)
- rval <<= 1;
-
- return rval;
-}
-
-static void
-set_shader_num (ClutterActor *actor, gint new_no)
-{
- int tex_width;
- int tex_height;
-
- if (new_no >= 0 && shaders[new_no].name)
- {
- ClutterShader *shader;
- GError *error;
- shader_no = new_no;
-
- g_print ("setting shaders[%i] named '%s'\n",
- shader_no,
- shaders[shader_no].name);
-
- shader = clutter_shader_new ();
-
- error = NULL;
- g_object_set (G_OBJECT (shader),
- "fragment-source", shaders[shader_no].source,
- NULL);
-
- /* try to bind the shader, provoking an error we catch if there is issues
- * with the shader sources we've provided. At a later stage it should be
- * possible to iterate through a set of alternate shader sources (glsl ->
- * asm -> cg?) and the one that succesfully compiles is used.
- */
- clutter_shader_compile (shader, &error);
- if (error)
- {
- g_print ("unable to set shaders[%i] named '%s': %s",
- shader_no, shaders[shader_no].name,
- error->message);
- g_error_free (error);
- clutter_actor_set_shader (actor, NULL);
- }
- else
- {
- clutter_actor_set_shader (actor, NULL);
- clutter_actor_set_shader (actor, shader);
- clutter_actor_set_shader_param_int (actor, "tex", 0);
- clutter_actor_set_shader_param_float (actor, "radius", 3.0);
- clutter_actor_set_shader_param_float (actor, "brightness", 0.4);
- clutter_actor_set_shader_param_float (actor, "contrast", -1.9);
-
- if (CLUTTER_IS_TEXTURE (actor))
- {
- /* XXX - this assumes *a lot* about how things are done
- * internally on *some* hardware and driver
- */
- tex_width = clutter_actor_get_width (actor);
- tex_width = next_p2 (tex_width);
-
- tex_height = clutter_actor_get_height (actor);
- tex_height = next_p2 (tex_height);
-
- clutter_actor_set_shader_param_float (actor, "x_step",
- 1.0f / tex_width);
- clutter_actor_set_shader_param_float (actor, "y_step",
- 1.0f / tex_height);
- }
- }
-
- g_object_unref (shader);
- }
-}
-
-static gboolean
-button_release_cb (ClutterActor *actor,
- ClutterEvent *event,
- gpointer data)
-{
- gint new_no;
-
- if (event->button.button == 1)
- {
- new_no = shader_no - 1;
- }
- else
- {
- new_no = shader_no + 1;
- }
-
- set_shader_num (actor, new_no);
-
- return FALSE;
-}
-
-#ifdef COGL_HAS_GLES2
-static gboolean
-timeout_cb (gpointer data)
-{
- int new_no = shader_no + 1;
-
- if (shaders[new_no].name == NULL)
- new_no = 0;
-
- set_shader_num (CLUTTER_ACTOR (data), new_no);
-
- return TRUE;
-}
-#endif /* COGL_HAS_GLES2 */
-
-G_MODULE_EXPORT gint
-test_shader_main (gint argc, gchar *argv[])
-{
- ClutterActor *actor;
- ClutterActor *stage;
- ClutterColor stage_color = { 0x61, 0x64, 0x8c, 0xff };
- ClutterShader *shader;
- GError *error;
- gchar *file;
-
- if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS)
- return 1;
-
- stage = clutter_stage_new ();
- clutter_stage_set_title (CLUTTER_STAGE (stage), "Shaders");
- clutter_actor_set_size (stage, 512, 384);
- g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL);
-
- g_print ("applying shaders[%i] named '%s'\n",
- shader_no,
- shaders[shader_no].name);
-
- shader = clutter_shader_new ();
-
- error = NULL;
- clutter_shader_set_fragment_source (shader, shaders[shader_no].source, -1);
- clutter_shader_compile (shader, &error);
- if (error)
- {
- g_print ("unable to load shaders[%d] named '%s': %s\n",
- shader_no,
- shaders[shader_no].name,
- error->message);
- g_error_free (error);
-
- return EXIT_FAILURE;
- }
-
- clutter_stage_set_title (CLUTTER_STAGE (stage), "Shader Test");
- clutter_stage_set_color (CLUTTER_STAGE (stage), &stage_color);
-
- file = g_build_filename (TESTS_DATADIR, "redhand.png", NULL);
-
-#ifndef TEST_GROUP
- actor = clutter_texture_new_from_file (file, &error);
- if (!actor)
- g_error("pixbuf load failed: %s", error ? error->message : "Unknown");
-#else
- actor = clutter_group_new ();
-
- {
- ClutterActor *child1, *child2, *child3, *child4;
- ClutterColor color = { 0xff, 0x22, 0x66, 0x99 };
-
- child1 = clutter_texture_new_from_file (file, &error);
- if (!child1)
- g_error("pixbuf load failed: %s", error ? error->message : "Unknown");
-
- child2 = clutter_texture_new_from_file (file, &error);
- if (!child2)
- g_error("pixbuf load failed: %s", error ? error->message : "Unknown");
-
- child3 = clutter_rectangle_new ();
- child4 = clutter_text_new_with_text ("Sans 20px", "Shady stuff");
-
- clutter_rectangle_set_color (CLUTTER_RECTANGLE (child3), &color);
- clutter_actor_set_size (child3, 50, 50);
-
- clutter_actor_set_position (child1, 0, 0);
- clutter_actor_set_position (child2, 50, 100);
- clutter_actor_set_position (child3, 30, -30);
- clutter_actor_set_position (child4, -50, 20);
-
- clutter_container_add (CLUTTER_CONTAINER (actor),
- child1,
- child2,
- child3,
- child4,
- NULL);
-
- clutter_actor_show_all (actor);
- }
-#endif /* !TEST_GROUP */
-
- g_free (file);
-
- clutter_actor_set_shader (actor, shader);
- clutter_actor_set_position (actor, 100, 100);
-
- g_object_unref (shader);
-
- clutter_container_add_actor (CLUTTER_CONTAINER (stage), actor);
-
- clutter_actor_set_shader_param_int (actor, "tex", 0);
- clutter_actor_set_shader_param_float (actor, "brightness", 0.4);
- clutter_actor_set_shader_param_float (actor, "contrast", -1.9);
-
- clutter_actor_set_reactive (actor, TRUE);
- g_signal_connect (actor, "button-release-event",
- G_CALLBACK (button_release_cb), NULL);
-
-#ifdef COGL_HAS_GLES2
- /* On an embedded platform it is difficult to right click so we will
- cycle through the shaders automatically */
- g_timeout_add_seconds (3, timeout_cb, actor);
-#endif
-
- /* Show everying ( and map window ) */
- clutter_actor_show_all (stage);
-
- clutter_main ();
-
- return EXIT_SUCCESS;
-}