diff options
author | Emmanuele Bassi <ebassi@linux.intel.com> | 2011-06-16 15:43:43 +0100 |
---|---|---|
committer | Emmanuele Bassi <ebassi@linux.intel.com> | 2011-06-16 17:14:14 +0100 |
commit | df70fc68149d32d46b60acf78ae56492224ad391 (patch) | |
tree | a3841664a3a70f15cb7626d67529efc21cfd14e0 | |
parent | 18df5c48f06c1b89c52c102dd0090f33dbe85427 (diff) | |
download | clutter-df70fc68149d32d46b60acf78ae56492224ad391.tar.gz |
[2.0] Remove ClutterShader
It's been deprecated and now we can finally remove it.
-rw-r--r-- | clutter/Makefile.am | 2 | ||||
-rw-r--r-- | clutter/clutter-actor.c | 349 | ||||
-rw-r--r-- | clutter/clutter-actor.h | 23 | ||||
-rw-r--r-- | clutter/clutter-shader.c | 950 | ||||
-rw-r--r-- | clutter/clutter-shader.h | 149 | ||||
-rw-r--r-- | clutter/clutter-texture.c | 17 | ||||
-rw-r--r-- | clutter/clutter-types.h | 4 | ||||
-rw-r--r-- | clutter/clutter.h | 1 | ||||
-rw-r--r-- | doc/reference/clutter/clutter-sections.txt | 82 | ||||
-rw-r--r-- | tests/interactive/Makefile.am | 1 | ||||
-rw-r--r-- | tests/interactive/test-shader.c | 416 |
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; -} |