Esempio n. 1
0
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);
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
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;
}