Beispiel #1
0
static gboolean
ufo_refeed_task_process (UfoTask *task,
                         UfoBuffer **inputs,
                         UfoBuffer *output,
                         UfoRequisition *requisition)
{
    UfoRefeedTaskPrivate *priv;

    priv = UFO_REFEED_TASK_GET_PRIVATE (task);

    priv->buffers = g_list_append (priv->buffers, ufo_buffer_dup (inputs[0]));
    ufo_buffer_copy (inputs[0], output);
    return TRUE;
}
Beispiel #2
0
static gboolean
ufo_refeed_task_generate (UfoTask *task,
                          UfoBuffer *output,
                          UfoRequisition *requisition)
{
    UfoRefeedTaskPrivate *priv;

    priv = UFO_REFEED_TASK_GET_PRIVATE (task);

    if (priv->current == NULL)
        return FALSE;

    ufo_buffer_copy (UFO_BUFFER (priv->current->data), output);
    priv->current = g_list_next (priv->current);
    return TRUE;
}
Beispiel #3
0
static gboolean
ufo_ir_sart_process_real (UfoMethod *method,
                          UfoBuffer *input,
                          UfoBuffer *output)
{
    UfoIrSARTPrivate *priv = UFO_IR_SART_GET_PRIVATE (method);

    UfoResources *resources = NULL;
    UfoProjector *projector = NULL;
    gpointer     *cmd_queue = NULL;
    gfloat        relaxation_factor = 0;
    guint         max_iterations = 0;
    g_object_get (method,
                  "ufo-resources", &resources,
                  "command-queue", &cmd_queue,
                  "projection-model", &projector,
                  "relaxation-factor", &relaxation_factor,
                  "max-iterations", &max_iterations,
                  NULL);

    UfoGeometry *geometry = NULL;
    g_object_get (projector, "geometry", &geometry, NULL);

    //
    // resize
    UfoBuffer **method_buffers[4] = {
        &priv->singular_volume,
        &priv->singular_sino,
        &priv->ray_weights,
        &priv->b_temp
    };
    UfoBuffer *ref_buffers[4] = {
        output,
        input,
        input,
        input
    };
    for (guint i = 0; i < 4; ++i) {
        UfoRequisition _req;
        if (*method_buffers[i]) {
            ufo_buffer_get_requisition (ref_buffers[i], &_req);
            ufo_buffer_resize (*method_buffers[i], &_req);
        } else {
            *method_buffers[i] = ufo_buffer_dup (ref_buffers [i]);
        }
    }
    ufo_op_set (priv->singular_volume, 1.0f, resources, cmd_queue);
    ufo_op_set (priv->singular_sino, 1.0f, resources, cmd_queue);
    ufo_op_set (priv->ray_weights, 0, resources, cmd_queue);

    guint n_subsets = 0;
    UfoProjectionsSubset *subset = generate_subsets (geometry, &n_subsets);

    for (guint i = 0 ; i < n_subsets; ++i) {
        ufo_projector_FP (projector,
                          priv->singular_volume,
                          priv->ray_weights,
                          &subset[i],
                          1.0f,
                          NULL);
    }

    ufo_op_inv (priv->ray_weights, resources, cmd_queue);

    guint iteration = 0;
    while (iteration < max_iterations) {
        ufo_buffer_copy (input, priv->b_temp);
        for (guint i = 0 ; i < n_subsets; i++) {
            ufo_projector_FP (projector,
                              output,
                              priv->b_temp,
                              &subset[i],
                              -1.0f,
                              NULL);

            ufo_op_mul_rows (priv->b_temp,
                             priv->ray_weights,
                             priv->b_temp,
                             subset[i].offset,
                             subset[i].n,
                             resources,
                             cmd_queue);

            ufo_projector_BP (projector,
                              output,
                              priv->b_temp,
                              &subset[i],
                              relaxation_factor,
                              NULL);
        }
        iteration++;
    }

    return TRUE;
}
Beispiel #4
0
static void
test_create_lots_of_buffers (Fixture *fixture,
                             gconstpointer unused)
{
    gint num_buffers = 10000;
    UfoConfig *config = ufo_config_new ();
    UfoResources *resources = ufo_resources_new (config, NULL);
    gpointer context = ufo_resources_get_context (resources);

    UfoRequisition requisition = {
        .n_dims = 2,
        .dims[0] = 800,
        .dims[1] = 800
    };

    while (num_buffers-- > 0) {
        UfoBuffer *buffer = ufo_buffer_new (&requisition, NULL, context);
        gpointer device_array = ufo_buffer_get_device_array (buffer, NULL);
        ufo_buffer_discard_location (buffer);
        g_assert (device_array != NULL);
        g_object_unref (buffer);
    }
}

static void
test_copy_lots_of_buffers (Fixture *fixture,
                           gconstpointer *unused)
{
    gint num_buffers = 10000;
    UfoConfig *config = ufo_config_new ();
    UfoResources *resources = ufo_resources_new (config, NULL);
    gpointer context = ufo_resources_get_context (resources);

    UfoRequisition requisition = {
        .n_dims = 2,
        .dims[0] = 800,
        .dims[1] = 800
    };

    // TODO enforce copy between GPUs
    UfoBuffer *src = ufo_buffer_new (&requisition, NULL, context);
    UfoBuffer *dest = ufo_buffer_new (&requisition, NULL, context);

    while (num_buffers-- > 0) {
        g_debug("copy");
        ufo_buffer_copy (src, dest);
    }

}
static void
test_convert_8 (Fixture *fixture,
                gconstpointer unused)
{
    gfloat *host_data;

    host_data = ufo_buffer_get_host_array (fixture->buffer, NULL);
    g_memmove (host_data, fixture->data8, fixture->n_data);

    ufo_buffer_convert (fixture->buffer, UFO_BUFFER_DEPTH_8U);
    host_data = ufo_buffer_get_host_array (fixture->buffer, NULL);

    for (guint i = 0; i < fixture->n_data; i++)
        g_assert (host_data[i] == ((gfloat) fixture->data8[i]));
}