diff options
author | Wladimir J. van der Laan <laanwj@gmail.com> | 2013-10-14 19:54:04 +0200 |
---|---|---|
committer | Wladimir J. van der Laan <laanwj@gmail.com> | 2013-10-14 21:13:28 +0200 |
commit | a9210fb96d3403db0e2b932e4b0a28b9e7bd90d9 (patch) | |
tree | 9f22b0bc4d4c908aa56987838fd4112df7e1493e | |
parent | 2fbfe6c8f0ea3e636e60d09a742c6bf18e710b44 (diff) |
driver: use etna_bo_from_fbdev to get at framebuffer
etna_screen can now render to any buffer object
-rw-r--r-- | src/driver/etna_screen.c | 4 | ||||
-rw-r--r-- | src/driver/etna_screen.h | 3 | ||||
-rw-r--r-- | src/etnaviv/etna_bo.c | 28 | ||||
-rw-r--r-- | src/etnaviv/etna_bo.h | 4 |
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); |