static void
free_spans(cg_texture_2d_sliced_t *tex_2ds)
{
    if (tex_2ds->slice_x_spans != NULL) {
        c_array_free(tex_2ds->slice_x_spans, true);
        tex_2ds->slice_x_spans = NULL;
    }

    if (tex_2ds->slice_y_spans != NULL) {
        c_array_free(tex_2ds->slice_y_spans, true);
        tex_2ds->slice_y_spans = NULL;
    }
}
Exemple #2
0
void
_cg_destroy_texture_units(cg_device_t *dev)
{
    int i;

    for (i = 0; i < dev->texture_units->len; i++) {
        cg_texture_unit_t *unit =
            &c_array_index(dev->texture_units, cg_texture_unit_t, i);
        texture_unit_free(unit);
    }
    c_array_free(dev->texture_units, true);
}
static void
free_slices(cg_texture_2d_sliced_t *tex_2ds)
{
    if (tex_2ds->slice_textures != NULL) {
        int i;

        for (i = 0; i < tex_2ds->slice_textures->len; i++) {
            cg_texture_2d_t *slice_tex =
                c_array_index(tex_2ds->slice_textures, cg_texture_2d_t *, i);
            cg_object_unref(slice_tex);
        }

        c_array_free(tex_2ds->slice_textures, true);
    }
Exemple #4
0
void
rig_pb_stream_disconnect(rig_pb_stream_t *stream)
{
    switch (stream->type)
    {
#ifdef USE_UV
    case STREAM_TYPE_FD:
        uv_read_stop((uv_stream_t *)&stream->fd.uv_fd_pipe);
        uv_close((uv_handle_t *)&stream->fd.uv_fd_pipe,
                 NULL /* closed callback */);
        break;
    case STREAM_TYPE_TCP:
        uv_read_stop((uv_stream_t *)&stream->tcp.socket);
        uv_close((uv_handle_t *)&stream->tcp.socket,
                 NULL /* closed callback */);
        break;
#endif
    case STREAM_TYPE_BUFFER:
        {
            int i;

            /* Give all incoming write closures back to the other end
             * so they can be freed */
            for (i = 0; i < stream->buffer.incoming_write_closures->len; i++) {
                rig_pb_stream_write_closure_t *closure =
                    c_array_index(stream->buffer.incoming_write_closures, void *, i);

                c_array_append_val(stream->buffer.other_end->buffer.finished_write_closures,
                                   closure);
            }
            c_array_free(stream->buffer.incoming_write_closures,
                         true /* free storage */);
            stream->buffer.incoming_write_closures = NULL;

            drain_finished_write_closures(stream);

            c_array_free(stream->buffer.finished_write_closures,
                         true /* free storage */);
            stream->buffer.finished_write_closures = NULL;

            stream->buffer.other_end->buffer.other_end = NULL;
            stream->buffer.other_end = NULL;
        }

        if (stream->buffer.read_idle) {
            rut_poll_shell_remove_idle_FIXME(stream->shell, stream->buffer.read_idle);
            stream->buffer.read_idle = NULL;
        }
        break;

#ifdef __EMSCRIPTEN__
    case STREAM_TYPE_WORKER_IPC:
        stream->worker_ipc.worker = 0;
        break;

    case STREAM_TYPE_WEBSOCKET_CLIENT:
        if (stream->websocket_client.socket != -1) {
            close(stream->websocket_client.socket);
            stream->websocket_client.socket = -1;
        }
        break;
#endif

#ifdef USE_UV
    case STREAM_TYPE_WEBSOCKET_SERVER:
        stream->websocket_server.ctx = NULL;
        break;
#endif

    case STREAM_TYPE_DISCONNECTED:

#ifdef USE_UV
        if (stream->resolving)
            uv_cancel((uv_req_t *)&stream->resolver);
        if (stream->connecting)
            uv_cancel((uv_req_t *)&stream->connection_request);
#endif

        return;
    }

    stream->type = STREAM_TYPE_DISCONNECTED;

    rut_closure_list_invoke(&stream->on_error_closures,
                            rig_pb_stream_callback_t,
                            stream);
}
Exemple #5
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);
}