Esempio n. 1
0
int etna_free(struct etna_ctx *ctx)
{
    if(ctx == NULL)
        return ETNA_INVALID_ADDR;
    /* Free kernel command queue */
    etna_queue_free(ctx->queue);
#ifdef GCABI_HAS_CONTEXT
    /* Free context buffer */
    etna_bo_del(ctx->conn, ctx->ctx_bo, NULL);
#endif
    /* Free command buffers */
    for(int x=0; x<NUM_COMMAND_BUFFERS; ++x)
    {
        viv_user_signal_destroy(ctx->conn, ctx->cmdbufi[x].sig_id);
        etna_bo_del(ctx->conn, ctx->cmdbufi[x].bo, NULL);
        ETNA_FREE(ctx->cmdbuf[x]);
    }
    viv_user_signal_destroy(ctx->conn, ctx->sig_id);
#ifndef GCABI_HAS_CONTEXT
    gpu_context_free(ctx);
#endif

    ETNA_FREE(ctx);
    return ETNA_OK;
}
Esempio n. 2
0
void etna_screen_destroy_fence(struct pipe_screen *screen_h, struct etna_fence *fence)
{
    struct etna_screen *screen = etna_screen(screen_h);
    if(viv_user_signal_destroy(screen->dev, fence->signal) != VIV_STATUS_OK)
    {
        BUG("cannot destroy signal %i", fence->signal);
    }
    FREE(fence);
}
Esempio n. 3
0
int etna_fence_new(struct pipe_screen *screen_h, struct etna_ctx *ctx, struct pipe_fence_handle **fence_p)
{
    struct etna_fence *fence = NULL;
    struct etna_screen *screen = etna_screen(screen_h);
    int rv;

    /* XXX we do not release the fence_p reference here -- neither do the other drivers,
     * and clients don't seem to rely on this. */
    if(fence_p == NULL)
        return ETNA_INVALID_ADDR;
    assert(*fence_p == NULL);

    /* re-use old fence, if available, and reset it first */
    pipe_mutex_lock(screen->fence_mutex);
    if(screen->fence_freelist != NULL)
    {
        fence = screen->fence_freelist;
        screen->fence_freelist = fence->next_free;
        fence->next_free = NULL;
    }
    pipe_mutex_unlock(screen->fence_mutex);

    if(fence != NULL)
    {
        if((rv = viv_user_signal_signal(ctx->conn, fence->signal, 0)) != VIV_STATUS_OK)
        {
            BUG("Error: could not reset signal %i", fence->signal);
            etna_screen_destroy_fence(screen_h, fence);
            return rv;
        }
        fence->signalled = false;
    } else {
        fence = CALLOC_STRUCT(etna_fence);
        /* Create signal with manual reset; we want to be able to probe it
         * or wait for it without resetting it.
         */
        if((rv = viv_user_signal_create(ctx->conn, /* manualReset */ true, &fence->signal)) != VIV_STATUS_OK)
        {
            FREE(fence);
            return rv;
        }
    }
    if((rv = etna_queue_signal(ctx->queue, fence->signal, VIV_WHERE_PIXEL)) != ETNA_OK)
    {
        BUG("error queueing signal %i", fence->signal);
        viv_user_signal_destroy(ctx->conn, fence->signal);
        FREE(fence);
        return rv;
    }
    pipe_reference_init(&fence->reference, 1);
    *fence_p = (struct pipe_fence_handle*)fence;
    return ETNA_OK;
}
Esempio n. 4
0
static void etna_bswap_destroy_buffer(etna_bswap_buffer *buf)
{
    (void)pthread_mutex_destroy(&buf->available_mutex);
    (void)pthread_cond_destroy(&buf->available_cond);
    (void)viv_user_signal_destroy(buf->sig_id_ready);
}