diff options
author | Wladimir J. van der Laan <laanwj@gmail.com> | 2013-10-17 08:03:51 +0200 |
---|---|---|
committer | Wladimir J. van der Laan <laanwj@gmail.com> | 2013-10-17 08:05:20 +0200 |
commit | 84a59848f1df3a9c28a35dc3d18e24ea69ac1b7b (patch) | |
tree | 77b9bf53a401a7c2cbbf7f54c85f36b54c863435 | |
parent | c78f82f36d6256491cfb9f24c02bce04677ed0b4 (diff) |
etnaviv: support importing external vidmem nodes
Add support for importing external jgckVIDMEM nodes.
This could be used to experiment with transferring textures between
processes, at least until the new kernel driver.
-rw-r--r-- | src/etnaviv/etna_bo.c | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/src/etnaviv/etna_bo.c b/src/etnaviv/etna_bo.c index df23e18..8c6069e 100644 --- a/src/etnaviv/etna_bo.c +++ b/src/etnaviv/etna_bo.c @@ -38,6 +38,7 @@ enum etna_bo_type { ETNA_BO_TYPE_VIDMEM, /* Main vidmem */ + ETNA_BO_TYPE_VIDMEM_EXTERNAL, /* Main vidmem, external handle */ ETNA_BO_TYPE_USERMEM, /* Mapped user memory */ ETNA_BO_TYPE_CONTIGUOUS,/* Contiguous memory */ ETNA_BO_TYPE_PHYSICAL /* Mmap-ed physical memory */ @@ -208,8 +209,20 @@ error: struct etna_bo *etna_bo_from_name(struct viv_conn *conn, uint32_t name) { - /* TODO */ - return NULL; + struct etna_bo *mem = ETNA_CALLOC_STRUCT(etna_bo); + if(mem == NULL) return NULL; + + mem->bo_type = ETNA_BO_TYPE_VIDMEM_EXTERNAL; + mem->node = (viv_node_t)name; + + /* Lock to this address space */ + int status = etna_bo_lock(conn, mem); + if(status != ETNA_OK) + { + free(mem); + return NULL; + } + return mem; } struct etna_bo *etna_bo_ref(struct etna_bo *bo) @@ -245,6 +258,12 @@ int etna_bo_del(struct viv_conn *conn, struct etna_bo *mem, struct etna_queue *q } } 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) { @@ -275,14 +294,13 @@ int etna_bo_del(struct viv_conn *conn, struct etna_bo *mem, struct etna_queue *q int etna_bo_get_name(struct etna_bo *bo, uint32_t *name) { - /* TODO */ - return -1; + *name = (uint32_t)bo->node; + return 0; } uint32_t etna_bo_handle(struct etna_bo *bo) { - /* TODO */ - return 0; + return (uint32_t)bo->node; } uint32_t etna_bo_size(struct etna_bo *bo) |