void _cg_sampler_cache_free(cg_sampler_cache_t *cache) { c_hash_table_foreach( cache->hash_table_gl, hash_table_free_gl_cb, cache->dev); c_hash_table_destroy(cache->hash_table_gl); c_hash_table_foreach( cache->hash_table_cg, hash_table_free_cg_cb, cache->dev); c_hash_table_destroy(cache->hash_table_cg); c_free(cache); }
static void _cg_device_free(cg_device_t *dev) { const cg_winsys_vtable_t *winsys = _cg_device_get_winsys(dev); winsys->device_deinit(dev); if (dev->atlas_set) cg_object_unref(dev->atlas_set); if (dev->default_gl_texture_2d_tex) cg_object_unref(dev->default_gl_texture_2d_tex); if (dev->default_gl_texture_3d_tex) cg_object_unref(dev->default_gl_texture_3d_tex); if (dev->opaque_color_pipeline) cg_object_unref(dev->opaque_color_pipeline); if (dev->blit_texture_pipeline) cg_object_unref(dev->blit_texture_pipeline); c_warn_if_fail(dev->gles2_context_stack.length == 0); if (dev->rectangle_byte_indices) cg_object_unref(dev->rectangle_byte_indices); if (dev->rectangle_short_indices) cg_object_unref(dev->rectangle_short_indices); if (dev->default_pipeline) cg_object_unref(dev->default_pipeline); if (dev->dummy_layer_dependant) cg_object_unref(dev->dummy_layer_dependant); if (dev->default_layer_n) cg_object_unref(dev->default_layer_n); if (dev->default_layer_0) cg_object_unref(dev->default_layer_0); if (dev->current_clip_stack_valid) _cg_clip_stack_unref(dev->current_clip_stack); _cg_bitmask_destroy(&dev->enabled_custom_attributes); _cg_bitmask_destroy(&dev->enable_custom_attributes_tmp); _cg_bitmask_destroy(&dev->changed_bits_tmp); if (dev->current_modelview_entry) cg_matrix_entry_unref(dev->current_modelview_entry); if (dev->current_projection_entry) cg_matrix_entry_unref(dev->current_projection_entry); _cg_matrix_entry_cache_destroy(&dev->builtin_flushed_projection); _cg_matrix_entry_cache_destroy(&dev->builtin_flushed_modelview); _cg_pipeline_cache_free(dev->pipeline_cache); _cg_sampler_cache_free(dev->sampler_cache); _cg_destroy_texture_units(dev); c_ptr_array_free(dev->uniform_names, true); c_hash_table_destroy(dev->uniform_name_hash); c_hash_table_destroy(dev->attribute_name_states_hash); c_array_free(dev->attribute_name_index_map, true); c_byte_array_free(dev->buffer_map_fallback_array, true); #ifdef CG_HAS_UV_SUPPORT _cg_uv_cleanup(dev); #endif cg_object_unref(dev->display); cg_object_unref(dev->renderer); c_free(dev); }
static void load_ui(rig_slave_t *slave) { Rig__LoadResult result = RIG__LOAD_RESULT__INIT; rig_engine_t *engine = slave->engine; float width, height; rig_pb_unserializer_t *unserializer; const Rig__UI *pb_ui = slave->pending_ui_load; rig_ui_t *ui; c_return_if_fail(pb_ui != NULL); if (slave->edit_id_to_play_object_map) { rig_engine_set_play_mode_ui(engine, NULL); c_hash_table_destroy(slave->edit_id_to_play_object_map); slave->edit_id_to_play_object_map = NULL; c_hash_table_destroy(slave->play_object_to_edit_id_map); slave->play_object_to_edit_id_map = NULL; } slave->edit_id_to_play_object_map = c_hash_table_new_full(c_int64_hash, c_int64_equal, /* key equal */ free_object_id, /* key destroy */ NULL); /* value destroy */ /* Note: we don't have a free function for the value because we * share object_ids between both hash-tables and need to be * careful not to double free them. */ slave->play_object_to_edit_id_map = c_hash_table_new(NULL, /* direct hash */ NULL); /* direct key equal */ unserializer = rig_pb_unserializer_new(engine); rig_pb_unserializer_set_object_register_callback( unserializer, register_edit_object_cb, slave); rig_pb_unserializer_set_id_to_object_callback( unserializer, lookup_object_cb, slave); ui = rig_pb_unserialize_ui(unserializer, pb_ui); rig_pb_unserializer_destroy(unserializer); rig_engine_set_play_mode_ui(engine, ui); rig_frontend_reload_simulator_ui(slave->frontend, ui, true /* play mode */); if (slave->request_width > 0 && slave->request_height > 0) { width = slave->request_width; height = slave->request_height; } else if (slave->request_scale) { width = engine->device_width * slave->request_scale; height = engine->device_height * slave->request_scale; } else { width = engine->device_width / 2; height = engine->device_height / 2; } rig_engine_set_onscreen_size(engine, width, height); rig_engine_op_apply_context_set_ui(&slave->apply_op_ctx, ui); slave->pending_ui_load_closure(&result, slave->pending_ui_load_closure_data); slave->pending_ui_load = NULL; slave->pending_ui_load_closure = NULL; slave->pending_ui_load_closure_data = NULL; }