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; }
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); }
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; }
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); }