void _cogl_clip_stack_unref (CoglClipStack *entry) { /* Unref all of the entries until we hit the root of the list or the entry still has a remaining reference */ while (entry && --entry->ref_count <= 0) { CoglClipStack *parent = entry->parent; switch (entry->type) { case COGL_CLIP_STACK_RECT: { CoglClipStackRect *rect = (CoglClipStackRect *) entry; _cogl_matrix_entry_unref (rect->matrix_entry); g_slice_free1 (sizeof (CoglClipStackRect), entry); break; } case COGL_CLIP_STACK_WINDOW_RECT: g_slice_free1 (sizeof (CoglClipStackWindowRect), entry); break; case COGL_CLIP_STACK_PATH: { CoglClipStackPath *path_entry = (CoglClipStackPath *) entry; _cogl_matrix_entry_unref (path_entry->matrix_entry); cogl_object_unref (path_entry->path); g_slice_free1 (sizeof (CoglClipStackPath), entry); break; } case COGL_CLIP_STACK_PRIMITIVE: { CoglClipStackPrimitive *primitive_entry = (CoglClipStackPrimitive *) entry; _cogl_matrix_entry_unref (primitive_entry->matrix_entry); cogl_object_unref (primitive_entry->primitive); g_slice_free1 (sizeof (CoglClipStackPrimitive), entry); break; } default: g_assert_not_reached (); } entry = parent; } }
void _cogl_context_set_current_modelview_entry (CoglContext *context, CoglMatrixEntry *entry) { _cogl_matrix_entry_ref (entry); if (context->current_modelview_entry) _cogl_matrix_entry_unref (context->current_modelview_entry); context->current_modelview_entry = entry; }
static void _cogl_context_free (CoglContext *context) { const CoglWinsysVtable *winsys = _cogl_context_get_winsys (context); winsys->context_deinit (context); _cogl_free_framebuffer_stack (context->framebuffer_stack); if (context->default_gl_texture_2d_tex) cogl_object_unref (context->default_gl_texture_2d_tex); if (context->default_gl_texture_3d_tex) cogl_object_unref (context->default_gl_texture_3d_tex); if (context->default_gl_texture_rect_tex) cogl_object_unref (context->default_gl_texture_rect_tex); if (context->opaque_color_pipeline) cogl_object_unref (context->opaque_color_pipeline); if (context->blended_color_pipeline) cogl_object_unref (context->blended_color_pipeline); if (context->texture_pipeline) cogl_object_unref (context->texture_pipeline); if (context->blit_texture_pipeline) cogl_object_unref (context->blit_texture_pipeline); g_warn_if_fail (context->gles2_context_stack.length == 0); if (context->journal_flush_attributes_array) g_array_free (context->journal_flush_attributes_array, TRUE); if (context->journal_clip_bounds) g_array_free (context->journal_clip_bounds, TRUE); if (context->polygon_vertices) g_array_free (context->polygon_vertices, TRUE); if (context->quad_buffer_indices_byte) cogl_object_unref (context->quad_buffer_indices_byte); if (context->quad_buffer_indices) cogl_object_unref (context->quad_buffer_indices); if (context->rectangle_byte_indices) cogl_object_unref (context->rectangle_byte_indices); if (context->rectangle_short_indices) cogl_object_unref (context->rectangle_short_indices); if (context->default_pipeline) cogl_object_unref (context->default_pipeline); if (context->dummy_layer_dependant) cogl_object_unref (context->dummy_layer_dependant); if (context->default_layer_n) cogl_object_unref (context->default_layer_n); if (context->default_layer_0) cogl_object_unref (context->default_layer_0); if (context->current_clip_stack_valid) _cogl_clip_stack_unref (context->current_clip_stack); g_slist_free (context->atlases); g_hook_list_clear (&context->atlas_reorganize_callbacks); _cogl_bitmask_destroy (&context->enabled_builtin_attributes); _cogl_bitmask_destroy (&context->enable_builtin_attributes_tmp); _cogl_bitmask_destroy (&context->enabled_texcoord_attributes); _cogl_bitmask_destroy (&context->enable_texcoord_attributes_tmp); _cogl_bitmask_destroy (&context->enabled_custom_attributes); _cogl_bitmask_destroy (&context->enable_custom_attributes_tmp); _cogl_bitmask_destroy (&context->changed_bits_tmp); g_slist_free (context->texture_types); g_slist_free (context->buffer_types); if (_context->current_modelview_entry) _cogl_matrix_entry_unref (_context->current_modelview_entry); if (_context->current_projection_entry) _cogl_matrix_entry_unref (_context->current_projection_entry); _cogl_matrix_entry_cache_destroy (&context->builtin_flushed_projection); _cogl_matrix_entry_cache_destroy (&context->builtin_flushed_modelview); cogl_pipeline_cache_free (context->pipeline_cache); _cogl_sampler_cache_free (context->sampler_cache); _cogl_destroy_texture_units (); g_ptr_array_free (context->uniform_names, TRUE); g_hash_table_destroy (context->uniform_name_hash); g_hash_table_destroy (context->attribute_name_states_hash); g_array_free (context->attribute_name_index_map, TRUE); g_byte_array_free (context->buffer_map_fallback_array, TRUE); cogl_object_unref (context->display); g_free (context); }