mirror of
https://github.com/brl/mutter.git
synced 2024-11-23 00:20:42 -05:00
cogl: Port Node/Pipeline/PipelineLayer away from CoglObject
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3193>
This commit is contained in:
parent
80ce052a47
commit
9b9e12edb2
@ -117,7 +117,7 @@ clutter_blur_effect_create_pipeline (ClutterOffscreenEffect *effect,
|
||||
|
||||
cogl_pipeline_set_layer_texture (blur_effect->pipeline, 0, texture);
|
||||
|
||||
return cogl_object_ref (blur_effect->pipeline);
|
||||
return g_object_ref (blur_effect->pipeline);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@ -147,7 +147,7 @@ clutter_blur_effect_dispose (GObject *gobject)
|
||||
{
|
||||
ClutterBlurEffect *self = CLUTTER_BLUR_EFFECT (gobject);
|
||||
|
||||
cogl_clear_object (&self->pipeline);
|
||||
g_clear_object (&self->pipeline);
|
||||
|
||||
G_OBJECT_CLASS (clutter_blur_effect_parent_class)->dispose (gobject);
|
||||
}
|
||||
|
@ -326,7 +326,7 @@ apply_blur_pass (BlurPass *pass)
|
||||
static void
|
||||
clear_blur_pass (BlurPass *pass)
|
||||
{
|
||||
cogl_clear_object (&pass->pipeline);
|
||||
g_clear_object (&pass->pipeline);
|
||||
g_clear_object (&pass->texture);
|
||||
g_clear_object (&pass->framebuffer);
|
||||
}
|
||||
|
@ -130,7 +130,7 @@ clutter_brightness_contrast_effect_create_pipeline (ClutterOffscreenEffect *effe
|
||||
|
||||
cogl_pipeline_set_layer_texture (self->pipeline, 0, texture);
|
||||
|
||||
return cogl_object_ref (self->pipeline);
|
||||
return g_object_ref (self->pipeline);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@ -155,7 +155,7 @@ clutter_brightness_contrast_effect_dispose (GObject *gobject)
|
||||
{
|
||||
ClutterBrightnessContrastEffect *self = CLUTTER_BRIGHTNESS_CONTRAST_EFFECT (gobject);
|
||||
|
||||
cogl_clear_object (&self->pipeline);
|
||||
g_clear_object (&self->pipeline);
|
||||
|
||||
G_OBJECT_CLASS (clutter_brightness_contrast_effect_parent_class)->dispose (gobject);
|
||||
}
|
||||
|
@ -105,7 +105,7 @@ clutter_colorize_effect_create_pipeline (ClutterOffscreenEffect *effect,
|
||||
|
||||
cogl_pipeline_set_layer_texture (colorize_effect->pipeline, 0, texture);
|
||||
|
||||
return cogl_object_ref (colorize_effect->pipeline);
|
||||
return g_object_ref (colorize_effect->pipeline);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -113,7 +113,7 @@ clutter_colorize_effect_dispose (GObject *gobject)
|
||||
{
|
||||
ClutterColorizeEffect *self = CLUTTER_COLORIZE_EFFECT (gobject);
|
||||
|
||||
cogl_clear_object (&self->pipeline);
|
||||
g_clear_object (&self->pipeline);
|
||||
|
||||
G_OBJECT_CLASS (clutter_colorize_effect_parent_class)->dispose (gobject);
|
||||
}
|
||||
|
@ -313,7 +313,7 @@ clutter_deform_effect_paint_target (ClutterOffscreenEffect *effect,
|
||||
clutter_paint_node_add_primitive (back_node, priv->primitive);
|
||||
|
||||
clutter_paint_node_unref (back_node);
|
||||
cogl_object_unref (back_pipeline);
|
||||
g_object_unref (back_pipeline);
|
||||
}
|
||||
|
||||
if (G_UNLIKELY (priv->lines_primitive != NULL))
|
||||
@ -487,7 +487,7 @@ clutter_deform_effect_free_back_pipeline (ClutterDeformEffect *self)
|
||||
{
|
||||
ClutterDeformEffectPrivate *priv = self->priv;
|
||||
|
||||
cogl_clear_object (&priv->back_pipeline);
|
||||
g_clear_object (&priv->back_pipeline);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -522,7 +522,7 @@ clutter_deform_effect_set_property (GObject *gobject,
|
||||
break;
|
||||
|
||||
case PROP_BACK_MATERIAL:
|
||||
clutter_deform_effect_set_back_material (self, g_value_get_pointer (value));
|
||||
clutter_deform_effect_set_back_material (self, g_value_get_object (value));
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -550,7 +550,7 @@ clutter_deform_effect_get_property (GObject *gobject,
|
||||
break;
|
||||
|
||||
case PROP_BACK_MATERIAL:
|
||||
g_value_set_pointer (value, priv->back_pipeline);
|
||||
g_value_set_object (value, priv->back_pipeline);
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -601,8 +601,9 @@ clutter_deform_effect_class_init (ClutterDeformEffectClass *klass)
|
||||
* By default, no material will be used
|
||||
*/
|
||||
obj_props[PROP_BACK_MATERIAL] =
|
||||
g_param_spec_pointer ("back-material", NULL, NULL,
|
||||
CLUTTER_PARAM_READWRITE);
|
||||
g_param_spec_object ("back-material", NULL, NULL,
|
||||
COGL_TYPE_PIPELINE,
|
||||
CLUTTER_PARAM_READWRITE);
|
||||
|
||||
gobject_class->finalize = clutter_deform_effect_finalize;
|
||||
gobject_class->set_property = clutter_deform_effect_set_property;
|
||||
@ -644,7 +645,7 @@ clutter_deform_effect_set_back_material (ClutterDeformEffect *effect,
|
||||
ClutterDeformEffectPrivate *priv;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_DEFORM_EFFECT (effect));
|
||||
g_return_if_fail (pipeline == NULL || cogl_is_pipeline (pipeline));
|
||||
g_return_if_fail (pipeline == NULL || COGL_IS_PIPELINE (pipeline));
|
||||
|
||||
priv = effect->priv;
|
||||
|
||||
@ -652,7 +653,7 @@ clutter_deform_effect_set_back_material (ClutterDeformEffect *effect,
|
||||
|
||||
priv->back_pipeline = pipeline;
|
||||
if (priv->back_pipeline != NULL)
|
||||
cogl_object_ref (priv->back_pipeline);
|
||||
g_object_ref (priv->back_pipeline);
|
||||
|
||||
clutter_deform_effect_invalidate (effect);
|
||||
}
|
||||
|
@ -116,7 +116,7 @@ clutter_desaturate_effect_create_pipeline (ClutterOffscreenEffect *effect,
|
||||
|
||||
cogl_pipeline_set_layer_texture (desaturate_effect->pipeline, 0, texture);
|
||||
|
||||
return cogl_object_ref (desaturate_effect->pipeline);
|
||||
return g_object_ref (desaturate_effect->pipeline);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -124,7 +124,7 @@ clutter_desaturate_effect_dispose (GObject *gobject)
|
||||
{
|
||||
ClutterDesaturateEffect *self = CLUTTER_DESATURATE_EFFECT (gobject);
|
||||
|
||||
cogl_clear_object (&self->pipeline);
|
||||
g_clear_object (&self->pipeline);
|
||||
|
||||
G_OBJECT_CLASS (clutter_desaturate_effect_parent_class)->dispose (gobject);
|
||||
}
|
||||
|
@ -101,13 +101,13 @@
|
||||
* // Clear the previous state //
|
||||
* if (self->rect_1)
|
||||
* {
|
||||
* cogl_object_unref (self->rect_1);
|
||||
* g_object_unref (self->rect_1);
|
||||
* self->rect_1 = NULL;
|
||||
* }
|
||||
*
|
||||
* if (self->rect_2)
|
||||
* {
|
||||
* cogl_object_unref (self->rect_2);
|
||||
* g_object_unref (self->rect_2);
|
||||
* self->rect_2 = NULL;
|
||||
* }
|
||||
*
|
||||
|
@ -274,7 +274,7 @@ update_fbo (ClutterEffect *effect,
|
||||
error->message);
|
||||
|
||||
g_object_unref (offscreen);
|
||||
cogl_clear_object (&priv->pipeline);
|
||||
g_clear_object (&priv->pipeline);
|
||||
|
||||
priv->target_width = 0;
|
||||
priv->target_height = 0;
|
||||
@ -284,7 +284,7 @@ update_fbo (ClutterEffect *effect,
|
||||
|
||||
priv->offscreen = offscreen;
|
||||
|
||||
cogl_clear_object (&priv->pipeline);
|
||||
g_clear_object (&priv->pipeline);
|
||||
priv->pipeline = offscreen_class->create_pipeline (self, priv->texture);
|
||||
|
||||
return TRUE;
|
||||
@ -577,7 +577,7 @@ clutter_offscreen_effect_finalize (GObject *gobject)
|
||||
|
||||
g_clear_object (&priv->offscreen);
|
||||
g_clear_object (&priv->texture);
|
||||
g_clear_pointer (&priv->pipeline, cogl_object_unref);
|
||||
g_clear_object (&priv->pipeline);
|
||||
|
||||
G_OBJECT_CLASS (clutter_offscreen_effect_parent_class)->finalize (gobject);
|
||||
}
|
||||
|
@ -384,7 +384,7 @@ clutter_pipeline_node_finalize (ClutterPaintNode *node)
|
||||
ClutterPipelineNode *pnode = CLUTTER_PIPELINE_NODE (node);
|
||||
|
||||
if (pnode->pipeline != NULL)
|
||||
cogl_object_unref (pnode->pipeline);
|
||||
g_object_unref (pnode->pipeline);
|
||||
|
||||
CLUTTER_PAINT_NODE_CLASS (clutter_pipeline_node_parent_class)->finalize (node);
|
||||
}
|
||||
@ -554,7 +554,7 @@ clutter_pipeline_node_init (ClutterPipelineNode *self)
|
||||
* paint its contents.
|
||||
*
|
||||
* This function will acquire a reference on the passed @pipeline,
|
||||
* so it is safe to call cogl_object_unref() when it returns.
|
||||
* so it is safe to call g_object_unref() when it returns.
|
||||
*
|
||||
* Return value: (transfer full): the newly created #ClutterPaintNode.
|
||||
* Use clutter_paint_node_unref() when done.
|
||||
@ -564,12 +564,12 @@ clutter_pipeline_node_new (CoglPipeline *pipeline)
|
||||
{
|
||||
ClutterPipelineNode *res;
|
||||
|
||||
g_return_val_if_fail (pipeline == NULL || cogl_is_pipeline (pipeline), NULL);
|
||||
g_return_val_if_fail (pipeline == NULL || COGL_IS_PIPELINE (pipeline), NULL);
|
||||
|
||||
res = _clutter_paint_node_create (CLUTTER_TYPE_PIPELINE_NODE);
|
||||
|
||||
if (pipeline != NULL)
|
||||
res->pipeline = cogl_object_ref (pipeline);
|
||||
res->pipeline = g_object_ref (pipeline);
|
||||
|
||||
return (ClutterPaintNode *) res;
|
||||
}
|
||||
@ -1427,7 +1427,7 @@ clutter_layer_node_finalize (ClutterPaintNode *node)
|
||||
ClutterLayerNode *lnode = CLUTTER_LAYER_NODE (node);
|
||||
|
||||
if (lnode->pipeline != NULL)
|
||||
cogl_object_unref (lnode->pipeline);
|
||||
g_object_unref (lnode->pipeline);
|
||||
|
||||
g_clear_object (&lnode->offscreen);
|
||||
|
||||
@ -1494,7 +1494,7 @@ clutter_layer_node_new_to_framebuffer (CoglFramebuffer *framebuffer,
|
||||
ClutterLayerNode *res;
|
||||
|
||||
g_return_val_if_fail (COGL_IS_FRAMEBUFFER (framebuffer), NULL);
|
||||
g_return_val_if_fail (cogl_is_pipeline (pipeline), NULL);
|
||||
g_return_val_if_fail (COGL_IS_PIPELINE (pipeline), NULL);
|
||||
|
||||
res = _clutter_paint_node_create (CLUTTER_TYPE_LAYER_NODE);
|
||||
|
||||
|
@ -208,7 +208,7 @@ clutter_stage_view_invalidate_offscreen_blit_pipeline (ClutterStageView *view)
|
||||
ClutterStageViewPrivate *priv =
|
||||
clutter_stage_view_get_instance_private (view);
|
||||
|
||||
g_clear_pointer (&priv->offscreen_pipeline, cogl_object_unref);
|
||||
g_clear_object (&priv->offscreen_pipeline);
|
||||
}
|
||||
|
||||
void
|
||||
@ -1485,7 +1485,7 @@ clutter_stage_view_dispose (GObject *object)
|
||||
clutter_damage_history_free);
|
||||
|
||||
g_clear_object (&priv->offscreen);
|
||||
g_clear_pointer (&priv->offscreen_pipeline, cogl_object_unref);
|
||||
g_clear_object (&priv->offscreen_pipeline);
|
||||
g_clear_pointer (&priv->redraw_clip, cairo_region_destroy);
|
||||
g_clear_pointer (&priv->accumulated_redraw_clip, cairo_region_destroy);
|
||||
g_clear_pointer (&priv->frame_clock, clutter_frame_clock_destroy);
|
||||
|
@ -1964,7 +1964,7 @@ paint_selection_rectangle (ClutterText *self,
|
||||
cogl_pango_show_layout (fb, layout, priv->text_x, 0, &cogl_color);
|
||||
|
||||
cogl_framebuffer_pop_clip (fb);
|
||||
cogl_object_unref (color_pipeline);
|
||||
g_object_unref (color_pipeline);
|
||||
}
|
||||
|
||||
/* Draws the selected text, its background, and the cursor */
|
||||
@ -2007,7 +2007,7 @@ selection_paint (ClutterText *self,
|
||||
priv->cursor_rect.origin.x + priv->cursor_rect.size.width,
|
||||
priv->cursor_rect.origin.y + priv->cursor_rect.size.height);
|
||||
|
||||
g_clear_pointer (&color_pipeline, cogl_object_unref);
|
||||
g_clear_object (&color_pipeline);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -469,7 +469,7 @@ _cogl_pango_display_list_node_free (CoglPangoDisplayListNode *node)
|
||||
cogl_object_unref (node->d.trapezoid.primitive);
|
||||
|
||||
if (node->pipeline)
|
||||
cogl_object_unref (node->pipeline);
|
||||
g_object_unref (node->pipeline);
|
||||
|
||||
g_free (node);
|
||||
}
|
||||
|
@ -41,6 +41,8 @@
|
||||
|
||||
typedef struct _CoglPangoPipelineCacheEntry CoglPangoPipelineCacheEntry;
|
||||
|
||||
static GQuark pipeline_destroy_notify_key = 0;
|
||||
|
||||
struct _CoglPangoPipelineCacheEntry
|
||||
{
|
||||
/* This will take a reference or it can be NULL to represent the
|
||||
@ -55,7 +57,7 @@ static void
|
||||
_cogl_pango_pipeline_cache_key_destroy (void *data)
|
||||
{
|
||||
if (data)
|
||||
cogl_object_unref (data);
|
||||
g_object_unref (data);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -173,13 +175,13 @@ _cogl_pango_pipeline_cache_get (CoglPangoPipelineCache *cache,
|
||||
{
|
||||
CoglPangoPipelineCacheEntry *entry;
|
||||
PipelineDestroyNotifyData *destroy_data;
|
||||
static CoglUserDataKey pipeline_destroy_notify_key;
|
||||
pipeline_destroy_notify_key = g_quark_from_static_string ("-cogl-pango-pipeline-cache-key");
|
||||
|
||||
/* Look for an existing entry */
|
||||
entry = g_hash_table_lookup (cache->hash_table, texture);
|
||||
|
||||
if (entry)
|
||||
return cogl_object_ref (entry->pipeline);
|
||||
return g_object_ref (entry->pipeline);
|
||||
|
||||
/* No existing pipeline was found so let's create another */
|
||||
entry = g_new0 (CoglPangoPipelineCacheEntry, 1);
|
||||
@ -210,10 +212,10 @@ _cogl_pango_pipeline_cache_get (CoglPangoPipelineCache *cache,
|
||||
destroy_data = g_new0 (PipelineDestroyNotifyData, 1);
|
||||
destroy_data->cache = cache;
|
||||
destroy_data->texture = texture;
|
||||
cogl_object_set_user_data (COGL_OBJECT (entry->pipeline),
|
||||
&pipeline_destroy_notify_key,
|
||||
destroy_data,
|
||||
pipeline_destroy_notify_cb);
|
||||
g_object_set_qdata_full (G_OBJECT (entry->pipeline),
|
||||
pipeline_destroy_notify_key,
|
||||
destroy_data,
|
||||
pipeline_destroy_notify_cb);
|
||||
|
||||
g_hash_table_insert (cache->hash_table,
|
||||
texture ? g_object_ref (texture) : NULL,
|
||||
@ -228,9 +230,9 @@ void
|
||||
_cogl_pango_pipeline_cache_free (CoglPangoPipelineCache *cache)
|
||||
{
|
||||
if (cache->base_texture_rgba_pipeline)
|
||||
cogl_object_unref (cache->base_texture_rgba_pipeline);
|
||||
g_object_unref (cache->base_texture_rgba_pipeline);
|
||||
if (cache->base_texture_alpha_pipeline)
|
||||
cogl_object_unref (cache->base_texture_alpha_pipeline);
|
||||
g_object_unref (cache->base_texture_alpha_pipeline);
|
||||
|
||||
g_hash_table_destroy (cache->hash_table);
|
||||
|
||||
|
@ -642,7 +642,7 @@ _cogl_flush_attributes_state (CoglFramebuffer *framebuffer,
|
||||
n_attributes);
|
||||
|
||||
if (copy)
|
||||
cogl_object_unref (copy);
|
||||
g_object_unref (copy);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -81,10 +81,10 @@ cogl_context_dispose (GObject *object)
|
||||
g_object_unref (context->default_gl_texture_2d_tex);
|
||||
|
||||
if (context->opaque_color_pipeline)
|
||||
cogl_object_unref (context->opaque_color_pipeline);
|
||||
g_object_unref (context->opaque_color_pipeline);
|
||||
|
||||
if (context->blit_texture_pipeline)
|
||||
cogl_object_unref (context->blit_texture_pipeline);
|
||||
g_object_unref (context->blit_texture_pipeline);
|
||||
|
||||
if (context->swap_callback_closures)
|
||||
g_hash_table_destroy (context->swap_callback_closures);
|
||||
@ -100,14 +100,14 @@ cogl_context_dispose (GObject *object)
|
||||
g_object_unref (context->rectangle_short_indices);
|
||||
|
||||
if (context->default_pipeline)
|
||||
cogl_object_unref (context->default_pipeline);
|
||||
g_object_unref (context->default_pipeline);
|
||||
|
||||
if (context->dummy_layer_dependant)
|
||||
cogl_object_unref (context->dummy_layer_dependant);
|
||||
g_object_unref (context->dummy_layer_dependant);
|
||||
if (context->default_layer_n)
|
||||
cogl_object_unref (context->default_layer_n);
|
||||
g_object_unref (context->default_layer_n);
|
||||
if (context->default_layer_0)
|
||||
cogl_object_unref (context->default_layer_0);
|
||||
g_object_unref (context->default_layer_0);
|
||||
|
||||
if (context->current_clip_stack_valid)
|
||||
_cogl_clip_stack_unref (context->current_clip_stack);
|
||||
@ -402,7 +402,7 @@ cogl_context_new (CoglDisplay *display,
|
||||
_cogl_list_init (&context->fences);
|
||||
|
||||
context->named_pipelines =
|
||||
g_hash_table_new_full (NULL, NULL, NULL, cogl_object_unref);
|
||||
g_hash_table_new_full (NULL, NULL, NULL, g_object_unref);
|
||||
|
||||
return context;
|
||||
}
|
||||
|
@ -77,7 +77,7 @@ enum
|
||||
static guint signals[N_SIGNALS];
|
||||
|
||||
#ifdef COGL_ENABLE_DEBUG
|
||||
static CoglUserDataKey wire_pipeline_key;
|
||||
static GQuark wire_pipeline_key = 0;
|
||||
#endif
|
||||
|
||||
typedef struct _CoglFramebufferPrivate
|
||||
@ -869,7 +869,7 @@ _cogl_framebuffer_add_dependency (CoglFramebuffer *framebuffer,
|
||||
}
|
||||
|
||||
/* TODO: generalize the primed-array type structure we e.g. use for
|
||||
* cogl_object_set_user_data or for pipeline children as a way to
|
||||
* g_object_set_qdata_full or for pipeline children as a way to
|
||||
* avoid quite a lot of mid-scene micro allocations here... */
|
||||
priv->deps =
|
||||
g_list_prepend (priv->deps, g_object_ref (dependency));
|
||||
@ -2288,7 +2288,7 @@ pipeline_destroyed_cb (CoglPipeline *weak_pipeline, void *user_data)
|
||||
|
||||
/* XXX: I think we probably need to provide a custom unref function for
|
||||
* CoglPipeline because it's possible that we will reach this callback
|
||||
* because original_pipeline is being freed which means cogl_object_unref
|
||||
* because original_pipeline is being freed which means g_object_unref
|
||||
* will have already freed any associated user data.
|
||||
*
|
||||
* Setting more user data here will *probably* succeed but that may allocate
|
||||
@ -2298,10 +2298,10 @@ pipeline_destroyed_cb (CoglPipeline *weak_pipeline, void *user_data)
|
||||
* that a custom unref function could be written that can destroy weak
|
||||
* pipeline children before removing user data.
|
||||
*/
|
||||
cogl_object_set_user_data (COGL_OBJECT (original_pipeline),
|
||||
&wire_pipeline_key, NULL, NULL);
|
||||
g_object_set_qdata_full (G_OBJECT (original_pipeline),
|
||||
wire_pipeline_key, NULL, NULL);
|
||||
|
||||
cogl_object_unref (weak_pipeline);
|
||||
g_object_unref (weak_pipeline);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -2319,7 +2319,7 @@ draw_wireframe (CoglContext *ctx,
|
||||
CoglIndices *wire_indices;
|
||||
CoglPipeline *wire_pipeline;
|
||||
int n_indices;
|
||||
|
||||
wire_pipeline_key = g_quark_from_static_string ("framebuffer-wire-pipeline-key");
|
||||
wire_indices = get_wire_line_indices (ctx,
|
||||
mode,
|
||||
first_vertex,
|
||||
@ -2327,8 +2327,8 @@ draw_wireframe (CoglContext *ctx,
|
||||
indices,
|
||||
&n_indices);
|
||||
|
||||
wire_pipeline = cogl_object_get_user_data (COGL_OBJECT (pipeline),
|
||||
&wire_pipeline_key);
|
||||
wire_pipeline = g_object_get_qdata (G_OBJECT (pipeline),
|
||||
wire_pipeline_key);
|
||||
|
||||
if (!wire_pipeline)
|
||||
{
|
||||
@ -2337,9 +2337,9 @@ draw_wireframe (CoglContext *ctx,
|
||||
wire_pipeline =
|
||||
_cogl_pipeline_weak_copy (pipeline, pipeline_destroyed_cb, NULL);
|
||||
|
||||
cogl_object_set_user_data (COGL_OBJECT (pipeline),
|
||||
&wire_pipeline_key, wire_pipeline,
|
||||
NULL);
|
||||
g_object_set_qdata_full (G_OBJECT (pipeline),
|
||||
wire_pipeline_key, wire_pipeline,
|
||||
NULL);
|
||||
|
||||
/* If we have glsl then the pipeline may have an associated
|
||||
* vertex program and since we'd like to see the results of the
|
||||
|
@ -1618,7 +1618,7 @@ _cogl_journal_log_quad (CoglJournal *journal,
|
||||
cogl_framebuffer_get_viewport4fv (framebuffer, entry->viewport);
|
||||
|
||||
if (G_UNLIKELY (final_pipeline != pipeline))
|
||||
cogl_object_unref (final_pipeline);
|
||||
g_object_unref (final_pipeline);
|
||||
|
||||
modelview_stack =
|
||||
_cogl_framebuffer_get_modelview_stack (framebuffer);
|
||||
|
@ -33,9 +33,9 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "cogl/cogl-object-private.h"
|
||||
#include "cogl/cogl-list.h"
|
||||
|
||||
typedef struct _CoglNodeClass CoglNodeClass;
|
||||
typedef struct _CoglNode CoglNode;
|
||||
|
||||
/* Pipelines and layers represent their state in a tree structure where
|
||||
@ -44,9 +44,7 @@ typedef struct _CoglNode CoglNode;
|
||||
* type to track the tree hierarchy so we can share code... */
|
||||
struct _CoglNode
|
||||
{
|
||||
/* the parent in terms of class hierarchy, so anything inheriting
|
||||
* from CoglNode also inherits from CoglObject. */
|
||||
CoglObject _parent;
|
||||
GObject parent_instance;
|
||||
|
||||
/* The parent pipeline/layer */
|
||||
CoglNode *parent;
|
||||
@ -62,10 +60,23 @@ struct _CoglNode
|
||||
gboolean has_parent_reference;
|
||||
};
|
||||
|
||||
#define COGL_NODE(X) ((CoglNode *)(X))
|
||||
struct _CoglNodeClass
|
||||
{
|
||||
GObjectClass parent_class;
|
||||
};
|
||||
|
||||
void
|
||||
_cogl_pipeline_node_init (CoglNode *node);
|
||||
#define COGL_TYPE_NODE (cogl_node_get_type ())
|
||||
#define COGL_NODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), COGL_TYPE_NODE, CoglNode))
|
||||
#define COGL_NODE_CONST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), COGL_TYPE_NODE, CoglNode const))
|
||||
#define COGL_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), COGL_TYPE_NODE, CoglNodeClass))
|
||||
#define COGL_IS_NODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), COGL_TYPE_NODE))
|
||||
#define COGL_IS_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), COGL_TYPE_NODE))
|
||||
#define COGL_NODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), COGL_TYPE_NODE, CoglNodeClass))
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (CoglNode, g_object_unref)
|
||||
|
||||
COGL_EXPORT
|
||||
GType cogl_node_get_type (void) G_GNUC_CONST;
|
||||
|
||||
void
|
||||
_cogl_pipeline_node_set_parent_real (CoglNode *node,
|
||||
|
@ -36,8 +36,15 @@
|
||||
#include "cogl/cogl-util.h"
|
||||
#include "cogl/cogl-node-private.h"
|
||||
|
||||
void
|
||||
_cogl_pipeline_node_init (CoglNode *node)
|
||||
G_DEFINE_ABSTRACT_TYPE (CoglNode, cogl_node, G_TYPE_OBJECT)
|
||||
|
||||
static void
|
||||
cogl_node_class_init (CoglNodeClass *klass)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
cogl_node_init (CoglNode *node)
|
||||
{
|
||||
node->parent = NULL;
|
||||
_cogl_list_init (&node->children);
|
||||
@ -57,7 +64,7 @@ _cogl_pipeline_node_set_parent_real (CoglNode *node,
|
||||
* consistent link to all weak nodes. Once the node is linked to its
|
||||
* parent then we remove the reference at the end if
|
||||
* take_strong_reference == FALSE. */
|
||||
cogl_object_ref (parent);
|
||||
g_object_ref (parent);
|
||||
|
||||
if (node->parent)
|
||||
_cogl_pipeline_node_unparent_real (node);
|
||||
@ -72,7 +79,7 @@ _cogl_pipeline_node_set_parent_real (CoglNode *node,
|
||||
* out that the new parent was only being kept alive by the old
|
||||
* parent then it will be disposed of here. */
|
||||
if (!take_strong_reference)
|
||||
cogl_object_unref (parent);
|
||||
g_object_unref (parent);
|
||||
}
|
||||
|
||||
void
|
||||
@ -88,7 +95,7 @@ _cogl_pipeline_node_unparent_real (CoglNode *node)
|
||||
_cogl_list_remove (&node->link);
|
||||
|
||||
if (node->has_parent_reference)
|
||||
cogl_object_unref (parent);
|
||||
g_object_unref (parent);
|
||||
|
||||
node->parent = NULL;
|
||||
}
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include "cogl-config.h"
|
||||
|
||||
#include "cogl/cogl-context-private.h"
|
||||
#include "cogl/cogl-debug.h"
|
||||
#include "cogl/cogl-pipeline-private.h"
|
||||
#include "cogl/cogl-pipeline-layer-private.h"
|
||||
#include "cogl/cogl-node-private.h"
|
||||
@ -61,7 +62,7 @@ dump_layer_cb (CoglNode *node, void *user_data)
|
||||
if (state->parent_id >= 0)
|
||||
g_string_append_printf (state->graph, "%*slayer%p -> layer%p;\n",
|
||||
state->indent, "",
|
||||
layer->_parent.parent,
|
||||
layer->parent_instance.parent,
|
||||
layer);
|
||||
|
||||
g_string_append_printf (state->graph,
|
||||
@ -71,7 +72,7 @@ dump_layer_cb (CoglNode *node, void *user_data)
|
||||
state->indent, "",
|
||||
layer,
|
||||
layer,
|
||||
COGL_OBJECT (layer)->ref_count);
|
||||
G_OBJECT (layer)->ref_count);
|
||||
|
||||
changes_label = g_string_new ("");
|
||||
g_string_append_printf (changes_label,
|
||||
@ -161,9 +162,9 @@ dump_pipeline_cb (CoglNode *node, void *user_data)
|
||||
state->indent, "",
|
||||
pipeline_id,
|
||||
pipeline,
|
||||
COGL_OBJECT (pipeline)->ref_count,
|
||||
pipeline->has_static_breadcrumb ?
|
||||
G_OBJECT (pipeline)->ref_count,
|
||||
#ifdef COGL_DEBUG_ENABLED
|
||||
pipeline->has_static_breadcrumb ?
|
||||
pipeline->static_breadcrumb : "NULL"
|
||||
#else
|
||||
"NULL"
|
||||
|
@ -64,7 +64,7 @@ value_destroy_cb (void *value)
|
||||
{
|
||||
CoglPipelineHashTableEntry *entry = value;
|
||||
|
||||
cogl_object_unref (entry->parent.pipeline);
|
||||
g_object_unref (entry->parent.pipeline);
|
||||
|
||||
g_free (entry);
|
||||
}
|
||||
|
@ -43,8 +43,21 @@
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
typedef struct _CoglPipelineLayer CoglPipelineLayer;
|
||||
#define COGL_PIPELINE_LAYER(OBJECT) ((CoglPipelineLayer *)OBJECT)
|
||||
#define COGL_TYPE_PIPELINE_LAYER (cogl_pipeline_layer_get_type ())
|
||||
#define COGL_PIPELINE_LAYER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), COGL_TYPE_PIPELINE_LAYER, CoglPipelineLayer))
|
||||
#define COGL_PIPELINE_LAYER_CONST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), COGL_TYPE_PIPELINE_LAYER, CoglPipelineLayer const))
|
||||
#define COGL_PIPELINE_LAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), COGL_TYPE_PIPELINE_LAYER, CoglPipelineLayerClass))
|
||||
#define COGL_IS_PIPELINE_LAYER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), COGL_TYPE_PIPELINE_LAYER))
|
||||
#define COGL_IS_PIPELINE_LAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), COGL_TYPE_PIPELINE_LAYER))
|
||||
#define COGL_PIPELINE_LAYER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), COGL_TYPE_PIPELINE_LAYER, CoglPipelineLayerClass))
|
||||
|
||||
typedef struct _CoglPipelineLayerClass CoglPipelineLayerClass;
|
||||
typedef struct _CoglPipelineLayer CoglPipelineLayer;
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (CoglPipelineLayer, g_object_unref)
|
||||
|
||||
COGL_EXPORT
|
||||
GType cogl_pipeline_layer_get_type (void) G_GNUC_CONST;
|
||||
|
||||
/* XXX: should I rename these as
|
||||
* COGL_PIPELINE_LAYER_STATE_INDEX_XYZ... ?
|
||||
@ -206,7 +219,7 @@ struct _CoglPipelineLayer
|
||||
* the state relating to a given pipeline or layer may actually be
|
||||
* owned by one if is ancestors in the tree. We have a common data
|
||||
* type to track the tree hierarchy so we can share code... */
|
||||
CoglNode _parent;
|
||||
CoglNode parent_instance;
|
||||
|
||||
/* Some layers have a pipeline owner, which is to say that the layer
|
||||
* is referenced in that pipelines->layer_differences list. A layer
|
||||
@ -250,6 +263,12 @@ struct _CoglPipelineLayer
|
||||
|
||||
};
|
||||
|
||||
struct _CoglPipelineLayerClass
|
||||
{
|
||||
CoglNodeClass parent_class;
|
||||
};
|
||||
|
||||
|
||||
typedef gboolean
|
||||
(*CoglPipelineLayerStateComparator) (CoglPipelineLayer *authority0,
|
||||
CoglPipelineLayer *authority1);
|
||||
@ -330,12 +349,6 @@ _cogl_pipeline_layer_get_texture (CoglPipelineLayer *layer);
|
||||
CoglTexture *
|
||||
_cogl_pipeline_layer_get_texture_real (CoglPipelineLayer *layer);
|
||||
|
||||
CoglPipelineFilter
|
||||
_cogl_pipeline_layer_get_min_filter (CoglPipelineLayer *layer);
|
||||
|
||||
CoglPipelineFilter
|
||||
_cogl_pipeline_layer_get_mag_filter (CoglPipelineLayer *layer);
|
||||
|
||||
CoglPipelineWrapMode
|
||||
_cogl_pipeline_layer_get_wrap_mode_s (CoglPipelineLayer *layer);
|
||||
|
||||
|
@ -311,7 +311,7 @@ cogl_pipeline_set_layer_wrap_mode_s (CoglPipeline *pipeline,
|
||||
|
||||
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
||||
|
||||
g_return_if_fail (cogl_is_pipeline (pipeline));
|
||||
g_return_if_fail (COGL_IS_PIPELINE (pipeline));
|
||||
|
||||
/* Note: this will ensure that the layer exists, creating one if it
|
||||
* doesn't already.
|
||||
@ -351,7 +351,7 @@ cogl_pipeline_set_layer_wrap_mode_t (CoglPipeline *pipeline,
|
||||
|
||||
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
||||
|
||||
g_return_if_fail (cogl_is_pipeline (pipeline));
|
||||
g_return_if_fail (COGL_IS_PIPELINE (pipeline));
|
||||
|
||||
/* Note: this will ensure that the layer exists, creating one if it
|
||||
* doesn't already.
|
||||
@ -391,7 +391,7 @@ cogl_pipeline_set_layer_wrap_mode (CoglPipeline *pipeline,
|
||||
|
||||
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
||||
|
||||
g_return_if_fail (cogl_is_pipeline (pipeline));
|
||||
g_return_if_fail (COGL_IS_PIPELINE (pipeline));
|
||||
|
||||
/* Note: this will ensure that the layer exists, creating one if it
|
||||
* doesn't already.
|
||||
@ -424,7 +424,7 @@ _cogl_pipeline_layer_get_wrap_mode_s (CoglPipelineLayer *layer)
|
||||
CoglPipelineLayer *authority;
|
||||
const CoglSamplerCacheEntry *sampler_state;
|
||||
|
||||
g_return_val_if_fail (_cogl_is_pipeline_layer (layer), FALSE);
|
||||
g_return_val_if_fail (COGL_IS_PIPELINE_LAYER (layer), FALSE);
|
||||
|
||||
/* Now find the ancestor of the layer that is the authority for the
|
||||
* state we want to change */
|
||||
@ -439,7 +439,7 @@ cogl_pipeline_get_layer_wrap_mode_s (CoglPipeline *pipeline, int layer_index)
|
||||
{
|
||||
CoglPipelineLayer *layer;
|
||||
|
||||
g_return_val_if_fail (cogl_is_pipeline (pipeline), FALSE);
|
||||
g_return_val_if_fail (COGL_IS_PIPELINE (pipeline), FALSE);
|
||||
|
||||
/* Note: this will ensure that the layer exists, creating one if it
|
||||
* doesn't already.
|
||||
@ -461,7 +461,7 @@ _cogl_pipeline_layer_get_wrap_mode_t (CoglPipelineLayer *layer)
|
||||
CoglPipelineLayer *authority;
|
||||
const CoglSamplerCacheEntry *sampler_state;
|
||||
|
||||
g_return_val_if_fail (_cogl_is_pipeline_layer (layer), FALSE);
|
||||
g_return_val_if_fail (COGL_IS_PIPELINE_LAYER (layer), FALSE);
|
||||
|
||||
/* Now find the ancestor of the layer that is the authority for the
|
||||
* state we want to change */
|
||||
@ -476,7 +476,7 @@ cogl_pipeline_get_layer_wrap_mode_t (CoglPipeline *pipeline, int layer_index)
|
||||
{
|
||||
CoglPipelineLayer *layer;
|
||||
|
||||
g_return_val_if_fail (cogl_is_pipeline (pipeline), FALSE);
|
||||
g_return_val_if_fail (COGL_IS_PIPELINE (pipeline), FALSE);
|
||||
|
||||
/* Note: this will ensure that the layer exists, creating one if it
|
||||
* doesn't already.
|
||||
@ -517,7 +517,7 @@ cogl_pipeline_set_layer_point_sprite_coords_enabled (CoglPipeline *pipeline,
|
||||
|
||||
_COGL_GET_CONTEXT (ctx, FALSE);
|
||||
|
||||
g_return_val_if_fail (cogl_is_pipeline (pipeline), FALSE);
|
||||
g_return_val_if_fail (COGL_IS_PIPELINE (pipeline), FALSE);
|
||||
|
||||
/* Note: this will ensure that the layer exists, creating one if it
|
||||
* doesn't already.
|
||||
@ -587,7 +587,7 @@ cogl_pipeline_get_layer_point_sprite_coords_enabled (CoglPipeline *pipeline,
|
||||
CoglPipelineLayer *layer;
|
||||
CoglPipelineLayer *authority;
|
||||
|
||||
g_return_val_if_fail (cogl_is_pipeline (pipeline), FALSE);
|
||||
g_return_val_if_fail (COGL_IS_PIPELINE (pipeline), FALSE);
|
||||
|
||||
/* Note: this will ensure that the layer exists, creating one if it
|
||||
* doesn't already.
|
||||
@ -680,7 +680,7 @@ cogl_pipeline_add_layer_snippet (CoglPipeline *pipeline,
|
||||
int layer_index,
|
||||
CoglSnippet *snippet)
|
||||
{
|
||||
g_return_if_fail (cogl_is_pipeline (pipeline));
|
||||
g_return_if_fail (COGL_IS_PIPELINE (pipeline));
|
||||
g_return_if_fail (COGL_IS_SNIPPET (snippet));
|
||||
g_return_if_fail (snippet->hook >= COGL_SNIPPET_FIRST_LAYER_HOOK);
|
||||
|
||||
@ -921,7 +921,7 @@ cogl_pipeline_set_layer_combine (CoglPipeline *pipeline,
|
||||
CoglBlendStringStatement *a;
|
||||
int count;
|
||||
|
||||
g_return_val_if_fail (cogl_is_pipeline (pipeline), FALSE);
|
||||
g_return_val_if_fail (COGL_IS_PIPELINE (pipeline), FALSE);
|
||||
|
||||
/* Note: this will ensure that the layer exists, creating one if it
|
||||
* doesn't already.
|
||||
@ -1021,7 +1021,7 @@ cogl_pipeline_set_layer_combine_constant (CoglPipeline *pipeline,
|
||||
CoglPipelineLayer *new;
|
||||
float color_as_floats[4];
|
||||
|
||||
g_return_if_fail (cogl_is_pipeline (pipeline));
|
||||
g_return_if_fail (COGL_IS_PIPELINE (pipeline));
|
||||
|
||||
/* Note: this will ensure that the layer exists, creating one if it
|
||||
* doesn't already.
|
||||
@ -1104,7 +1104,7 @@ _cogl_pipeline_get_layer_combine_constant (CoglPipeline *pipeline,
|
||||
CoglPipelineLayer *layer;
|
||||
CoglPipelineLayer *authority;
|
||||
|
||||
g_return_if_fail (cogl_is_pipeline (pipeline));
|
||||
g_return_if_fail (COGL_IS_PIPELINE (pipeline));
|
||||
|
||||
/* Note: this will ensure that the layer exists, creating one if it
|
||||
* doesn't already.
|
||||
@ -1131,7 +1131,7 @@ _cogl_pipeline_get_layer_matrix (CoglPipeline *pipeline, int layer_index)
|
||||
CoglPipelineLayer *layer;
|
||||
CoglPipelineLayer *authority;
|
||||
|
||||
g_return_val_if_fail (cogl_is_pipeline (pipeline), NULL);
|
||||
g_return_val_if_fail (COGL_IS_PIPELINE (pipeline), NULL);
|
||||
|
||||
layer = _cogl_pipeline_get_layer (pipeline, layer_index);
|
||||
|
||||
@ -1149,7 +1149,7 @@ cogl_pipeline_set_layer_matrix (CoglPipeline *pipeline,
|
||||
CoglPipelineLayer *authority;
|
||||
CoglPipelineLayer *new;
|
||||
|
||||
g_return_if_fail (cogl_is_pipeline (pipeline));
|
||||
g_return_if_fail (COGL_IS_PIPELINE (pipeline));
|
||||
|
||||
/* Note: this will ensure that the layer exists, creating one if it
|
||||
* doesn't already.
|
||||
@ -1211,7 +1211,7 @@ cogl_pipeline_set_layer_matrix (CoglPipeline *pipeline,
|
||||
CoglTexture *
|
||||
_cogl_pipeline_layer_get_texture (CoglPipelineLayer *layer)
|
||||
{
|
||||
g_return_val_if_fail (_cogl_is_pipeline_layer (layer), NULL);
|
||||
g_return_val_if_fail (COGL_IS_PIPELINE_LAYER (layer), NULL);
|
||||
|
||||
return _cogl_pipeline_layer_get_texture_real (layer);
|
||||
}
|
||||
@ -1254,7 +1254,7 @@ cogl_pipeline_get_layer_filters (CoglPipeline *pipeline,
|
||||
{
|
||||
CoglPipelineLayer *layer;
|
||||
|
||||
g_return_if_fail (cogl_is_pipeline (pipeline));
|
||||
g_return_if_fail (COGL_IS_PIPELINE (pipeline));
|
||||
|
||||
layer = _cogl_pipeline_get_layer (pipeline, layer_index);
|
||||
return _cogl_pipeline_layer_get_filters (layer, min_filter, mag_filter);
|
||||
@ -1273,7 +1273,7 @@ cogl_pipeline_set_layer_filters (CoglPipeline *pipeline,
|
||||
|
||||
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
||||
|
||||
g_return_if_fail (cogl_is_pipeline (pipeline));
|
||||
g_return_if_fail (COGL_IS_PIPELINE (pipeline));
|
||||
|
||||
g_return_if_fail (mag_filter == COGL_PIPELINE_FILTER_NEAREST ||
|
||||
mag_filter == COGL_PIPELINE_FILTER_LINEAR);
|
||||
|
@ -47,15 +47,43 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
G_DEFINE_FINAL_TYPE (CoglPipelineLayer, cogl_pipeline_layer, COGL_TYPE_NODE)
|
||||
|
||||
static void
|
||||
_cogl_pipeline_layer_free (CoglPipelineLayer *layer);
|
||||
cogl_pipeline_layer_dispose (GObject *object)
|
||||
{
|
||||
CoglPipelineLayer *layer = COGL_PIPELINE_LAYER (object);
|
||||
|
||||
/* This type was made deprecated before the cogl_is_pipeline_layer
|
||||
function was ever exposed in the public headers so there's no need
|
||||
to make the cogl_is_pipeline_layer function public. We use INTERNAL
|
||||
so that the cogl_is_* function won't get defined */
|
||||
COGL_OBJECT_INTERNAL_DEFINE (PipelineLayer, pipeline_layer);
|
||||
_cogl_pipeline_node_unparent_real (COGL_NODE (layer));
|
||||
|
||||
if (layer->differences & COGL_PIPELINE_LAYER_STATE_TEXTURE_DATA &&
|
||||
layer->texture != NULL)
|
||||
g_object_unref (layer->texture);
|
||||
|
||||
if (layer->differences & COGL_PIPELINE_LAYER_STATE_VERTEX_SNIPPETS)
|
||||
_cogl_pipeline_snippet_list_free (&layer->big_state->vertex_snippets);
|
||||
|
||||
if (layer->differences & COGL_PIPELINE_LAYER_STATE_FRAGMENT_SNIPPETS)
|
||||
_cogl_pipeline_snippet_list_free (&layer->big_state->fragment_snippets);
|
||||
|
||||
if (layer->differences & COGL_PIPELINE_LAYER_STATE_NEEDS_BIG_STATE)
|
||||
g_free (layer->big_state);
|
||||
|
||||
G_OBJECT_CLASS (cogl_pipeline_layer_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
cogl_pipeline_layer_class_init (CoglPipelineLayerClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->dispose = cogl_pipeline_layer_dispose;
|
||||
}
|
||||
|
||||
static void
|
||||
cogl_pipeline_layer_init (CoglPipelineLayer *layer)
|
||||
{
|
||||
}
|
||||
|
||||
CoglPipelineLayer *
|
||||
_cogl_pipeline_layer_get_authority (CoglPipelineLayer *layer,
|
||||
@ -372,7 +400,7 @@ _cogl_pipeline_layer_pre_change_notify (CoglPipeline *required_owner,
|
||||
if (layer->owner == required_owner)
|
||||
_cogl_pipeline_remove_layer_difference (required_owner, layer, FALSE);
|
||||
_cogl_pipeline_add_layer_difference (required_owner, new, FALSE);
|
||||
cogl_object_unref (new);
|
||||
g_object_unref (new);
|
||||
layer = new;
|
||||
goto init_layer_state;
|
||||
}
|
||||
@ -449,9 +477,7 @@ _cogl_pipeline_layer_set_parent (CoglPipelineLayer *layer,
|
||||
CoglPipelineLayer *
|
||||
_cogl_pipeline_layer_copy (CoglPipelineLayer *src)
|
||||
{
|
||||
CoglPipelineLayer *layer = g_new0 (CoglPipelineLayer, 1);
|
||||
|
||||
_cogl_pipeline_node_init (COGL_NODE (layer));
|
||||
CoglPipelineLayer *layer = g_object_new (COGL_TYPE_PIPELINE_LAYER, NULL);
|
||||
|
||||
layer->owner = NULL;
|
||||
layer->index = src->index;
|
||||
@ -460,7 +486,7 @@ _cogl_pipeline_layer_copy (CoglPipelineLayer *src)
|
||||
|
||||
_cogl_pipeline_layer_set_parent (layer, src);
|
||||
|
||||
return _cogl_pipeline_layer_object_new (layer);
|
||||
return layer;
|
||||
}
|
||||
|
||||
/* XXX: This is duplicated logic; the same as for
|
||||
@ -688,39 +714,16 @@ _cogl_pipeline_layer_equal (CoglPipelineLayer *layer0,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
_cogl_pipeline_layer_free (CoglPipelineLayer *layer)
|
||||
{
|
||||
_cogl_pipeline_node_unparent_real (COGL_NODE (layer));
|
||||
|
||||
if (layer->differences & COGL_PIPELINE_LAYER_STATE_TEXTURE_DATA &&
|
||||
layer->texture != NULL)
|
||||
g_object_unref (layer->texture);
|
||||
|
||||
if (layer->differences & COGL_PIPELINE_LAYER_STATE_VERTEX_SNIPPETS)
|
||||
_cogl_pipeline_snippet_list_free (&layer->big_state->vertex_snippets);
|
||||
|
||||
if (layer->differences & COGL_PIPELINE_LAYER_STATE_FRAGMENT_SNIPPETS)
|
||||
_cogl_pipeline_snippet_list_free (&layer->big_state->fragment_snippets);
|
||||
|
||||
if (layer->differences & COGL_PIPELINE_LAYER_STATE_NEEDS_BIG_STATE)
|
||||
g_free (layer->big_state);
|
||||
|
||||
g_free (layer);
|
||||
}
|
||||
|
||||
void
|
||||
_cogl_pipeline_init_default_layers (void)
|
||||
{
|
||||
CoglPipelineLayer *layer = g_new0 (CoglPipelineLayer, 1);
|
||||
CoglPipelineLayer *layer = g_object_new (COGL_TYPE_PIPELINE_LAYER, NULL);
|
||||
CoglPipelineLayerBigState *big_state =
|
||||
g_new0 (CoglPipelineLayerBigState, 1);
|
||||
CoglPipelineLayer *new;
|
||||
|
||||
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
||||
|
||||
_cogl_pipeline_node_init (COGL_NODE (layer));
|
||||
|
||||
layer->index = 0;
|
||||
|
||||
layer->differences = COGL_PIPELINE_LAYER_STATE_ALL_SPARSE;
|
||||
@ -762,7 +765,7 @@ _cogl_pipeline_init_default_layers (void)
|
||||
|
||||
graphene_matrix_init_identity (&big_state->matrix);
|
||||
|
||||
ctx->default_layer_0 = _cogl_pipeline_layer_object_new (layer);
|
||||
ctx->default_layer_0 = layer;
|
||||
|
||||
/* TODO: we should make default_layer_n comprise of two
|
||||
* descendants of default_layer_0:
|
||||
|
@ -33,10 +33,10 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "cogl/cogl-debug.h"
|
||||
#include "cogl/cogl-node-private.h"
|
||||
#include "cogl/cogl-pipeline-layer-private.h"
|
||||
#include "cogl/cogl-pipeline.h"
|
||||
#include "cogl/cogl-object-private.h"
|
||||
#include "cogl/cogl-profile.h"
|
||||
#include "cogl/cogl-list.h"
|
||||
#include "cogl/cogl-boxed-value.h"
|
||||
@ -269,7 +269,7 @@ struct _CoglPipeline
|
||||
* the state relating to a given pipeline or layer may actually be
|
||||
* owned by one if is ancestors in the tree. We have a common data
|
||||
* type to track the tree hierarchy so we can share code... */
|
||||
CoglNode _parent;
|
||||
CoglNode parent_instance;
|
||||
|
||||
/* When weak pipelines are destroyed the user is notified via this
|
||||
* callback */
|
||||
@ -373,6 +373,11 @@ struct _CoglPipeline
|
||||
#endif
|
||||
};
|
||||
|
||||
struct _CoglPipelineClass
|
||||
{
|
||||
CoglNodeClass parent_class;
|
||||
};
|
||||
|
||||
typedef struct _CoglPipelineFragend
|
||||
{
|
||||
void (*start) (CoglPipeline *pipeline,
|
||||
@ -488,9 +493,6 @@ _cogl_pipeline_get_layer_with_flags (CoglPipeline *pipeline,
|
||||
#define _cogl_pipeline_get_layer(p, l) \
|
||||
_cogl_pipeline_get_layer_with_flags (p, l, 0)
|
||||
|
||||
gboolean
|
||||
_cogl_is_pipeline_layer (void *object);
|
||||
|
||||
void
|
||||
_cogl_pipeline_prune_empty_layer_difference (CoglPipeline *layers_authority,
|
||||
CoglPipelineLayer *layer);
|
||||
@ -623,7 +625,7 @@ _cogl_get_n_args_for_combine_func (CoglPipelineCombineFunc func);
|
||||
* This is the recommended coding pattern for validating an input
|
||||
* pipeline and caching a derived result:
|
||||
* |[
|
||||
* static CoglUserDataKey _cogl_my_cache_key;
|
||||
* static GQuark _cogl_my_cache_key = 0;
|
||||
*
|
||||
* typedef struct {
|
||||
* CoglPipeline *validated_source;
|
||||
@ -639,22 +641,24 @@ _cogl_get_n_args_for_combine_func (CoglPipelineCombineFunc func);
|
||||
* invalidate_cache_cb (CoglPipeline *destroyed, void *user_data)
|
||||
* {
|
||||
* MyValidatedMaterialCache *cache = user_data;
|
||||
* cogl_object_unref (cache->validated_source);
|
||||
* g_object_unref (cache->validated_source);
|
||||
* cache->validated_source = NULL;
|
||||
* }
|
||||
*
|
||||
* static CoglPipeline *
|
||||
* get_validated_pipeline (CoglPipeline *source)
|
||||
* {
|
||||
* _cogl_my_cache_key = g_quark_from_static_string ("my-cache-key");
|
||||
* MyValidatedMaterialCache *cache =
|
||||
* cogl_object_get_user_data (COGL_OBJECT (source),
|
||||
* &_cogl_my_cache_key);
|
||||
* g_object_get_qdata (G_OBJECT (source),
|
||||
* _cogl_my_cache_key);
|
||||
* if (G_UNLIKELY (cache == NULL))
|
||||
* {
|
||||
* cache = g_new0 (MyValidatedMaterialCache, 1);
|
||||
* cogl_object_set_user_data (COGL_OBJECT (source),
|
||||
* &_cogl_my_cache_key,
|
||||
* cache, destroy_cache_cb);
|
||||
*
|
||||
* g_object_set_qdata_full (G_OBJECT (source),
|
||||
* _cogl_my_cache_key,
|
||||
* cache, destroy_cache_cb);
|
||||
* cache->validated_source = source;
|
||||
* }
|
||||
*
|
||||
|
@ -320,7 +320,7 @@ cogl_pipeline_get_color (CoglPipeline *pipeline,
|
||||
{
|
||||
CoglPipeline *authority;
|
||||
|
||||
g_return_if_fail (cogl_is_pipeline (pipeline));
|
||||
g_return_if_fail (COGL_IS_PIPELINE (pipeline));
|
||||
|
||||
authority =
|
||||
_cogl_pipeline_get_authority (pipeline, COGL_PIPELINE_STATE_COLOR);
|
||||
@ -346,7 +346,7 @@ cogl_pipeline_set_color (CoglPipeline *pipeline,
|
||||
CoglPipelineState state = COGL_PIPELINE_STATE_COLOR;
|
||||
CoglPipeline *authority;
|
||||
|
||||
g_return_if_fail (cogl_is_pipeline (pipeline));
|
||||
g_return_if_fail (COGL_IS_PIPELINE (pipeline));
|
||||
|
||||
authority = _cogl_pipeline_get_authority (pipeline, state);
|
||||
|
||||
@ -400,7 +400,7 @@ _cogl_pipeline_set_alpha_test_function (CoglPipeline *pipeline,
|
||||
CoglPipeline *authority;
|
||||
CoglPipelineAlphaFuncState *alpha_state;
|
||||
|
||||
g_return_if_fail (cogl_is_pipeline (pipeline));
|
||||
g_return_if_fail (COGL_IS_PIPELINE (pipeline));
|
||||
|
||||
authority = _cogl_pipeline_get_authority (pipeline, state);
|
||||
|
||||
@ -430,7 +430,7 @@ _cogl_pipeline_set_alpha_test_function_reference (CoglPipeline *pipeline,
|
||||
CoglPipeline *authority;
|
||||
CoglPipelineAlphaFuncState *alpha_state;
|
||||
|
||||
g_return_if_fail (cogl_is_pipeline (pipeline));
|
||||
g_return_if_fail (COGL_IS_PIPELINE (pipeline));
|
||||
|
||||
authority = _cogl_pipeline_get_authority (pipeline, state);
|
||||
|
||||
@ -467,7 +467,7 @@ cogl_pipeline_get_alpha_test_function (CoglPipeline *pipeline)
|
||||
{
|
||||
CoglPipeline *authority;
|
||||
|
||||
g_return_val_if_fail (cogl_is_pipeline (pipeline), 0);
|
||||
g_return_val_if_fail (COGL_IS_PIPELINE (pipeline), 0);
|
||||
|
||||
authority =
|
||||
_cogl_pipeline_get_authority (pipeline, COGL_PIPELINE_STATE_ALPHA_FUNC);
|
||||
@ -480,7 +480,7 @@ cogl_pipeline_get_alpha_test_reference (CoglPipeline *pipeline)
|
||||
{
|
||||
CoglPipeline *authority;
|
||||
|
||||
g_return_val_if_fail (cogl_is_pipeline (pipeline), 0.0f);
|
||||
g_return_val_if_fail (COGL_IS_PIPELINE (pipeline), 0.0f);
|
||||
|
||||
authority =
|
||||
_cogl_pipeline_get_authority (pipeline,
|
||||
@ -593,7 +593,7 @@ cogl_pipeline_set_blend (CoglPipeline *pipeline,
|
||||
|
||||
_COGL_GET_CONTEXT (ctx, FALSE);
|
||||
|
||||
g_return_val_if_fail (cogl_is_pipeline (pipeline), FALSE);
|
||||
g_return_val_if_fail (COGL_IS_PIPELINE (pipeline), FALSE);
|
||||
|
||||
count =
|
||||
_cogl_blend_string_compile (blend_description,
|
||||
@ -670,7 +670,7 @@ cogl_pipeline_set_blend_constant (CoglPipeline *pipeline,
|
||||
|
||||
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
||||
|
||||
g_return_if_fail (cogl_is_pipeline (pipeline));
|
||||
g_return_if_fail (COGL_IS_PIPELINE (pipeline));
|
||||
|
||||
authority = _cogl_pipeline_get_authority (pipeline, state);
|
||||
|
||||
@ -699,7 +699,7 @@ cogl_pipeline_get_user_program (CoglPipeline *pipeline)
|
||||
{
|
||||
CoglPipeline *authority;
|
||||
|
||||
g_return_val_if_fail (cogl_is_pipeline (pipeline), NULL);
|
||||
g_return_val_if_fail (COGL_IS_PIPELINE (pipeline), NULL);
|
||||
|
||||
authority =
|
||||
_cogl_pipeline_get_authority (pipeline, COGL_PIPELINE_STATE_USER_SHADER);
|
||||
@ -720,7 +720,7 @@ cogl_pipeline_set_user_program (CoglPipeline *pipeline,
|
||||
CoglPipelineState state = COGL_PIPELINE_STATE_USER_SHADER;
|
||||
CoglPipeline *authority;
|
||||
|
||||
g_return_if_fail (cogl_is_pipeline (pipeline));
|
||||
g_return_if_fail (COGL_IS_PIPELINE (pipeline));
|
||||
|
||||
authority = _cogl_pipeline_get_authority (pipeline, state);
|
||||
|
||||
@ -777,7 +777,7 @@ cogl_pipeline_set_depth_state (CoglPipeline *pipeline,
|
||||
|
||||
_COGL_GET_CONTEXT (ctx, FALSE);
|
||||
|
||||
g_return_val_if_fail (cogl_is_pipeline (pipeline), FALSE);
|
||||
g_return_val_if_fail (COGL_IS_PIPELINE (pipeline), FALSE);
|
||||
g_return_val_if_fail (depth_state->magic == COGL_DEPTH_STATE_MAGIC, FALSE);
|
||||
|
||||
authority = _cogl_pipeline_get_authority (pipeline, state);
|
||||
@ -811,7 +811,7 @@ cogl_pipeline_get_depth_state (CoglPipeline *pipeline,
|
||||
{
|
||||
CoglPipeline *authority;
|
||||
|
||||
g_return_if_fail (cogl_is_pipeline (pipeline));
|
||||
g_return_if_fail (COGL_IS_PIPELINE (pipeline));
|
||||
|
||||
authority =
|
||||
_cogl_pipeline_get_authority (pipeline, COGL_PIPELINE_STATE_DEPTH);
|
||||
@ -826,7 +826,7 @@ cogl_pipeline_set_cull_face_mode (CoglPipeline *pipeline,
|
||||
CoglPipeline *authority;
|
||||
CoglPipelineCullFaceState *cull_face_state;
|
||||
|
||||
g_return_if_fail (cogl_is_pipeline (pipeline));
|
||||
g_return_if_fail (COGL_IS_PIPELINE (pipeline));
|
||||
|
||||
authority = _cogl_pipeline_get_authority (pipeline, state);
|
||||
|
||||
@ -856,7 +856,7 @@ cogl_pipeline_set_front_face_winding (CoglPipeline *pipeline,
|
||||
CoglPipeline *authority;
|
||||
CoglPipelineCullFaceState *cull_face_state;
|
||||
|
||||
g_return_if_fail (cogl_is_pipeline (pipeline));
|
||||
g_return_if_fail (COGL_IS_PIPELINE (pipeline));
|
||||
|
||||
authority = _cogl_pipeline_get_authority (pipeline, state);
|
||||
|
||||
@ -884,7 +884,7 @@ cogl_pipeline_get_cull_face_mode (CoglPipeline *pipeline)
|
||||
CoglPipelineState state = COGL_PIPELINE_STATE_CULL_FACE;
|
||||
CoglPipeline *authority;
|
||||
|
||||
g_return_val_if_fail (cogl_is_pipeline (pipeline),
|
||||
g_return_val_if_fail (COGL_IS_PIPELINE (pipeline),
|
||||
COGL_PIPELINE_CULL_FACE_MODE_NONE);
|
||||
|
||||
authority = _cogl_pipeline_get_authority (pipeline, state);
|
||||
@ -898,7 +898,7 @@ cogl_pipeline_get_front_face_winding (CoglPipeline *pipeline)
|
||||
CoglPipelineState state = COGL_PIPELINE_STATE_CULL_FACE;
|
||||
CoglPipeline *authority;
|
||||
|
||||
g_return_val_if_fail (cogl_is_pipeline (pipeline),
|
||||
g_return_val_if_fail (COGL_IS_PIPELINE (pipeline),
|
||||
COGL_WINDING_CLOCKWISE);
|
||||
|
||||
authority = _cogl_pipeline_get_authority (pipeline, state);
|
||||
@ -911,7 +911,7 @@ cogl_pipeline_get_point_size (CoglPipeline *pipeline)
|
||||
{
|
||||
CoglPipeline *authority;
|
||||
|
||||
g_return_val_if_fail (cogl_is_pipeline (pipeline), FALSE);
|
||||
g_return_val_if_fail (COGL_IS_PIPELINE (pipeline), FALSE);
|
||||
|
||||
authority =
|
||||
_cogl_pipeline_get_authority (pipeline, COGL_PIPELINE_STATE_POINT_SIZE);
|
||||
@ -926,7 +926,7 @@ _cogl_pipeline_set_non_zero_point_size (CoglPipeline *pipeline,
|
||||
CoglPipelineState state = COGL_PIPELINE_STATE_NON_ZERO_POINT_SIZE;
|
||||
CoglPipeline *authority;
|
||||
|
||||
g_return_if_fail (cogl_is_pipeline (pipeline));
|
||||
g_return_if_fail (COGL_IS_PIPELINE (pipeline));
|
||||
|
||||
authority = _cogl_pipeline_get_authority (pipeline, state);
|
||||
|
||||
@ -950,7 +950,7 @@ cogl_pipeline_set_point_size (CoglPipeline *pipeline,
|
||||
CoglPipelineState state = COGL_PIPELINE_STATE_POINT_SIZE;
|
||||
CoglPipeline *authority;
|
||||
|
||||
g_return_if_fail (cogl_is_pipeline (pipeline));
|
||||
g_return_if_fail (COGL_IS_PIPELINE (pipeline));
|
||||
|
||||
authority = _cogl_pipeline_get_authority (pipeline, state);
|
||||
|
||||
@ -985,7 +985,7 @@ cogl_pipeline_set_per_vertex_point_size (CoglPipeline *pipeline,
|
||||
CoglPipeline *authority;
|
||||
|
||||
_COGL_GET_CONTEXT (ctx, FALSE);
|
||||
g_return_val_if_fail (cogl_is_pipeline (pipeline), FALSE);
|
||||
g_return_val_if_fail (COGL_IS_PIPELINE (pipeline), FALSE);
|
||||
|
||||
authority = _cogl_pipeline_get_authority (pipeline, state);
|
||||
|
||||
@ -1014,7 +1014,7 @@ cogl_pipeline_get_per_vertex_point_size (CoglPipeline *pipeline)
|
||||
{
|
||||
CoglPipeline *authority;
|
||||
|
||||
g_return_val_if_fail (cogl_is_pipeline (pipeline), FALSE);
|
||||
g_return_val_if_fail (COGL_IS_PIPELINE (pipeline), FALSE);
|
||||
|
||||
authority =
|
||||
_cogl_pipeline_get_authority (pipeline,
|
||||
@ -1033,7 +1033,7 @@ _cogl_pipeline_override_uniform (CoglPipeline *pipeline,
|
||||
|
||||
_COGL_GET_CONTEXT (ctx, NULL);
|
||||
|
||||
g_return_val_if_fail (cogl_is_pipeline (pipeline), NULL);
|
||||
g_return_val_if_fail (COGL_IS_PIPELINE (pipeline), NULL);
|
||||
g_return_val_if_fail (location >= 0, NULL);
|
||||
g_return_val_if_fail (location < ctx->n_uniform_names, NULL);
|
||||
|
||||
@ -1204,7 +1204,7 @@ void
|
||||
cogl_pipeline_add_snippet (CoglPipeline *pipeline,
|
||||
CoglSnippet *snippet)
|
||||
{
|
||||
g_return_if_fail (cogl_is_pipeline (pipeline));
|
||||
g_return_if_fail (COGL_IS_PIPELINE (pipeline));
|
||||
g_return_if_fail (COGL_IS_SNIPPET (snippet));
|
||||
g_return_if_fail (snippet->hook < COGL_SNIPPET_FIRST_LAYER_HOOK);
|
||||
|
||||
|
@ -35,8 +35,6 @@
|
||||
|
||||
#include "cogl/cogl-debug.h"
|
||||
#include "cogl/cogl-context-private.h"
|
||||
#include "cogl/cogl-object.h"
|
||||
|
||||
#include "cogl/cogl-pipeline-private.h"
|
||||
#include "cogl/cogl-pipeline-state-private.h"
|
||||
#include "cogl/cogl-pipeline-layer-state-private.h"
|
||||
@ -48,13 +46,11 @@
|
||||
#include "cogl/cogl-profile.h"
|
||||
#include "cogl/cogl-depth-state-private.h"
|
||||
#include "cogl/cogl1-context.h"
|
||||
#include "cogl/cogl-gtype-private.h"
|
||||
|
||||
#include <glib.h>
|
||||
#include <glib/gprintf.h>
|
||||
#include <string.h>
|
||||
|
||||
static void _cogl_pipeline_free (CoglPipeline *tex);
|
||||
static void recursively_free_layer_caches (CoglPipeline *pipeline);
|
||||
static gboolean _cogl_pipeline_is_weak (CoglPipeline *pipeline);
|
||||
|
||||
@ -66,8 +62,113 @@ const CoglPipelineProgend *_cogl_pipeline_progend;
|
||||
#include "cogl/driver/gl/cogl-pipeline-vertend-glsl-private.h"
|
||||
#include "cogl/driver/gl/cogl-pipeline-progend-glsl-private.h"
|
||||
|
||||
COGL_OBJECT_DEFINE (Pipeline, pipeline);
|
||||
COGL_GTYPE_DEFINE_CLASS (Pipeline, pipeline);
|
||||
G_DEFINE_FINAL_TYPE (CoglPipeline, cogl_pipeline, COGL_TYPE_NODE)
|
||||
|
||||
static void
|
||||
_cogl_pipeline_revert_weak_ancestors (CoglPipeline *strong)
|
||||
{
|
||||
CoglNode *n;
|
||||
|
||||
g_return_if_fail (!strong->is_weak);
|
||||
|
||||
/* This reverts the effect of calling
|
||||
_cogl_pipeline_promote_weak_ancestors */
|
||||
|
||||
if (COGL_NODE (strong)->parent == NULL)
|
||||
return;
|
||||
|
||||
for (n = COGL_NODE (strong)->parent;
|
||||
/* We can assume that all weak pipelines have a parent */
|
||||
COGL_PIPELINE (n)->is_weak;
|
||||
n = n->parent)
|
||||
/* 'n' is weak so we unref its parent */
|
||||
g_object_unref (n->parent);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
destroy_weak_children_cb (CoglNode *node,
|
||||
void *user_data)
|
||||
{
|
||||
CoglPipeline *pipeline = COGL_PIPELINE (node);
|
||||
|
||||
if (_cogl_pipeline_is_weak (pipeline))
|
||||
{
|
||||
_cogl_pipeline_node_foreach_child (COGL_NODE (pipeline),
|
||||
destroy_weak_children_cb,
|
||||
NULL);
|
||||
|
||||
pipeline->destroy_callback (pipeline, pipeline->destroy_data);
|
||||
_cogl_pipeline_node_unparent_real (COGL_NODE (pipeline));
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
cogl_pipeline_dispose (GObject *object)
|
||||
{
|
||||
CoglPipeline *pipeline = COGL_PIPELINE (object);
|
||||
|
||||
if (!pipeline->is_weak)
|
||||
_cogl_pipeline_revert_weak_ancestors (pipeline);
|
||||
|
||||
/* Weak pipelines don't take a reference on their parent */
|
||||
_cogl_pipeline_node_foreach_child (COGL_NODE (pipeline),
|
||||
destroy_weak_children_cb,
|
||||
NULL);
|
||||
|
||||
g_assert (_cogl_list_empty (&COGL_NODE (pipeline)->children));
|
||||
|
||||
_cogl_pipeline_node_unparent_real (COGL_NODE (pipeline));
|
||||
|
||||
if (pipeline->differences & COGL_PIPELINE_STATE_USER_SHADER &&
|
||||
pipeline->big_state->user_program)
|
||||
g_object_unref (pipeline->big_state->user_program);
|
||||
|
||||
if (pipeline->differences & COGL_PIPELINE_STATE_UNIFORMS)
|
||||
{
|
||||
CoglPipelineUniformsState *uniforms_state
|
||||
= &pipeline->big_state->uniforms_state;
|
||||
int n_overrides = _cogl_bitmask_popcount (&uniforms_state->override_mask);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < n_overrides; i++)
|
||||
_cogl_boxed_value_destroy (uniforms_state->override_values + i);
|
||||
g_free (uniforms_state->override_values);
|
||||
|
||||
_cogl_bitmask_destroy (&uniforms_state->override_mask);
|
||||
_cogl_bitmask_destroy (&uniforms_state->changed_mask);
|
||||
}
|
||||
|
||||
if (pipeline->differences & COGL_PIPELINE_STATE_LAYERS)
|
||||
g_list_free_full (pipeline->layer_differences, g_object_unref);
|
||||
|
||||
if (pipeline->differences & COGL_PIPELINE_STATE_VERTEX_SNIPPETS)
|
||||
_cogl_pipeline_snippet_list_free (&pipeline->big_state->vertex_snippets);
|
||||
|
||||
if (pipeline->differences & COGL_PIPELINE_STATE_FRAGMENT_SNIPPETS)
|
||||
_cogl_pipeline_snippet_list_free (&pipeline->big_state->fragment_snippets);
|
||||
|
||||
if (pipeline->differences & COGL_PIPELINE_STATE_NEEDS_BIG_STATE)
|
||||
g_free (pipeline->big_state);
|
||||
|
||||
recursively_free_layer_caches (pipeline);
|
||||
|
||||
G_OBJECT_CLASS (cogl_pipeline_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
cogl_pipeline_class_init (CoglPipelineClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->dispose = cogl_pipeline_dispose;
|
||||
}
|
||||
|
||||
static void
|
||||
cogl_pipeline_init (CoglPipeline *pipeline)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* This initializes the first pipeline owned by the Cogl context. All
|
||||
@ -80,7 +181,7 @@ void
|
||||
_cogl_pipeline_init_default_pipeline (void)
|
||||
{
|
||||
/* Create new - blank - pipeline */
|
||||
CoglPipeline *pipeline = g_new0 (CoglPipeline, 1);
|
||||
CoglPipeline *pipeline = g_object_new (COGL_TYPE_PIPELINE, NULL);
|
||||
/* XXX: NB: It's important that we zero this to avoid polluting
|
||||
* pipeline hash values with un-initialized data */
|
||||
CoglPipelineBigState *big_state = g_new0 (CoglPipelineBigState, 1);
|
||||
@ -96,8 +197,6 @@ _cogl_pipeline_init_default_pipeline (void)
|
||||
_cogl_pipeline_progend = &_cogl_pipeline_glsl_progend;
|
||||
_cogl_pipeline_vertend = &_cogl_pipeline_glsl_vertend;
|
||||
|
||||
_cogl_pipeline_node_init (COGL_NODE (pipeline));
|
||||
|
||||
pipeline->is_weak = FALSE;
|
||||
pipeline->journal_ref_count = 0;
|
||||
pipeline->differences = COGL_PIPELINE_STATE_ALL_SPARSE;
|
||||
@ -109,9 +208,10 @@ _cogl_pipeline_init_default_pipeline (void)
|
||||
|
||||
pipeline->big_state = big_state;
|
||||
pipeline->has_big_state = TRUE;
|
||||
|
||||
#ifdef COGL_DEBUG_ENABLED
|
||||
pipeline->static_breadcrumb = "default pipeline";
|
||||
pipeline->has_static_breadcrumb = TRUE;
|
||||
#endif
|
||||
|
||||
pipeline->age = 0;
|
||||
|
||||
@ -145,7 +245,7 @@ _cogl_pipeline_init_default_pipeline (void)
|
||||
_cogl_bitmask_init (&uniforms_state->changed_mask);
|
||||
uniforms_state->override_values = NULL;
|
||||
|
||||
ctx->default_pipeline = _cogl_pipeline_object_new (pipeline);
|
||||
ctx->default_pipeline = pipeline;
|
||||
}
|
||||
|
||||
|
||||
@ -215,28 +315,7 @@ _cogl_pipeline_promote_weak_ancestors (CoglPipeline *strong)
|
||||
COGL_PIPELINE (n)->is_weak;
|
||||
n = n->parent)
|
||||
/* 'n' is weak so we take a reference on its parent */
|
||||
cogl_object_ref (n->parent);
|
||||
}
|
||||
|
||||
static void
|
||||
_cogl_pipeline_revert_weak_ancestors (CoglPipeline *strong)
|
||||
{
|
||||
CoglNode *n;
|
||||
|
||||
g_return_if_fail (!strong->is_weak);
|
||||
|
||||
/* This reverts the effect of calling
|
||||
_cogl_pipeline_promote_weak_ancestors */
|
||||
|
||||
if (COGL_NODE (strong)->parent == NULL)
|
||||
return;
|
||||
|
||||
for (n = COGL_NODE (strong)->parent;
|
||||
/* We can assume that all weak pipelines have a parent */
|
||||
COGL_PIPELINE (n)->is_weak;
|
||||
n = n->parent)
|
||||
/* 'n' is weak so we unref its parent */
|
||||
cogl_object_unref (n->parent);
|
||||
g_object_ref (n->parent);
|
||||
}
|
||||
|
||||
/* XXX: Always have an eye out for opportunities to lower the cost of
|
||||
@ -244,9 +323,7 @@ _cogl_pipeline_revert_weak_ancestors (CoglPipeline *strong)
|
||||
static CoglPipeline *
|
||||
_cogl_pipeline_copy (CoglPipeline *src, gboolean is_weak)
|
||||
{
|
||||
CoglPipeline *pipeline = g_new0 (CoglPipeline, 1);
|
||||
|
||||
_cogl_pipeline_node_init (COGL_NODE (pipeline));
|
||||
CoglPipeline *pipeline = g_object_new (COGL_TYPE_PIPELINE, NULL);
|
||||
|
||||
pipeline->is_weak = is_weak;
|
||||
|
||||
@ -271,7 +348,9 @@ _cogl_pipeline_copy (CoglPipeline *src, gboolean is_weak)
|
||||
|
||||
pipeline->layers_cache_dirty = TRUE;
|
||||
|
||||
#ifdef COGL_DEBUG_ENABLED
|
||||
pipeline->has_static_breadcrumb = FALSE;
|
||||
#endif
|
||||
|
||||
pipeline->age = 0;
|
||||
|
||||
@ -283,7 +362,7 @@ _cogl_pipeline_copy (CoglPipeline *src, gboolean is_weak)
|
||||
if (!is_weak)
|
||||
_cogl_pipeline_promote_weak_ancestors (pipeline);
|
||||
|
||||
return _cogl_pipeline_object_new (pipeline);
|
||||
return pipeline;
|
||||
}
|
||||
|
||||
CoglPipeline *
|
||||
@ -320,80 +399,10 @@ cogl_pipeline_new (CoglContext *context)
|
||||
return new;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
destroy_weak_children_cb (CoglNode *node,
|
||||
void *user_data)
|
||||
{
|
||||
CoglPipeline *pipeline = COGL_PIPELINE (node);
|
||||
|
||||
if (_cogl_pipeline_is_weak (pipeline))
|
||||
{
|
||||
_cogl_pipeline_node_foreach_child (COGL_NODE (pipeline),
|
||||
destroy_weak_children_cb,
|
||||
NULL);
|
||||
|
||||
pipeline->destroy_callback (pipeline, pipeline->destroy_data);
|
||||
_cogl_pipeline_node_unparent_real (COGL_NODE (pipeline));
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
_cogl_pipeline_free (CoglPipeline *pipeline)
|
||||
{
|
||||
if (!pipeline->is_weak)
|
||||
_cogl_pipeline_revert_weak_ancestors (pipeline);
|
||||
|
||||
/* Weak pipelines don't take a reference on their parent */
|
||||
_cogl_pipeline_node_foreach_child (COGL_NODE (pipeline),
|
||||
destroy_weak_children_cb,
|
||||
NULL);
|
||||
|
||||
g_assert (_cogl_list_empty (&COGL_NODE (pipeline)->children));
|
||||
|
||||
_cogl_pipeline_node_unparent_real (COGL_NODE (pipeline));
|
||||
|
||||
if (pipeline->differences & COGL_PIPELINE_STATE_USER_SHADER &&
|
||||
pipeline->big_state->user_program)
|
||||
g_object_unref (pipeline->big_state->user_program);
|
||||
|
||||
if (pipeline->differences & COGL_PIPELINE_STATE_UNIFORMS)
|
||||
{
|
||||
CoglPipelineUniformsState *uniforms_state
|
||||
= &pipeline->big_state->uniforms_state;
|
||||
int n_overrides = _cogl_bitmask_popcount (&uniforms_state->override_mask);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < n_overrides; i++)
|
||||
_cogl_boxed_value_destroy (uniforms_state->override_values + i);
|
||||
g_free (uniforms_state->override_values);
|
||||
|
||||
_cogl_bitmask_destroy (&uniforms_state->override_mask);
|
||||
_cogl_bitmask_destroy (&uniforms_state->changed_mask);
|
||||
}
|
||||
|
||||
if (pipeline->differences & COGL_PIPELINE_STATE_LAYERS)
|
||||
g_list_free_full (pipeline->layer_differences, cogl_object_unref);
|
||||
|
||||
if (pipeline->differences & COGL_PIPELINE_STATE_VERTEX_SNIPPETS)
|
||||
_cogl_pipeline_snippet_list_free (&pipeline->big_state->vertex_snippets);
|
||||
|
||||
if (pipeline->differences & COGL_PIPELINE_STATE_FRAGMENT_SNIPPETS)
|
||||
_cogl_pipeline_snippet_list_free (&pipeline->big_state->fragment_snippets);
|
||||
|
||||
if (pipeline->differences & COGL_PIPELINE_STATE_NEEDS_BIG_STATE)
|
||||
g_free (pipeline->big_state);
|
||||
|
||||
recursively_free_layer_caches (pipeline);
|
||||
|
||||
g_free (pipeline);
|
||||
}
|
||||
|
||||
gboolean
|
||||
_cogl_pipeline_get_real_blend_enabled (CoglPipeline *pipeline)
|
||||
{
|
||||
g_return_val_if_fail (cogl_is_pipeline (pipeline), FALSE);
|
||||
g_return_val_if_fail (COGL_IS_PIPELINE (pipeline), FALSE);
|
||||
|
||||
return pipeline->real_blend_enable;
|
||||
}
|
||||
@ -805,7 +814,7 @@ _cogl_pipeline_copy_differences (CoglPipeline *dest,
|
||||
|
||||
if (dest->differences & COGL_PIPELINE_STATE_LAYERS &&
|
||||
dest->layer_differences)
|
||||
g_list_free_full (dest->layer_differences, cogl_object_unref);
|
||||
g_list_free_full (dest->layer_differences, g_object_unref);
|
||||
|
||||
for (l = src->layer_differences; l; l = l->next)
|
||||
{
|
||||
@ -815,7 +824,7 @@ _cogl_pipeline_copy_differences (CoglPipeline *dest,
|
||||
* originals instead. */
|
||||
CoglPipelineLayer *copy = _cogl_pipeline_layer_copy (l->data);
|
||||
_cogl_pipeline_add_layer_difference (dest, copy, FALSE);
|
||||
cogl_object_unref (copy);
|
||||
g_object_unref (copy);
|
||||
}
|
||||
|
||||
/* Note: we initialize n_layers after adding the layer differences
|
||||
@ -1198,7 +1207,7 @@ _cogl_pipeline_pre_change_notify (CoglPipeline *pipeline,
|
||||
|
||||
/* The children will keep the new authority alive so drop the
|
||||
* reference we got when copying... */
|
||||
cogl_object_unref (new_authority);
|
||||
g_object_unref (new_authority);
|
||||
}
|
||||
|
||||
/* At this point we know we have a pipeline with no strong
|
||||
@ -1259,7 +1268,7 @@ _cogl_pipeline_add_layer_difference (CoglPipeline *pipeline,
|
||||
g_return_if_fail (layer->owner == NULL);
|
||||
|
||||
layer->owner = pipeline;
|
||||
cogl_object_ref (layer);
|
||||
g_object_ref (layer);
|
||||
|
||||
/* - Flush journal primitives referencing the current state.
|
||||
* - Make sure the pipeline has no dependants so it may be modified.
|
||||
@ -1320,7 +1329,7 @@ _cogl_pipeline_remove_layer_difference (CoglPipeline *pipeline,
|
||||
if (layer->owner == pipeline)
|
||||
{
|
||||
layer->owner = NULL;
|
||||
cogl_object_unref (layer);
|
||||
g_object_unref (layer);
|
||||
|
||||
pipeline->layer_differences =
|
||||
g_list_remove (pipeline->layer_differences, layer);
|
||||
@ -1636,7 +1645,7 @@ _cogl_pipeline_get_layer_with_flags (CoglPipeline *pipeline,
|
||||
|
||||
_cogl_pipeline_add_layer_difference (pipeline, layer, TRUE);
|
||||
|
||||
cogl_object_unref (layer);
|
||||
g_object_unref (layer);
|
||||
|
||||
return layer;
|
||||
}
|
||||
@ -1662,10 +1671,10 @@ _cogl_pipeline_prune_empty_layer_difference (CoglPipeline *layers_authority,
|
||||
if (layer_parent->index == layer->index && layer_parent->owner == NULL &&
|
||||
_cogl_pipeline_layer_get_parent (layer_parent) != NULL)
|
||||
{
|
||||
cogl_object_ref (layer_parent);
|
||||
g_object_ref (layer_parent);
|
||||
layer_parent->owner = layers_authority;
|
||||
link->data = layer_parent;
|
||||
cogl_object_unref (layer);
|
||||
g_object_unref (layer);
|
||||
recursively_free_layer_caches (layers_authority);
|
||||
return;
|
||||
}
|
||||
@ -2224,7 +2233,7 @@ _cogl_pipeline_update_authority (CoglPipeline *pipeline,
|
||||
unsigned long
|
||||
_cogl_pipeline_get_age (CoglPipeline *pipeline)
|
||||
{
|
||||
g_return_val_if_fail (cogl_is_pipeline (pipeline), 0);
|
||||
g_return_val_if_fail (COGL_IS_PIPELINE (pipeline), 0);
|
||||
|
||||
return pipeline->age;
|
||||
}
|
||||
@ -2236,7 +2245,7 @@ cogl_pipeline_remove_layer (CoglPipeline *pipeline, int layer_index)
|
||||
CoglPipelineLayerInfo layer_info;
|
||||
int i;
|
||||
|
||||
g_return_if_fail (cogl_is_pipeline (pipeline));
|
||||
g_return_if_fail (COGL_IS_PIPELINE (pipeline));
|
||||
|
||||
authority =
|
||||
_cogl_pipeline_get_authority (pipeline, COGL_PIPELINE_STATE_LAYERS);
|
||||
@ -2286,7 +2295,7 @@ cogl_pipeline_get_n_layers (CoglPipeline *pipeline)
|
||||
{
|
||||
CoglPipeline *authority;
|
||||
|
||||
g_return_val_if_fail (cogl_is_pipeline (pipeline), 0);
|
||||
g_return_val_if_fail (COGL_IS_PIPELINE (pipeline), 0);
|
||||
|
||||
authority =
|
||||
_cogl_pipeline_get_authority (pipeline, COGL_PIPELINE_STATE_LAYERS);
|
||||
@ -2309,14 +2318,14 @@ CoglPipeline *
|
||||
_cogl_pipeline_journal_ref (CoglPipeline *pipeline)
|
||||
{
|
||||
pipeline->journal_ref_count++;
|
||||
return cogl_object_ref (pipeline);
|
||||
return g_object_ref (pipeline);
|
||||
}
|
||||
|
||||
void
|
||||
_cogl_pipeline_journal_unref (CoglPipeline *pipeline)
|
||||
{
|
||||
pipeline->journal_ref_count--;
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
}
|
||||
|
||||
#ifdef COGL_DEBUG_ENABLED
|
||||
|
@ -48,9 +48,9 @@ typedef struct _CoglPipeline CoglPipeline;
|
||||
G_BEGIN_DECLS
|
||||
|
||||
/**
|
||||
* SECTION:cogl-pipeline
|
||||
* @short_description: Functions for creating and manipulating the GPU
|
||||
* pipeline
|
||||
* CoglPipeline:
|
||||
*
|
||||
* Functions for creating and manipulating the GPU pipeline
|
||||
*
|
||||
* Cogl allows creating and manipulating objects representing the full
|
||||
* configuration of the GPU pipeline. In simplified terms the GPU
|
||||
@ -60,16 +60,21 @@ G_BEGIN_DECLS
|
||||
* performs fragment processing including depth testing and texture
|
||||
* mapping. Finally it blends the result with the framebuffer.
|
||||
*/
|
||||
#define COGL_TYPE_PIPELINE (cogl_pipeline_get_type ())
|
||||
#define COGL_PIPELINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), COGL_TYPE_PIPELINE, CoglPipeline))
|
||||
#define COGL_PIPELINE_CONST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), COGL_TYPE_PIPELINE, CoglPipeline const))
|
||||
#define COGL_PIPELINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), COGL_TYPE_PIPELINE, CoglPipelineClass))
|
||||
#define COGL_IS_PIPELINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), COGL_TYPE_PIPELINE))
|
||||
#define COGL_IS_PIPELINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), COGL_TYPE_PIPELINE))
|
||||
#define COGL_PIPELINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), COGL_TYPE_PIPELINE, CoglPipelineClass))
|
||||
|
||||
#define COGL_PIPELINE(OBJECT) ((CoglPipeline *)OBJECT)
|
||||
typedef struct _CoglPipelineClass CoglPipelineClass;
|
||||
typedef struct _CoglPipeline CoglPipeline;
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (CoglPipeline, g_object_unref)
|
||||
|
||||
/**
|
||||
* cogl_pipeline_get_gtype:
|
||||
*
|
||||
* Returns: a #GType that can be used with the GLib type system.
|
||||
*/
|
||||
COGL_EXPORT
|
||||
GType cogl_pipeline_get_gtype (void);
|
||||
GType cogl_pipeline_get_type (void) G_GNUC_CONST;
|
||||
|
||||
/**
|
||||
* cogl_pipeline_new: (constructor)
|
||||
@ -101,18 +106,6 @@ cogl_pipeline_new (CoglContext *context);
|
||||
COGL_EXPORT CoglPipeline *
|
||||
cogl_pipeline_copy (CoglPipeline *source);
|
||||
|
||||
/**
|
||||
* cogl_is_pipeline:
|
||||
* @object: A #CoglObject
|
||||
*
|
||||
* Gets whether the given @object references an existing pipeline object.
|
||||
*
|
||||
* Return value: %TRUE if the @object references a #CoglPipeline,
|
||||
* %FALSE otherwise
|
||||
*/
|
||||
COGL_EXPORT gboolean
|
||||
cogl_is_pipeline (void *object);
|
||||
|
||||
/**
|
||||
* CoglPipelineLayerCallback:
|
||||
* @pipeline: The #CoglPipeline whose layers are being iterated
|
||||
|
@ -280,7 +280,7 @@ _cogl_texture_quad_multiple_primitives (CoglFramebuffer *framebuffer,
|
||||
&state);
|
||||
|
||||
if (validate_first_layer_state.override_pipeline)
|
||||
cogl_object_unref (validate_first_layer_state.override_pipeline);
|
||||
g_object_unref (validate_first_layer_state.override_pipeline);
|
||||
}
|
||||
|
||||
typedef struct _ValidateTexCoordsState
|
||||
@ -364,7 +364,7 @@ validate_tex_coords_cb (CoglPipeline *pipeline,
|
||||
}
|
||||
|
||||
if (state->override_pipeline)
|
||||
cogl_object_unref (state->override_pipeline);
|
||||
g_object_unref (state->override_pipeline);
|
||||
state->needs_multiple_primitives = TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
@ -467,7 +467,7 @@ _cogl_multitexture_quad_single_primitive (CoglFramebuffer *framebuffer,
|
||||
n_layers * 4);
|
||||
|
||||
if (state.override_pipeline)
|
||||
cogl_object_unref (state.override_pipeline);
|
||||
g_object_unref (state.override_pipeline);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@ -703,7 +703,7 @@ _cogl_framebuffer_draw_multitextured_rectangles (
|
||||
}
|
||||
|
||||
if (pipeline != original_pipeline)
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -231,7 +231,7 @@ _cogl_gl_flush_attributes_state (CoglFramebuffer *framebuffer,
|
||||
* memcmp (&overrides->options, &options,
|
||||
* sizeof (options) != 0)
|
||||
* {
|
||||
* cogl_object_unref (overrides->weak_pipeline);
|
||||
* g_object_unref (overrides->weak_pipeline);
|
||||
* g_free (overrides);
|
||||
* overrides = NULL;
|
||||
* }
|
||||
@ -300,5 +300,5 @@ _cogl_gl_flush_attributes_state (CoglFramebuffer *framebuffer,
|
||||
apply_attribute_enable_updates (ctx, pipeline);
|
||||
|
||||
if (copy)
|
||||
cogl_object_unref (copy);
|
||||
g_object_unref (copy);
|
||||
}
|
||||
|
@ -101,7 +101,7 @@ typedef struct
|
||||
CoglPipelineCacheEntry *cache_entry;
|
||||
} CoglPipelineFragendShaderState;
|
||||
|
||||
static CoglUserDataKey shader_state_key;
|
||||
static GQuark shader_state_key = 0;
|
||||
|
||||
static void
|
||||
ensure_layer_generated (CoglPipeline *pipeline,
|
||||
@ -120,23 +120,41 @@ shader_state_new (int n_layers,
|
||||
|
||||
return shader_state;
|
||||
}
|
||||
typedef struct
|
||||
{
|
||||
CoglPipelineFragendShaderState *shader_state;
|
||||
CoglPipeline *instance;
|
||||
} CoglPipelineFragendShaderStateCache;
|
||||
|
||||
static GQuark
|
||||
get_cache_key (void)
|
||||
{
|
||||
if (G_UNLIKELY (shader_state_key == 0))
|
||||
shader_state_key = g_quark_from_static_string ("shader-state-key");
|
||||
|
||||
return shader_state_key;
|
||||
}
|
||||
|
||||
static CoglPipelineFragendShaderState *
|
||||
get_shader_state (CoglPipeline *pipeline)
|
||||
{
|
||||
return cogl_object_get_user_data (COGL_OBJECT (pipeline), &shader_state_key);
|
||||
CoglPipelineFragendShaderStateCache *cache;
|
||||
cache = g_object_get_qdata (G_OBJECT (pipeline), get_cache_key ());
|
||||
if (cache)
|
||||
return cache->shader_state;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
destroy_shader_state (void *user_data,
|
||||
void *instance)
|
||||
destroy_shader_state (void *user_data)
|
||||
{
|
||||
CoglPipelineFragendShaderState *shader_state = user_data;
|
||||
CoglPipelineFragendShaderStateCache *cache = user_data;
|
||||
CoglPipelineFragendShaderState *shader_state = cache->shader_state;
|
||||
|
||||
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
||||
|
||||
if (shader_state->cache_entry &&
|
||||
shader_state->cache_entry->pipeline != instance)
|
||||
shader_state->cache_entry->pipeline != cache->instance)
|
||||
shader_state->cache_entry->usage_count--;
|
||||
|
||||
if (--shader_state->ref_count == 0)
|
||||
@ -147,6 +165,7 @@ destroy_shader_state (void *user_data,
|
||||
g_free (shader_state->unit_state);
|
||||
|
||||
g_free (shader_state);
|
||||
g_free (cache);
|
||||
}
|
||||
}
|
||||
|
||||
@ -163,20 +182,23 @@ set_shader_state (CoglPipeline *pipeline, CoglPipelineFragendShaderState *shader
|
||||
shader_state->cache_entry->pipeline != pipeline)
|
||||
shader_state->cache_entry->usage_count++;
|
||||
}
|
||||
CoglPipelineFragendShaderStateCache *cache = g_new0 (CoglPipelineFragendShaderStateCache, 1);
|
||||
cache->instance = pipeline;
|
||||
cache->shader_state = shader_state;
|
||||
|
||||
_cogl_object_set_user_data (COGL_OBJECT (pipeline),
|
||||
&shader_state_key,
|
||||
shader_state,
|
||||
destroy_shader_state);
|
||||
g_object_set_qdata_full (G_OBJECT (pipeline),
|
||||
get_cache_key (),
|
||||
cache,
|
||||
destroy_shader_state);
|
||||
}
|
||||
|
||||
static void
|
||||
dirty_shader_state (CoglPipeline *pipeline)
|
||||
{
|
||||
cogl_object_set_user_data (COGL_OBJECT (pipeline),
|
||||
&shader_state_key,
|
||||
NULL,
|
||||
NULL);
|
||||
g_object_set_qdata_full (G_OBJECT (pipeline),
|
||||
get_cache_key (),
|
||||
NULL,
|
||||
NULL);
|
||||
}
|
||||
|
||||
GLuint
|
||||
|
@ -84,7 +84,7 @@ static void
|
||||
texture_unit_free (CoglTextureUnit *unit)
|
||||
{
|
||||
if (unit->layer)
|
||||
cogl_object_unref (unit->layer);
|
||||
g_object_unref (unit->layer);
|
||||
g_object_unref (unit->matrix_stack);
|
||||
}
|
||||
|
||||
@ -563,9 +563,9 @@ flush_layers_common_gl_state_cb (CoglPipelineLayer *layer, void *user_data)
|
||||
GE( ctx, glBindSampler (unit_index, sampler_state->sampler_object) );
|
||||
}
|
||||
|
||||
cogl_object_ref (layer);
|
||||
g_object_ref (layer);
|
||||
if (unit->layer != NULL)
|
||||
cogl_object_unref (unit->layer);
|
||||
g_object_unref (unit->layer);
|
||||
|
||||
unit->layer = layer;
|
||||
unit->layer_changes_since_flush = 0;
|
||||
@ -1088,9 +1088,9 @@ _cogl_pipeline_flush_gl_state (CoglContext *ctx,
|
||||
* XXX: The issue should largely go away when we switch to using
|
||||
* weak pipelines for overrides.
|
||||
*/
|
||||
cogl_object_ref (pipeline);
|
||||
g_object_ref (pipeline);
|
||||
if (ctx->current_pipeline != NULL)
|
||||
cogl_object_unref (ctx->current_pipeline);
|
||||
g_object_unref (ctx->current_pipeline);
|
||||
ctx->current_pipeline = pipeline;
|
||||
ctx->current_pipeline_changes_since_flush = 0;
|
||||
ctx->current_pipeline_with_color_attrib = with_color_attrib;
|
||||
|
@ -140,12 +140,31 @@ typedef struct
|
||||
CoglPipelineCacheEntry *cache_entry;
|
||||
} CoglPipelineProgramState;
|
||||
|
||||
static CoglUserDataKey program_state_key;
|
||||
static GQuark program_state_key = 0;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
CoglPipelineProgramState *program_state;
|
||||
CoglPipeline *instance;
|
||||
} CoglPipelineProgramStateCache;
|
||||
|
||||
static GQuark
|
||||
get_cache_key (void)
|
||||
{
|
||||
if (G_UNLIKELY (program_state_key == 0))
|
||||
program_state_key = g_quark_from_static_string ("program-state-progend-key");
|
||||
|
||||
return program_state_key;
|
||||
}
|
||||
|
||||
static CoglPipelineProgramState *
|
||||
get_program_state (CoglPipeline *pipeline)
|
||||
{
|
||||
return cogl_object_get_user_data (COGL_OBJECT (pipeline), &program_state_key);
|
||||
CoglPipelineProgramStateCache *cache;
|
||||
cache = g_object_get_qdata (G_OBJECT (pipeline), get_cache_key ());
|
||||
if (cache)
|
||||
return cache->program_state;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#define UNIFORM_LOCATION_UNKNOWN -2
|
||||
@ -246,10 +265,10 @@ program_state_new (int n_layers,
|
||||
}
|
||||
|
||||
static void
|
||||
destroy_program_state (void *user_data,
|
||||
void *instance)
|
||||
destroy_program_state (void *user_data)
|
||||
{
|
||||
CoglPipelineProgramState *program_state = user_data;
|
||||
CoglPipelineProgramStateCache *cache = user_data;
|
||||
CoglPipelineProgramState *program_state = cache->program_state;
|
||||
|
||||
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
||||
|
||||
@ -257,11 +276,11 @@ destroy_program_state (void *user_data,
|
||||
it so that if same address gets used again for a new pipeline
|
||||
then we won't think it's the same pipeline and avoid updating the
|
||||
uniforms */
|
||||
if (program_state->last_used_for_pipeline == instance)
|
||||
if (program_state->last_used_for_pipeline == cache->instance)
|
||||
program_state->last_used_for_pipeline = NULL;
|
||||
|
||||
if (program_state->cache_entry &&
|
||||
program_state->cache_entry->pipeline != instance)
|
||||
program_state->cache_entry->pipeline != cache->instance)
|
||||
program_state->cache_entry->usage_count--;
|
||||
|
||||
if (--program_state->ref_count == 0)
|
||||
@ -280,6 +299,7 @@ destroy_program_state (void *user_data,
|
||||
g_array_free (program_state->uniform_locations, TRUE);
|
||||
|
||||
g_free (program_state);
|
||||
g_free (cache);
|
||||
}
|
||||
}
|
||||
|
||||
@ -298,19 +318,23 @@ set_program_state (CoglPipeline *pipeline,
|
||||
program_state->cache_entry->usage_count++;
|
||||
}
|
||||
|
||||
_cogl_object_set_user_data (COGL_OBJECT (pipeline),
|
||||
&program_state_key,
|
||||
program_state,
|
||||
destroy_program_state);
|
||||
CoglPipelineProgramStateCache *cache = g_new0 (CoglPipelineProgramStateCache, 1);
|
||||
cache->instance = pipeline;
|
||||
cache->program_state = program_state;
|
||||
|
||||
g_object_set_qdata_full (G_OBJECT (pipeline),
|
||||
get_cache_key (),
|
||||
cache,
|
||||
destroy_program_state);
|
||||
}
|
||||
|
||||
static void
|
||||
dirty_program_state (CoglPipeline *pipeline)
|
||||
{
|
||||
cogl_object_set_user_data (COGL_OBJECT (pipeline),
|
||||
&program_state_key,
|
||||
NULL,
|
||||
NULL);
|
||||
g_object_set_qdata_full (G_OBJECT (pipeline),
|
||||
get_cache_key (),
|
||||
NULL,
|
||||
NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -660,7 +684,7 @@ _cogl_shader_compile_real (CoglShader *shader,
|
||||
|
||||
if (shader->compilation_pipeline)
|
||||
{
|
||||
cogl_object_unref (shader->compilation_pipeline);
|
||||
g_object_unref (shader->compilation_pipeline);
|
||||
shader->compilation_pipeline = NULL;
|
||||
}
|
||||
}
|
||||
@ -690,7 +714,7 @@ _cogl_shader_compile_real (CoglShader *shader,
|
||||
NULL);
|
||||
GE (ctx, glCompileShader (shader->gl_handle));
|
||||
|
||||
shader->compilation_pipeline = cogl_object_ref (pipeline);
|
||||
shader->compilation_pipeline = g_object_ref (pipeline);
|
||||
|
||||
GE (ctx, glGetShaderiv (shader->gl_handle, GL_COMPILE_STATUS, &status));
|
||||
if (!status)
|
||||
|
@ -59,7 +59,7 @@ struct _CoglPipelineVertendShaderState
|
||||
CoglPipelineCacheEntry *cache_entry;
|
||||
};
|
||||
|
||||
static CoglUserDataKey shader_state_key;
|
||||
static GQuark shader_state_key = 0;
|
||||
|
||||
static CoglPipelineVertendShaderState *
|
||||
shader_state_new (CoglPipelineCacheEntry *cache_entry)
|
||||
@ -73,10 +73,29 @@ shader_state_new (CoglPipelineCacheEntry *cache_entry)
|
||||
return shader_state;
|
||||
}
|
||||
|
||||
typedef struct
|
||||
{
|
||||
CoglPipelineVertendShaderState *shader_state;
|
||||
CoglPipeline *instance;
|
||||
} CoglPipelineVertendShaderStateCache;
|
||||
|
||||
static GQuark
|
||||
get_cache_key (void)
|
||||
{
|
||||
if (G_UNLIKELY (shader_state_key == 0))
|
||||
shader_state_key = g_quark_from_static_string ("shader-vertend-state-key");
|
||||
|
||||
return shader_state_key;
|
||||
}
|
||||
|
||||
static CoglPipelineVertendShaderState *
|
||||
get_shader_state (CoglPipeline *pipeline)
|
||||
{
|
||||
return cogl_object_get_user_data (COGL_OBJECT (pipeline), &shader_state_key);
|
||||
CoglPipelineVertendShaderStateCache * cache;
|
||||
cache = g_object_get_qdata (G_OBJECT (pipeline), get_cache_key ());
|
||||
if (cache)
|
||||
return cache->shader_state;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
CoglPipelineVertendShaderState *
|
||||
@ -86,15 +105,15 @@ cogl_pipeline_vertend_glsl_get_shader_state (CoglPipeline *pipeline)
|
||||
}
|
||||
|
||||
static void
|
||||
destroy_shader_state (void *user_data,
|
||||
void *instance)
|
||||
destroy_shader_state (void *user_data)
|
||||
{
|
||||
CoglPipelineVertendShaderState *shader_state = user_data;
|
||||
CoglPipelineVertendShaderStateCache *cache = user_data;
|
||||
CoglPipelineVertendShaderState *shader_state = cache->shader_state;
|
||||
|
||||
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
||||
|
||||
if (shader_state->cache_entry &&
|
||||
shader_state->cache_entry->pipeline != instance)
|
||||
shader_state->cache_entry->pipeline != cache->instance)
|
||||
shader_state->cache_entry->usage_count--;
|
||||
|
||||
if (--shader_state->ref_count == 0)
|
||||
@ -103,6 +122,7 @@ destroy_shader_state (void *user_data,
|
||||
GE( ctx, glDeleteShader (shader_state->gl_shader) );
|
||||
|
||||
g_free (shader_state);
|
||||
g_free (cache);
|
||||
}
|
||||
}
|
||||
|
||||
@ -121,19 +141,22 @@ set_shader_state (CoglPipeline *pipeline,
|
||||
shader_state->cache_entry->usage_count++;
|
||||
}
|
||||
|
||||
_cogl_object_set_user_data (COGL_OBJECT (pipeline),
|
||||
&shader_state_key,
|
||||
shader_state,
|
||||
destroy_shader_state);
|
||||
CoglPipelineVertendShaderStateCache *cache = g_new0 (CoglPipelineVertendShaderStateCache, 1);
|
||||
cache->instance = pipeline;
|
||||
cache->shader_state = shader_state;
|
||||
g_object_set_qdata_full (G_OBJECT (pipeline),
|
||||
get_cache_key (),
|
||||
cache,
|
||||
destroy_shader_state);
|
||||
}
|
||||
|
||||
static void
|
||||
dirty_shader_state (CoglPipeline *pipeline)
|
||||
{
|
||||
cogl_object_set_user_data (COGL_OBJECT (pipeline),
|
||||
&shader_state_key,
|
||||
NULL,
|
||||
NULL);
|
||||
g_object_set_qdata_full (G_OBJECT (pipeline),
|
||||
get_cache_key (),
|
||||
NULL,
|
||||
NULL);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
@ -353,7 +353,7 @@ draw_cursor_sprite_via_offscreen (MetaScreenCastStreamSrc *src,
|
||||
cogl_framebuffer_clear (fb, COGL_BUFFER_BIT_COLOR, &clear_color);
|
||||
cogl_framebuffer_draw_rectangle (fb, pipeline,
|
||||
-1, 1, 1, -1);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
cogl_framebuffer_read_pixels (fb,
|
||||
0, 0,
|
||||
|
@ -255,7 +255,7 @@ maybe_blit_cursor_sprite (MetaScreenCastWindowStreamSrc *window_src,
|
||||
x, y,
|
||||
x + width, y + height);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
@ -87,7 +87,7 @@ static void
|
||||
meta_overlay_free (MetaOverlay *overlay)
|
||||
{
|
||||
if (overlay->pipeline)
|
||||
cogl_object_unref (overlay->pipeline);
|
||||
g_object_unref (overlay->pipeline);
|
||||
|
||||
g_free (overlay);
|
||||
}
|
||||
|
@ -197,7 +197,7 @@ meta_stage_x11_nested_unrealize (ClutterStageWindow *stage_window)
|
||||
{
|
||||
MetaStageX11Nested *stage_nested = META_STAGE_X11_NESTED (stage_window);
|
||||
|
||||
g_clear_pointer (&stage_nested->pipeline, cogl_object_unref);
|
||||
g_clear_object (&stage_nested->pipeline);
|
||||
|
||||
clutter_stage_window_parent_iface->unrealize (stage_window);
|
||||
}
|
||||
|
@ -410,7 +410,7 @@ setup_pipeline (MetaBackgroundContent *self,
|
||||
pipeline_flags |= PIPELINE_ROUNDED_CLIP | PIPELINE_BLEND;
|
||||
|
||||
if (pipeline_flags != self->pipeline_flags)
|
||||
g_clear_pointer (&self->pipeline, cogl_object_unref);
|
||||
g_clear_object (&self->pipeline);
|
||||
|
||||
if (self->pipeline == NULL)
|
||||
{
|
||||
@ -830,7 +830,7 @@ meta_background_content_dispose (GObject *object)
|
||||
set_unobscured_region (self, NULL);
|
||||
meta_background_content_set_background (self, NULL);
|
||||
|
||||
g_clear_pointer (&self->pipeline, cogl_object_unref);
|
||||
g_clear_object (&self->pipeline);
|
||||
|
||||
G_OBJECT_CLASS (meta_background_content_parent_class)->dispose (object);
|
||||
}
|
||||
|
@ -694,7 +694,7 @@ ensure_wallpaper_texture (MetaBackground *self,
|
||||
cogl_pipeline_set_layer_texture (pipeline, 0, texture);
|
||||
cogl_framebuffer_draw_textured_rectangle (fbo, pipeline, 0, 0, width, height,
|
||||
0., 0., 1., 1.);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
if (texture_has_alpha (texture))
|
||||
{
|
||||
@ -703,7 +703,7 @@ ensure_wallpaper_texture (MetaBackground *self,
|
||||
pipeline = create_pipeline (PIPELINE_OVER_REVERSE);
|
||||
cogl_pipeline_set_layer_texture (pipeline, 0, self->color_texture);
|
||||
cogl_framebuffer_draw_rectangle (fbo, pipeline, 0, 0, width, height);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
}
|
||||
|
||||
g_object_unref (fbo);
|
||||
@ -873,7 +873,7 @@ meta_background_get_texture (MetaBackground *self,
|
||||
texture2, &monitor_area,
|
||||
monitor_scale);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -905,7 +905,7 @@ meta_background_get_texture (MetaBackground *self,
|
||||
texture1, &monitor_area,
|
||||
monitor_scale);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
}
|
||||
|
||||
if (bare_region_visible)
|
||||
@ -918,7 +918,7 @@ meta_background_get_texture (MetaBackground *self,
|
||||
pipeline,
|
||||
0, 0,
|
||||
monitor_area.width, monitor_area.height);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
}
|
||||
|
||||
monitor->dirty = FALSE;
|
||||
|
@ -168,7 +168,7 @@ meta_shadow_unref (MetaShadow *shadow)
|
||||
|
||||
meta_window_shape_unref (shadow->key.shape);
|
||||
g_object_unref (shadow->texture);
|
||||
cogl_object_unref (shadow->pipeline);
|
||||
g_object_unref (shadow->pipeline);
|
||||
|
||||
g_free (shadow);
|
||||
}
|
||||
|
@ -226,14 +226,14 @@ meta_shaped_texture_set_clip_region (MetaShapedTexture *stex,
|
||||
static void
|
||||
meta_shaped_texture_reset_pipelines (MetaShapedTexture *stex)
|
||||
{
|
||||
g_clear_pointer (&stex->base_pipeline, cogl_object_unref);
|
||||
g_clear_pointer (&stex->combined_pipeline, cogl_object_unref);
|
||||
g_clear_pointer (&stex->unmasked_pipeline, cogl_object_unref);
|
||||
g_clear_pointer (&stex->unmasked_tower_pipeline, cogl_object_unref);
|
||||
g_clear_pointer (&stex->masked_pipeline, cogl_object_unref);
|
||||
g_clear_pointer (&stex->masked_tower_pipeline, cogl_object_unref);
|
||||
g_clear_pointer (&stex->unblended_pipeline, cogl_object_unref);
|
||||
g_clear_pointer (&stex->unblended_tower_pipeline, cogl_object_unref);
|
||||
g_clear_object (&stex->base_pipeline);
|
||||
g_clear_object (&stex->combined_pipeline);
|
||||
g_clear_object (&stex->unmasked_pipeline);
|
||||
g_clear_object (&stex->unmasked_tower_pipeline);
|
||||
g_clear_object (&stex->masked_pipeline);
|
||||
g_clear_object (&stex->masked_tower_pipeline);
|
||||
g_clear_object (&stex->unblended_pipeline);
|
||||
g_clear_object (&stex->unblended_tower_pipeline);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -68,7 +68,7 @@ meta_texture_mipmap_free (MetaTextureMipmap *mipmap)
|
||||
{
|
||||
g_return_if_fail (mipmap != NULL);
|
||||
|
||||
cogl_clear_object (&mipmap->pipeline);
|
||||
g_clear_object (&mipmap->pipeline);
|
||||
g_clear_object (&mipmap->base_texture);
|
||||
g_clear_object (&mipmap->mipmap_texture);
|
||||
g_clear_object (&mipmap->fb);
|
||||
|
@ -65,7 +65,7 @@ foo_actor_paint (ClutterActor *actor,
|
||||
allocation.y1,
|
||||
allocation.x2,
|
||||
allocation.y2);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
@ -171,7 +171,7 @@ key_group_paint (ClutterActor *actor,
|
||||
clutter_actor_paint (child, paint_context);
|
||||
}
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -222,8 +222,8 @@ test_cogl_multitexture_main (int argc, char *argv[])
|
||||
|
||||
clutter_test_main ();
|
||||
|
||||
cogl_object_unref (state->pipeline1);
|
||||
cogl_object_unref (state->pipeline0);
|
||||
g_object_unref (state->pipeline1);
|
||||
g_object_unref (state->pipeline0);
|
||||
g_object_unref (state->alpha_tex);
|
||||
g_object_unref (state->redhand_tex);
|
||||
g_object_unref (state->light_tex0);
|
||||
|
@ -53,7 +53,7 @@ test_coglbox_paint (ClutterActor *self,
|
||||
pipeline = cogl_pipeline_new (ctx);
|
||||
cogl_pipeline_set_color4ub (pipeline, 0x66, 0x66, 0xdd, 0xff);
|
||||
cogl_framebuffer_draw_rectangle (framebuffer, pipeline, 0, 0, 400, 400);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
pipeline = cogl_pipeline_new (ctx);
|
||||
cogl_pipeline_set_layer_texture (pipeline, 0, coglbox->texhand_id);
|
||||
@ -62,7 +62,7 @@ test_coglbox_paint (ClutterActor *self,
|
||||
400, 400,
|
||||
0, 0,
|
||||
6, 6);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
pipeline = cogl_pipeline_new (ctx);
|
||||
cogl_pipeline_set_color4ub (pipeline, 0xff, 0, 0, 0xff);
|
||||
@ -72,7 +72,7 @@ test_coglbox_paint (ClutterActor *self,
|
||||
cogl_pipeline_set_color4ub (pipeline, 0, 0xff, 0, 0xff);
|
||||
cogl_framebuffer_draw_rectangle (coglbox->framebuffer, pipeline,
|
||||
80, 80, 80 + 100, 80 + 100);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
pipeline = cogl_pipeline_new (ctx);
|
||||
cogl_pipeline_set_color4ub (pipeline, 0x88, 0x88, 0x88, 0x88);
|
||||
@ -84,7 +84,7 @@ test_coglbox_paint (ClutterActor *self,
|
||||
texcoords[1],
|
||||
texcoords[2],
|
||||
texcoords[3]);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -272,7 +272,7 @@ test_cogl_point_sprites_main (int argc, char *argv[])
|
||||
|
||||
clutter_test_main ();
|
||||
|
||||
cogl_object_unref (data.pipeline);
|
||||
g_object_unref (data.pipeline);
|
||||
g_timer_destroy (data.last_spark_time);
|
||||
|
||||
for (i = 0; i < N_FIREWORKS; i++)
|
||||
|
@ -211,7 +211,7 @@ test_coglbox_paint (ClutterActor *self,
|
||||
|
||||
cogl_framebuffer_pop_matrix (framebuffer);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -73,7 +73,7 @@ test_coglbox_paint (ClutterActor *self,
|
||||
pipeline = cogl_pipeline_new (ctx);
|
||||
cogl_pipeline_set_color4ub (pipeline, 0x66, 0x66, 0xdd, 0xff);
|
||||
cogl_framebuffer_draw_rectangle (framebuffer, pipeline, 0, 0, 400, 400);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
cogl_framebuffer_translate (framebuffer, 100, 100, 0);
|
||||
|
||||
@ -83,7 +83,7 @@ test_coglbox_paint (ClutterActor *self,
|
||||
0, 0, 200, 213,
|
||||
texcoords[0], texcoords[1],
|
||||
texcoords[2], texcoords[3]);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
cogl_framebuffer_pop_matrix (framebuffer);
|
||||
}
|
||||
|
@ -47,7 +47,7 @@ test_alpha_test (void)
|
||||
-1, -1,
|
||||
1, 1);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
g_object_unref (tex);
|
||||
|
||||
/* The left side of the framebuffer should use the first pixel from
|
||||
|
@ -78,8 +78,8 @@ test_alpha_textures (void)
|
||||
|
||||
g_object_unref (tex1);
|
||||
g_object_unref (tex2);
|
||||
cogl_object_unref (pipeline1);
|
||||
cogl_object_unref (pipeline2);
|
||||
g_object_unref (pipeline1);
|
||||
g_object_unref (pipeline2);
|
||||
|
||||
/* Unmodified texture */
|
||||
test_utils_check_pixel (test_fb,
|
||||
|
@ -158,10 +158,10 @@ paint_test_backface_culling (TestState *state,
|
||||
|
||||
cogl_framebuffer_pop_matrix (framebuffer);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
}
|
||||
|
||||
cogl_object_unref (base_pipeline);
|
||||
g_object_unref (base_pipeline);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -248,7 +248,7 @@ paint (TestState *state)
|
||||
0, TEXTURE_RENDER_SIZE * 8,
|
||||
state->width,
|
||||
state->height + TEXTURE_RENDER_SIZE * 8);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
validate_result (test_fb, 0);
|
||||
validate_result (test_fb, 8);
|
||||
|
@ -68,7 +68,7 @@ test_blend_paint (TestState *state,
|
||||
y * QUAD_WIDTH,
|
||||
x * QUAD_WIDTH + QUAD_WIDTH,
|
||||
y * QUAD_WIDTH + QUAD_WIDTH);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
/*
|
||||
* Now blend a rectangle over our well defined destination:
|
||||
@ -100,7 +100,7 @@ test_blend_paint (TestState *state,
|
||||
y * QUAD_WIDTH,
|
||||
x * QUAD_WIDTH + QUAD_WIDTH,
|
||||
y * QUAD_WIDTH + QUAD_WIDTH);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
/* See what we got... */
|
||||
|
||||
@ -216,7 +216,7 @@ test_tex_combine (TestState *state,
|
||||
x * QUAD_WIDTH + QUAD_WIDTH,
|
||||
y * QUAD_WIDTH + QUAD_WIDTH);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
g_object_unref (tex0);
|
||||
g_object_unref (tex1);
|
||||
|
||||
|
@ -83,7 +83,7 @@ test_copy_replace_texture (void)
|
||||
|
||||
/* Unref everything but the last pipeline */
|
||||
for (pipeline_num = 0; pipeline_num < N_PIPELINES - 1; pipeline_num++)
|
||||
cogl_object_unref (pipelines[pipeline_num]);
|
||||
g_object_unref (pipelines[pipeline_num]);
|
||||
|
||||
if (alive_texture_mask && cogl_test_verbose ())
|
||||
{
|
||||
@ -110,7 +110,7 @@ test_copy_replace_texture (void)
|
||||
LAST_PIPELINE_MASK);
|
||||
|
||||
/* Clean up the last pipeline */
|
||||
cogl_object_unref (pipelines[N_PIPELINES - 1]);
|
||||
g_object_unref (pipelines[N_PIPELINES - 1]);
|
||||
|
||||
/* That should get rid of the last of the textures */
|
||||
g_assert_cmpint (alive_texture_mask, ==, 0);
|
||||
|
@ -254,8 +254,8 @@ test_short_verts (TestState *state, int offset_x, int offset_y)
|
||||
|
||||
g_object_unref (attributes[0]);
|
||||
|
||||
cogl_object_unref (pipeline2);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline2);
|
||||
g_object_unref (pipeline);
|
||||
g_object_unref (buffer);
|
||||
|
||||
test_utils_check_pixel (test_fb, offset_x + 5, offset_y + 5, 0xff0000ff);
|
||||
@ -293,7 +293,7 @@ test_custom_attributes (void)
|
||||
|
||||
paint (&state);
|
||||
|
||||
cogl_object_unref (state.pipeline);
|
||||
g_object_unref (state.pipeline);
|
||||
g_object_unref (snippet);
|
||||
|
||||
if (cogl_test_verbose ())
|
||||
|
@ -58,7 +58,7 @@ draw_rectangle (TestState *state,
|
||||
pipeline = cogl_pipeline_new (test_ctx);
|
||||
if (!cogl_pipeline_set_depth_state (pipeline, &depth_state, NULL))
|
||||
{
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -95,10 +95,10 @@ draw_rectangle (TestState *state,
|
||||
y * QUAD_WIDTH + QUAD_WIDTH);
|
||||
cogl_framebuffer_pop_matrix (test_fb);
|
||||
|
||||
cogl_object_unref (legacy_pipeline);
|
||||
g_object_unref (legacy_pipeline);
|
||||
}
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -30,7 +30,7 @@ test_journal_unref_flush (void)
|
||||
cogl_framebuffer_draw_rectangle (COGL_FRAMEBUFFER (offscreen),
|
||||
pipeline,
|
||||
-1, -1, 1, 1);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
g_object_unref (offscreen);
|
||||
g_assert_null (offscreen);
|
||||
|
@ -86,7 +86,7 @@ paint (TestState *state)
|
||||
50, 0, 100, 50);
|
||||
cogl_pipeline_set_user_program (pipeline, NULL);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -68,21 +68,21 @@ test_layer_remove (void)
|
||||
* together properly */
|
||||
pipeline0 = create_two_layer_pipeline ();
|
||||
test_color (pipeline0, 0xffff00ff, pos++);
|
||||
cogl_object_unref (pipeline0);
|
||||
g_object_unref (pipeline0);
|
||||
|
||||
/** TEST 2 **/
|
||||
/* Check that we can remove the second layer */
|
||||
pipeline0 = create_two_layer_pipeline ();
|
||||
cogl_pipeline_remove_layer (pipeline0, 1);
|
||||
test_color (pipeline0, 0xff0000ff, pos++);
|
||||
cogl_object_unref (pipeline0);
|
||||
g_object_unref (pipeline0);
|
||||
|
||||
/** TEST 3 **/
|
||||
/* Check that we can remove the first layer */
|
||||
pipeline0 = create_two_layer_pipeline ();
|
||||
cogl_pipeline_remove_layer (pipeline0, 0);
|
||||
test_color (pipeline0, 0x00ff00ff, pos++);
|
||||
cogl_object_unref (pipeline0);
|
||||
g_object_unref (pipeline0);
|
||||
|
||||
/** TEST 4 **/
|
||||
/* Check that we can make a copy and remove a layer from the
|
||||
@ -92,8 +92,8 @@ test_layer_remove (void)
|
||||
cogl_pipeline_remove_layer (pipeline0, 1);
|
||||
test_color (pipeline0, 0xff0000ff, pos++);
|
||||
test_color (pipeline1, 0xffff00ff, pos++);
|
||||
cogl_object_unref (pipeline0);
|
||||
cogl_object_unref (pipeline1);
|
||||
g_object_unref (pipeline0);
|
||||
g_object_unref (pipeline1);
|
||||
|
||||
/** TEST 5 **/
|
||||
/* Check that we can make a copy and remove the second layer from the
|
||||
@ -103,8 +103,8 @@ test_layer_remove (void)
|
||||
cogl_pipeline_remove_layer (pipeline1, 1);
|
||||
test_color (pipeline0, 0xffff00ff, pos++);
|
||||
test_color (pipeline1, 0xff0000ff, pos++);
|
||||
cogl_object_unref (pipeline0);
|
||||
cogl_object_unref (pipeline1);
|
||||
g_object_unref (pipeline0);
|
||||
g_object_unref (pipeline1);
|
||||
|
||||
/** TEST 6 **/
|
||||
/* Check that we can make a copy and remove the first layer from the
|
||||
@ -114,8 +114,8 @@ test_layer_remove (void)
|
||||
cogl_pipeline_remove_layer (pipeline1, 0);
|
||||
test_color (pipeline0, 0xffff00ff, pos++);
|
||||
test_color (pipeline1, 0x00ff00ff, pos++);
|
||||
cogl_object_unref (pipeline0);
|
||||
cogl_object_unref (pipeline1);
|
||||
g_object_unref (pipeline0);
|
||||
g_object_unref (pipeline1);
|
||||
|
||||
/** TEST 7 **/
|
||||
/* Check that we can modify a layer in a child pipeline */
|
||||
@ -125,8 +125,8 @@ test_layer_remove (void)
|
||||
cogl_pipeline_set_layer_combine_constant (pipeline1, 0, &color);
|
||||
test_color (pipeline0, 0xffff00ff, pos++);
|
||||
test_color (pipeline1, 0x00ffffff, pos++);
|
||||
cogl_object_unref (pipeline0);
|
||||
cogl_object_unref (pipeline1);
|
||||
g_object_unref (pipeline0);
|
||||
g_object_unref (pipeline1);
|
||||
|
||||
/** TEST 8 **/
|
||||
/* Check that we can modify a layer in a child pipeline but then remove it */
|
||||
@ -137,8 +137,8 @@ test_layer_remove (void)
|
||||
cogl_pipeline_remove_layer (pipeline1, 0);
|
||||
test_color (pipeline0, 0xffff00ff, pos++);
|
||||
test_color (pipeline1, 0x00ff00ff, pos++);
|
||||
cogl_object_unref (pipeline0);
|
||||
cogl_object_unref (pipeline1);
|
||||
g_object_unref (pipeline0);
|
||||
g_object_unref (pipeline1);
|
||||
|
||||
if (cogl_test_verbose ())
|
||||
g_print ("OK\n");
|
||||
|
@ -121,7 +121,7 @@ test_map_buffer_range (void)
|
||||
g_object_unref (pos_attribute);
|
||||
g_object_unref (tex_coord_attribute);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
g_object_unref (tex);
|
||||
|
||||
if (cogl_test_verbose ())
|
||||
|
@ -151,7 +151,7 @@ on_paint (ClutterActor *actor,
|
||||
cogl_rectangle_with_multitexture_coords (0, 0, QUAD_WIDTH, QUAD_WIDTH,
|
||||
tex_coords, 8);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
g_object_unref (tex0);
|
||||
g_object_unref (tex1);
|
||||
|
||||
|
@ -137,7 +137,7 @@ paint (void)
|
||||
(x + 1) / 2.0f,
|
||||
(y + 1) / 2.0f);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
g_object_unref (texture);
|
||||
}
|
||||
|
||||
|
@ -5,9 +5,9 @@
|
||||
|
||||
#include "test-conform-common.h"
|
||||
|
||||
CoglUserDataKey private_key0;
|
||||
CoglUserDataKey private_key1;
|
||||
CoglUserDataKey private_key2;
|
||||
static GQuark private_key0 = 0;
|
||||
static GQuark private_key1 = 0;
|
||||
static GQuark private_key2 = 0;
|
||||
|
||||
static int user_data0;
|
||||
static int user_data1;
|
||||
@ -49,32 +49,36 @@ test_object (TestUtilsGTestFixture *fixture,
|
||||
cogl_pipeline_new ();
|
||||
pipeline = cogl_pipeline_path ();
|
||||
|
||||
cogl_object_set_user_data (COGL_OBJECT (pipeline),
|
||||
&private_key0,
|
||||
&user_data0,
|
||||
destroy0_cb);
|
||||
private_key0 = g_quark_from_static_string ("test-object-private_key0");
|
||||
private_key1 = g_quark_from_static_string ("test-object-private_key1");
|
||||
private_key2 = g_quark_from_static_string ("test-object-private_key2");
|
||||
|
||||
cogl_object_set_user_data (COGL_OBJECT (pipeline),
|
||||
&private_key1,
|
||||
&user_data1,
|
||||
destroy1_cb);
|
||||
g_object_set_qdata_full (G_OBJECT (pipeline),
|
||||
private_key0,
|
||||
&user_data0,
|
||||
destroy0_cb);
|
||||
|
||||
cogl_object_set_user_data (COGL_OBJECT (pipeline),
|
||||
&private_key2,
|
||||
&user_data2,
|
||||
destroy2_cb);
|
||||
g_object_set_qdata_full (G_OBJECT (pipeline),
|
||||
private_key1,
|
||||
&user_data1,
|
||||
destroy1_cb);
|
||||
|
||||
cogl_object_set_user_data (COGL_OBJECT (pipeline),
|
||||
&private_key1,
|
||||
NULL,
|
||||
destroy1_cb);
|
||||
g_object_set_qdata_full (G_OBJECT (pipeline),
|
||||
private_key2,
|
||||
&user_data2,
|
||||
destroy2_cb);
|
||||
|
||||
cogl_object_set_user_data (COGL_OBJECT (pipeline),
|
||||
&private_key1,
|
||||
&user_data1,
|
||||
destroy1_cb);
|
||||
g_object_set_qdata_full (G_OBJECT (pipeline),
|
||||
private_key1,
|
||||
NULL,
|
||||
destroy1_cb);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_set_qdata_full (G_OBJECT (pipeline),
|
||||
private_key1,
|
||||
&user_data1,
|
||||
destroy1_cb);
|
||||
|
||||
g_object_unref (pipeline);
|
||||
|
||||
g_assert_cmpint (destroy0_count, ==, 1);
|
||||
g_assert_cmpint (destroy1_count, ==, 2);
|
||||
|
@ -350,7 +350,7 @@ test_offscreen_texture_formats_paint_rgb10 (void)
|
||||
cogl_framebuffer_draw_rectangle (COGL_FRAMEBUFFER (offscreen_dst),
|
||||
pipeline,
|
||||
-1.0, -1.0, 1.0, 1.0);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
cogl_framebuffer_read_pixels (COGL_FRAMEBUFFER (offscreen_dst),
|
||||
0, 0, 2, 2, formats[j],
|
||||
@ -476,7 +476,7 @@ test_offscreen_texture_formats_paint_rgb8 (void)
|
||||
cogl_framebuffer_draw_rectangle (COGL_FRAMEBUFFER (offscreen_dst),
|
||||
pipeline,
|
||||
-1.0, -1.0, 1.0, 1.0);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
cogl_framebuffer_read_pixels (COGL_FRAMEBUFFER (offscreen_dst),
|
||||
0, 0, 2, 2, formats[j],
|
||||
|
@ -98,8 +98,8 @@ test_paint (TestState *state)
|
||||
cogl_pipeline_set_layer_texture (texture_pipeline, 0, tex);
|
||||
cogl_framebuffer_draw_rectangle (test_fb, texture_pipeline, -1, 1, 1, -1);
|
||||
|
||||
cogl_object_unref (opaque_pipeline);
|
||||
cogl_object_unref (texture_pipeline);
|
||||
g_object_unref (opaque_pipeline);
|
||||
g_object_unref (texture_pipeline);
|
||||
g_object_unref (tex);
|
||||
|
||||
cogl_framebuffer_pop_matrix (test_fb);
|
||||
@ -184,7 +184,7 @@ test_flush (TestState *state)
|
||||
g_object_unref (offscreen);
|
||||
}
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -76,13 +76,13 @@ test_pipeline_cache_unrefs_texture (void)
|
||||
}
|
||||
cogl_framebuffer_draw_rectangle (test_fb, simple_pipeline, 0, 0, 10, 10);
|
||||
cogl_framebuffer_finish (test_fb);
|
||||
cogl_object_unref (simple_pipeline);
|
||||
g_object_unref (simple_pipeline);
|
||||
|
||||
g_assert_cmpint (destroyed_texture_count, ==, 0);
|
||||
|
||||
/* Destroy the pipeline. This should immediately cause the textures
|
||||
* to be freed */
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
g_assert_cmpint (destroyed_texture_count, ==, N_TEXTURES);
|
||||
|
||||
|
@ -52,7 +52,7 @@ test_pipeline_shader_state (void)
|
||||
cogl_framebuffer_draw_rectangle (test_fb, draw_pipeline,
|
||||
0, 0, width, height);
|
||||
|
||||
cogl_object_unref (draw_pipeline);
|
||||
g_object_unref (draw_pipeline);
|
||||
|
||||
cogl_framebuffer_finish (test_fb);
|
||||
|
||||
@ -85,7 +85,7 @@ test_pipeline_shader_state (void)
|
||||
cogl_framebuffer_draw_rectangle (test_fb, draw_pipeline,
|
||||
0, 0, width, height);
|
||||
|
||||
cogl_object_unref (draw_pipeline);
|
||||
g_object_unref (draw_pipeline);
|
||||
|
||||
|
||||
test_utils_check_region (test_fb, 0, 0, width, height,
|
||||
|
@ -163,15 +163,15 @@ init_long_pipeline_state (TestState *state)
|
||||
static void
|
||||
destroy_state (TestState *state)
|
||||
{
|
||||
cogl_object_unref (state->pipeline_red);
|
||||
cogl_object_unref (state->pipeline_green);
|
||||
cogl_object_unref (state->pipeline_blue);
|
||||
cogl_object_unref (state->matrix_pipeline);
|
||||
cogl_object_unref (state->vector_pipeline);
|
||||
cogl_object_unref (state->int_pipeline);
|
||||
g_object_unref (state->pipeline_red);
|
||||
g_object_unref (state->pipeline_green);
|
||||
g_object_unref (state->pipeline_blue);
|
||||
g_object_unref (state->matrix_pipeline);
|
||||
g_object_unref (state->vector_pipeline);
|
||||
g_object_unref (state->int_pipeline);
|
||||
|
||||
if (state->long_pipeline)
|
||||
cogl_object_unref (state->long_pipeline);
|
||||
g_object_unref (state->long_pipeline);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -211,7 +211,7 @@ paint_color_pipelines (TestState *state)
|
||||
paint_pipeline (temp_pipeline, i + 3);
|
||||
}
|
||||
|
||||
cogl_object_unref (temp_pipeline);
|
||||
g_object_unref (temp_pipeline);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -124,7 +124,7 @@ paint (TestState *state)
|
||||
|
||||
g_object_unref (tex1);
|
||||
g_object_unref (tex0);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -151,7 +151,7 @@ test_pixel_buffer_map (void)
|
||||
|
||||
g_object_unref (bitmap);
|
||||
g_object_unref (texture);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
check_colours (0x0000ffff,
|
||||
0x00ff00ff,
|
||||
@ -196,7 +196,7 @@ test_pixel_buffer_set_data (void)
|
||||
|
||||
g_object_unref (bitmap);
|
||||
g_object_unref (texture);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
check_colours (0x0000ffff,
|
||||
0x00ff00ff,
|
||||
@ -257,7 +257,7 @@ test_pixel_buffer_sub_region (void)
|
||||
|
||||
g_object_unref (bitmap);
|
||||
g_object_unref (texture);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
check_colours (0xffffffff,
|
||||
0xff0000ff,
|
||||
|
@ -124,7 +124,7 @@ do_test (const char *attribute_name,
|
||||
if (pipeline_setup_func)
|
||||
pipeline_setup_func (pipeline);
|
||||
cogl_primitive_draw (primitive, test_fb, pipeline);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
cogl_object_unref (primitive);
|
||||
|
||||
/* Verify all of the points where drawn at the right size */
|
||||
|
@ -83,7 +83,7 @@ test_point_size (void)
|
||||
cogl_primitive_draw (prim, test_fb, pipeline);
|
||||
|
||||
cogl_object_unref (prim);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
}
|
||||
|
||||
/* Verify all of the points where drawn at the right size */
|
||||
|
@ -134,8 +134,8 @@ do_test (gboolean check_orientation,
|
||||
cogl_framebuffer_pop_matrix (test_fb);
|
||||
|
||||
cogl_object_unref (prim);
|
||||
cogl_object_unref (solid_pipeline);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (solid_pipeline);
|
||||
g_object_unref (pipeline);
|
||||
g_object_unref (tex_2d);
|
||||
|
||||
test_utils_check_pixel (test_fb,
|
||||
|
@ -134,8 +134,8 @@ do_test (gboolean check_orientation,
|
||||
cogl_framebuffer_pop_matrix (test_fb);
|
||||
|
||||
cogl_object_unref (prim);
|
||||
cogl_object_unref (solid_pipeline);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (solid_pipeline);
|
||||
g_object_unref (pipeline);
|
||||
g_object_unref (tex_2d);
|
||||
|
||||
test_utils_check_pixel (test_fb,
|
||||
|
@ -202,7 +202,7 @@ test_paint (TestState *state)
|
||||
cogl_object_unref (prim);
|
||||
}
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
@ -61,7 +61,7 @@ simple_fragment_snippet (TestState *state)
|
||||
|
||||
cogl_framebuffer_draw_rectangle (test_fb, pipeline, 0, 0, 10, 10);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
test_utils_check_pixel (test_fb, 5, 5, 0xffff00ff);
|
||||
}
|
||||
@ -85,7 +85,7 @@ simple_vertex_snippet (TestState *state)
|
||||
|
||||
cogl_framebuffer_draw_rectangle (test_fb, pipeline, 10, 0, 20, 10);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
test_utils_check_pixel (test_fb, 15, 5, 0xff00ffff);
|
||||
}
|
||||
@ -121,7 +121,7 @@ shared_uniform (TestState *state)
|
||||
pipeline,
|
||||
20, 0, 30, 10);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
test_utils_check_pixel (test_fb, 25, 5, 0xff0080ff);
|
||||
}
|
||||
@ -165,7 +165,7 @@ lots_snippets (TestState *state)
|
||||
|
||||
cogl_framebuffer_draw_rectangle (test_fb, pipeline, 30, 0, 40, 10);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
test_utils_check_pixel (test_fb, 35, 5, 0x19334cff);
|
||||
}
|
||||
@ -191,7 +191,7 @@ shared_variable_pre_post (TestState *state)
|
||||
|
||||
cogl_framebuffer_draw_rectangle (test_fb, pipeline, 40, 0, 50, 10);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
test_utils_check_pixel (test_fb, 45, 5, 0xff0000ff);
|
||||
}
|
||||
@ -217,12 +217,12 @@ test_pipeline_caching (TestState *state)
|
||||
pipeline = cogl_pipeline_new (test_ctx);
|
||||
cogl_pipeline_add_snippet (pipeline, snippet);
|
||||
cogl_framebuffer_draw_rectangle (test_fb, pipeline, 50, 0, 60, 10);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
pipeline = cogl_pipeline_new (test_ctx);
|
||||
cogl_pipeline_add_snippet (pipeline, snippet);
|
||||
cogl_framebuffer_draw_rectangle (test_fb, pipeline, 60, 0, 70, 10);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
g_object_unref (snippet);
|
||||
|
||||
@ -250,7 +250,7 @@ test_replace_string (TestState *state)
|
||||
pipeline = cogl_pipeline_new (test_ctx);
|
||||
cogl_pipeline_add_snippet (pipeline, snippet);
|
||||
cogl_framebuffer_draw_rectangle (test_fb, pipeline, 70, 0, 80, 10);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
g_object_unref (snippet);
|
||||
|
||||
@ -277,7 +277,7 @@ test_texture_lookup_hook (TestState *state)
|
||||
pipeline,
|
||||
80, 0, 90, 10,
|
||||
0, 0, 0, 0);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
g_object_unref (snippet);
|
||||
|
||||
@ -303,7 +303,7 @@ test_multiple_samples (TestState *state)
|
||||
pipeline = create_texture_pipeline (state);
|
||||
cogl_pipeline_add_layer_snippet (pipeline, 0, snippet);
|
||||
cogl_framebuffer_draw_rectangle (test_fb, pipeline, 0, 0, 10, 10);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
g_object_unref (snippet);
|
||||
|
||||
@ -326,7 +326,7 @@ test_replace_lookup_hook (TestState *state)
|
||||
pipeline,
|
||||
90, 0, 100, 10,
|
||||
0, 0, 0, 0);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
g_object_unref (snippet);
|
||||
|
||||
@ -359,7 +359,7 @@ test_replace_snippet (TestState *state)
|
||||
pipeline,
|
||||
100, 0, 110, 10,
|
||||
0, 0, 0, 0);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
test_utils_check_pixel (test_fb, 105, 5, 0xff0000ff);
|
||||
}
|
||||
@ -391,7 +391,7 @@ test_replace_fragment_layer (TestState *state)
|
||||
pipeline,
|
||||
110, 0, 120, 10,
|
||||
0, 0, 0, 0);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
test_utils_check_pixel (test_fb, 115, 5, 0xff00ffff);
|
||||
}
|
||||
@ -420,7 +420,7 @@ test_modify_fragment_layer (TestState *state)
|
||||
pipeline,
|
||||
120, 0, 130, 10,
|
||||
0, 0, 0, 0);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
test_utils_check_pixel (test_fb, 125, 5, 0xff80ffff);
|
||||
}
|
||||
@ -449,7 +449,7 @@ test_modify_vertex_layer (TestState *state)
|
||||
pipeline,
|
||||
130, 0, 140, 10,
|
||||
0, 0, 0, 0);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
test_utils_check_pixel (test_fb, 135, 5, 0xffff00ff);
|
||||
}
|
||||
@ -479,7 +479,7 @@ test_replace_vertex_layer (TestState *state)
|
||||
pipeline,
|
||||
140, 0, 150, 10,
|
||||
0, 0, 0, 0);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
test_utils_check_pixel (test_fb, 145, 5, 0x00ff00ff);
|
||||
}
|
||||
@ -526,7 +526,7 @@ test_vertex_transform_hook (TestState *state)
|
||||
cogl_framebuffer_set_projection_matrix (test_fb, &identity_matrix);
|
||||
|
||||
cogl_framebuffer_draw_rectangle (test_fb, pipeline, 150, 0, 160, 10);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
/* Restore the projection matrix */
|
||||
cogl_framebuffer_set_projection_matrix (test_fb, &matrix);
|
||||
@ -582,7 +582,7 @@ test_global_vertex_hook (TestState *state)
|
||||
10.0f * 2.0f / state->fb_width - 1.0f,
|
||||
10.0f * 2.0f / state->fb_height - 1.0f);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
test_utils_check_pixel (test_fb, 5, 5, 0xff0000ff);
|
||||
}
|
||||
@ -632,7 +632,7 @@ test_global_fragment_hook (TestState *state)
|
||||
pipeline,
|
||||
0, 0, 10, 10);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
test_utils_check_pixel (test_fb, 5, 5, 0xff0000ff);
|
||||
}
|
||||
@ -670,7 +670,7 @@ test_snippet_order (TestState *state)
|
||||
g_object_unref (snippet);
|
||||
|
||||
cogl_framebuffer_draw_rectangle (test_fb, pipeline, 160, 0, 170, 10);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
test_utils_check_pixel (test_fb, 165, 5, 0x80ff00ff);
|
||||
}
|
||||
@ -705,7 +705,7 @@ test_naming_texture_units (TestState *state)
|
||||
|
||||
cogl_framebuffer_draw_rectangle (test_fb, pipeline, 0, 0, 10, 10);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
g_object_unref (snippet);
|
||||
g_object_unref (tex1);
|
||||
g_object_unref (tex2);
|
||||
|
@ -37,7 +37,7 @@ test_sparse_layer_combine (TestState *state)
|
||||
|
||||
test_utils_check_pixel (test_fb, 2, 2, 0xffff00ff);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
g_object_unref (tex1);
|
||||
g_object_unref (tex2);
|
||||
}
|
||||
|
@ -149,7 +149,7 @@ paint (TestState *state)
|
||||
0.0f, SOURCE_SIZE * 2.0f,
|
||||
10.0f, SOURCE_SIZE * 2.0f + 10.0f);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -70,7 +70,7 @@ on_paint (ClutterActor *actor,
|
||||
COGL_PIPELINE_FILTER_NEAREST);
|
||||
cogl_rectangle (1, 0, 2, 1);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
|
||||
/* Read back the two pixels we rendered */
|
||||
cogl_read_pixels (0, 0, 2, 1,
|
||||
|
@ -75,7 +75,7 @@ test_texture_rg (void)
|
||||
0);
|
||||
}
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
g_object_unref (tex);
|
||||
}
|
||||
|
||||
|
@ -95,7 +95,7 @@ draw_tests (TestState *state)
|
||||
(i + 2) * TEX_SIZE,
|
||||
TEX_SIZE * 2,
|
||||
0, 0, 2, 2);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
}
|
||||
}
|
||||
|
||||
@ -130,7 +130,7 @@ draw_tests_polygon (TestState *state)
|
||||
vertices);
|
||||
cogl_primitive_draw (primitive, test_fb, pipeline);
|
||||
cogl_object_unref (primitive);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
cogl_framebuffer_pop_matrix (test_fb);
|
||||
}
|
||||
}
|
||||
|
@ -82,7 +82,7 @@ check_pipeline_pruning (void)
|
||||
* should run the garbage collector again but this time the
|
||||
* pipelines won't be in use so it should free some of them */
|
||||
for (i = 0; i < 18; i++)
|
||||
cogl_object_unref (pipelines[i]);
|
||||
g_object_unref (pipelines[i]);
|
||||
|
||||
create_pipelines (pipelines, 18);
|
||||
|
||||
@ -96,7 +96,7 @@ check_pipeline_pruning (void)
|
||||
g_assert_cmpint (combined_hash->expected_min_size, ==, 17);
|
||||
|
||||
for (i = 0; i < 18; i++)
|
||||
cogl_object_unref (pipelines[i]);
|
||||
g_object_unref (pipelines[i]);
|
||||
}
|
||||
|
||||
COGL_TEST_SUITE (
|
||||
|
@ -35,7 +35,7 @@ test_pipeline_opengl_blend_enable (void)
|
||||
* then blending should be disabled */
|
||||
g_assert_cmpint (test_ctx->gl_blend_enable_cache, ==, 0);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
}
|
||||
|
||||
COGL_TEST_SUITE (
|
||||
|
@ -23,7 +23,7 @@ test_pipeline_state_uniform_ancestry (void)
|
||||
int uniform_location;
|
||||
|
||||
tmp_pipeline = cogl_pipeline_copy (pipeline);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
pipeline = tmp_pipeline;
|
||||
|
||||
uniform_location =
|
||||
@ -37,7 +37,7 @@ test_pipeline_state_uniform_ancestry (void)
|
||||
|
||||
g_assert_cmpint (pipeline_length, <=, 2);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
}
|
||||
|
||||
COGL_TEST_SUITE (
|
||||
|
@ -27,7 +27,7 @@ test_pipeline_state_blend_constant_ancestry (void)
|
||||
cogl_color_init_from_4f (&color, i / 20.0f, 0.0f, 0.0f, 1.0f);
|
||||
|
||||
tmp_pipeline = cogl_pipeline_copy (pipeline);
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
pipeline = tmp_pipeline;
|
||||
|
||||
cogl_pipeline_set_blend_constant (pipeline, &color);
|
||||
@ -38,7 +38,7 @@ test_pipeline_state_blend_constant_ancestry (void)
|
||||
|
||||
g_assert_cmpint (pipeline_length, <=, 2);
|
||||
|
||||
cogl_object_unref (pipeline);
|
||||
g_object_unref (pipeline);
|
||||
}
|
||||
|
||||
COGL_TEST_SUITE (
|
||||
|
@ -61,7 +61,7 @@ test_pipeline_vertend_glsl_point_size_shader (void)
|
||||
g_assert (shader_states[0] == shader_states[3]);
|
||||
|
||||
for (i = 0; i < G_N_ELEMENTS (pipelines); i++)
|
||||
cogl_object_unref (pipelines[i]);
|
||||
g_object_unref (pipelines[i]);
|
||||
}
|
||||
|
||||
COGL_TEST_SUITE (
|
||||
|
Loading…
Reference in New Issue
Block a user