summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2013-10-14 19:54:04 +0200
committerWladimir J. van der Laan <laanwj@gmail.com>2013-10-14 21:13:28 +0200
commita9210fb96d3403db0e2b932e4b0a28b9e7bd90d9 (patch)
tree9f22b0bc4d4c908aa56987838fd4112df7e1493e /src
parent2fbfe6c8f0ea3e636e60d09a742c6bf18e710b44 (diff)
downloadetna_viv-a9210fb96d3403db0e2b932e4b0a28b9e7bd90d9.tar.gz
etna_viv-a9210fb96d3403db0e2b932e4b0a28b9e7bd90d9.tar.xz
driver: use etna_bo_from_fbdev to get at framebuffer
etna_screen can now render to any buffer object
Diffstat (limited to 'src')
-rw-r--r--src/driver/etna_screen.c4
-rw-r--r--src/driver/etna_screen.h3
-rw-r--r--src/etnaviv/etna_bo.c28
-rw-r--r--src/etnaviv/etna_bo.h4
4 files changed, 30 insertions, 9 deletions
diff --git a/src/driver/etna_screen.c b/src/driver/etna_screen.c
index 7d21d37..6a8f2bf 100644
--- a/src/driver/etna_screen.c
+++ b/src/driver/etna_screen.c
@@ -478,7 +478,7 @@ static void etna_screen_flush_frontbuffer( struct pipe_screen *screen,
.source_stride = rt_resource->levels[level].stride,
.dest_format = drawable->rs_format,
.dest_tiling = ETNA_LAYOUT_LINEAR,
- .dest_addr = drawable->addr,
+ .dest_addr = etna_bo_gpu_address(drawable->bo),
.dest_stride = drawable->stride,
.downsample_x = msaa_xscale > 1,
.downsample_y = msaa_yscale > 1,
@@ -492,7 +492,7 @@ static void etna_screen_flush_frontbuffer( struct pipe_screen *screen,
DBG_F(ETNA_DBG_FRAME_MSGS,
"Queued RS command to flush screen from %08x to %08x stride=%08x width=%i height=%i, ctx %p",
etna_bo_gpu_address(rt_resource->bo) + rt_resource->levels[level].offset,
- drawable->addr, drawable->stride,
+ etna_bo_gpu_address(drawable->bo), drawable->stride,
drawable->width, drawable->height, ctx);
ectx->base.flush(&ectx->base, &drawable->fence, 0);
}
diff --git a/src/driver/etna_screen.h b/src/driver/etna_screen.h
index 074f0ff..80ccd2c 100644
--- a/src/driver/etna_screen.h
+++ b/src/driver/etna_screen.h
@@ -29,6 +29,7 @@
#include "os/os_thread.h"
struct viv_conn;
+struct etna_bo;
#define ETNA_SCREEN_NAME_LEN (64)
/* Gallium screen structure for etna driver.
@@ -48,7 +49,7 @@ struct etna_rs_target
unsigned rs_format;
bool swap_rb;
unsigned width, height;
- size_t addr; /* GPU address */
+ struct etna_bo *bo;
size_t stride;
struct pipe_fence_handle *fence;
};
diff --git a/src/etnaviv/etna_bo.c b/src/etnaviv/etna_bo.c
index 0231896..df23e18 100644
--- a/src/etnaviv/etna_bo.c
+++ b/src/etnaviv/etna_bo.c
@@ -27,6 +27,9 @@
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <linux/fb.h>
#include "gc_abi.h"
@@ -37,7 +40,7 @@ enum etna_bo_type {
ETNA_BO_TYPE_VIDMEM, /* Main vidmem */
ETNA_BO_TYPE_USERMEM, /* Mapped user memory */
ETNA_BO_TYPE_CONTIGUOUS,/* Contiguous memory */
- ETNA_BO_TYPE_PHYSICAL /* Direct physical mapping */
+ ETNA_BO_TYPE_PHYSICAL /* Mmap-ed physical memory */
};
/* Structure describing a block of video or user memory */
@@ -183,9 +186,23 @@ struct etna_bo *etna_bo_from_usermem(struct viv_conn *conn, void *memory, size_t
return mem;
}
-struct etna_bo *etna_bo_from_fbdev(struct viv_conn *conn, size_t offset, size_t size)
+struct etna_bo *etna_bo_from_fbdev(struct viv_conn *conn, int fd, size_t offset, size_t size)
{
- /* TODO */
+ struct fb_fix_screeninfo finfo;
+ struct etna_bo *mem = ETNA_CALLOC_STRUCT(etna_bo);
+ if(mem == NULL) return NULL;
+
+ if(ioctl(fd, FBIOGET_FSCREENINFO, &finfo))
+ goto error;
+
+ mem->bo_type = ETNA_BO_TYPE_PHYSICAL;
+ if((mem->logical = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, offset)) == NULL)
+ goto error;
+ mem->address = finfo.smem_start + offset;
+ mem->size = size;
+ return mem;
+error:
+ ETNA_FREE(mem);
return NULL;
}
@@ -246,7 +263,10 @@ int etna_bo_del(struct viv_conn *conn, struct etna_bo *mem, struct etna_queue *q
}
break;
case ETNA_BO_TYPE_PHYSICAL:
- /* Nothing to do */
+ if(munmap(mem->logical, mem->size) < 0)
+ {
+ rv = ETNA_OUT_OF_MEMORY;
+ }
break;
}
ETNA_FREE(mem);
diff --git a/src/etnaviv/etna_bo.h b/src/etnaviv/etna_bo.h
index 750d291..0b65a76 100644
--- a/src/etnaviv/etna_bo.h
+++ b/src/etnaviv/etna_bo.h
@@ -65,8 +65,8 @@ struct etna_bo *etna_bo_new(struct viv_conn *conn, size_t bytes, uint32_t flags)
/* Map user memory into GPU memory space */
struct etna_bo *etna_bo_from_usermem(struct viv_conn *conn, void *memory, size_t size);
-/* Buffer object from framebuffer */
-struct etna_bo *etna_bo_from_fbdev(struct viv_conn *conn, size_t offset, size_t size);
+/* Buffer object from framebuffer range */
+struct etna_bo *etna_bo_from_fbdev(struct viv_conn *conn, int fd, size_t offset, size_t size);
/* Buffer object from flink name */
struct etna_bo *etna_bo_from_name(struct viv_conn *conn, uint32_t name);