int etna_vidmem_alloc_linear(etna_vidmem **mem_out, size_t bytes, gceSURF_TYPE type, gcePOOL pool, bool lock) { if(mem_out == NULL) return ETNA_INVALID_ADDR; etna_vidmem *mem = ETNA_NEW(etna_vidmem); if(mem == NULL) return ETNA_OUT_OF_MEMORY; mem->type = type; if(viv_alloc_linear_vidmem(bytes, ETNA_VIDMEM_ALIGNMENT, type, pool, &mem->node, &mem->size)!=0) { #ifdef DEBUG fprintf(stderr, "Error allocating render target tile status memory\n"); #endif return ETNA_OUT_OF_MEMORY; } #ifdef DEBUG printf("Allocated: node=%08x size=%08x\n", (uint32_t)mem->node, mem->size); #endif if(lock) { int status = etna_vidmem_lock(mem); if(status != ETNA_OK) { etna_vidmem_free(mem); return status; } } *mem_out = mem; return ETNA_OK; }
static void etna_screen_resource_destroy(struct pipe_screen *screen, struct pipe_resource *resource_) { struct etna_screen *priv = etna_screen(screen); struct etna_resource *resource = etna_resource(resource_); if(resource == NULL) return; if(resource->last_ctx != NULL) { /* XXX This could fail when multiple contexts share this resource, * (the last one to bind it will "own" it) or fail miserably if * the context was since destroyed. */ struct etna_pipe_context *ectx = resource->last_ctx; DBG_F(ETNA_DBG_RESOURCE_MSGS, "%p: resource queued destroyed (%ix%ix%i)", resource, resource_->width0, resource_->height0, resource_->depth0); etna_vidmem_queue_free(ectx->ctx->queue, resource->surface); etna_vidmem_queue_free(ectx->ctx->queue, resource->ts); } else { DBG_F(ETNA_DBG_RESOURCE_MSGS, "%p: resource destroyed (%ix%ix%i)", resource, resource_->width0, resource_->height0, resource_->depth0); etna_vidmem_free(priv->dev, resource->surface); etna_vidmem_free(priv->dev, resource->ts); } FREE(resource); }