summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2013-10-17 08:03:51 +0200
committerWladimir J. van der Laan <laanwj@gmail.com>2013-10-17 08:05:20 +0200
commit84a59848f1df3a9c28a35dc3d18e24ea69ac1b7b (patch)
tree77b9bf53a401a7c2cbbf7f54c85f36b54c863435
parentc78f82f36d6256491cfb9f24c02bce04677ed0b4 (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.c30
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)