int etna_bo_del(struct viv_conn *conn, struct etna_bo *mem, struct etna_queue *queue) { int rv = ETNA_OK; if(mem == NULL) return ETNA_OK; switch(mem->bo_type) { case ETNA_BO_TYPE_VIDMEM: if(mem->logical != NULL) { if((rv = etna_bo_unlock(conn, mem, queue)) != ETNA_OK) { printf("etna: Warning: could not unlock memory\n"); } } if(queue) { if((rv = etna_queue_free_vidmem(queue, mem->node)) != ETNA_OK) { printf("etna: Warning: could not queue free video memory\n"); } } else { if((rv = viv_free_vidmem(conn, mem->node)) != ETNA_OK) { printf("etna: Warning: could not free video memory\n"); } } break; case ETNA_BO_TYPE_VIDMEM_EXTERNAL: if((rv = etna_bo_unlock(conn, mem, queue)) != ETNA_OK) { printf("etna: Warning: could not unlock memory\n"); } break; case ETNA_BO_TYPE_USERMEM: if(queue) { rv = etna_queue_unmap_user_memory(queue, mem->logical, mem->size, mem->usermem_info, mem->address); } else { rv = viv_unmap_user_memory(conn, mem->logical, mem->size, mem->usermem_info, mem->address); } break; case ETNA_BO_TYPE_CONTIGUOUS: if(queue) { rv = etna_queue_free_contiguous(queue, mem->size, mem->address, mem->logical); } else { rv = viv_free_contiguous(conn, mem->size, mem->address, mem->logical); } break; case ETNA_BO_TYPE_PHYSICAL: if(munmap(mem->logical, mem->size) < 0) { rv = ETNA_OUT_OF_MEMORY; } break; } ETNA_FREE(mem); return rv; }
int etna_vidmem_free(etna_vidmem *mem) { if(mem == NULL) return ETNA_INVALID_ADDR; viv_free_vidmem(mem->node); free(mem); return ETNA_OK; }