summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Makefile.inc5
-rw-r--r--src/driver/etna_pipe.h6
-rw-r--r--src/driver/etna_resource.c38
-rw-r--r--src/driver/etna_screen.c4
-rw-r--r--src/driver/etna_screen.h3
-rw-r--r--src/driver/etna_transfer.c4
-rw-r--r--src/etnaviv/etna.c13
-rw-r--r--src/etnaviv/etna_bo.c58
-rw-r--r--src/etnaviv/etna_bo.h4
-rw-r--r--src/fb/alpha_blend.c2
-rw-r--r--src/fb/cube_companion.c2
-rw-r--r--src/fb/cubemap_sphere.c2
-rw-r--r--src/fb/displacement.c2
-rw-r--r--src/fb/mip_cube.c2
-rw-r--r--src/fb/particle_system.c2
-rw-r--r--src/fb/ps_sandbox.c2
-rw-r--r--src/fb/rotate_cube.c2
-rw-r--r--src/fb/stencil_test.c2
-rw-r--r--src/fb_old/cube_companion.c2
-rw-r--r--src/fb_rawshader/alpha_blend.c2
-rw-r--r--src/fb_rawshader/cube_companion.c2
-rw-r--r--src/fb_rawshader/cubemap_sphere.c2
-rw-r--r--src/fb_rawshader/displacement.c2
-rw-r--r--src/fb_rawshader/mip_cube.c2
-rw-r--r--src/fb_rawshader/particle_system.c2
-rw-r--r--src/fb_rawshader/rotate_cube.c2
-rw-r--r--src/fb_rawshader/stencil_test.c2
-rw-r--r--src/lib/fbdemos.c30
-rw-r--r--src/lib/fbdemos.h10
29 files changed, 117 insertions, 94 deletions
diff --git a/src/Makefile.inc b/src/Makefile.inc
index d1f590f..951beea 100644
--- a/src/Makefile.inc
+++ b/src/Makefile.inc
@@ -1,4 +1,7 @@
-GCABI ?= v2
+ifndef GCABI
+$(error GCABI is undefined. Consult the README.md file to set it according to your kernel)
+endif
+
PLATFORM_GL_LIBS ?= -lEGL -lGLESv2
CC = $(GCCPREFIX)gcc
diff --git a/src/driver/etna_pipe.h b/src/driver/etna_pipe.h
index dc13d7d..54a113a 100644
--- a/src/driver/etna_pipe.h
+++ b/src/driver/etna_pipe.h
@@ -64,13 +64,13 @@ struct etna_resource_level
unsigned width, padded_width;
unsigned height, padded_height;
unsigned offset; /* offset into memory area */
- unsigned size; /* size of memory area */
+ uint32_t stride; /* row stride */
+ uint32_t layer_stride; /* layer stride */
+ unsigned size; /* total size of memory area */
uint32_t ts_offset;
uint32_t ts_size;
uint32_t clear_value; /* clear value of resource level (mainly for TS) */
- uint32_t stride; /* VIVS_PE_(COLOR|DEPTH)_STRIDE */
- uint32_t layer_stride;
};
struct etna_resource
diff --git a/src/driver/etna_resource.c b/src/driver/etna_resource.c
index 6f07eef..4782804 100644
--- a/src/driver/etna_resource.c
+++ b/src/driver/etna_resource.c
@@ -110,9 +110,6 @@ static struct pipe_resource * etna_screen_resource_create(struct pipe_screen *sc
{
struct etna_screen *priv = etna_screen(screen);
assert(templat);
- unsigned element_size = util_format_get_blocksize(templat->format);
- if(!element_size)
- return NULL;
/* Check input */
if(templat->target == PIPE_TEXTURE_CUBE)
@@ -165,7 +162,7 @@ static struct pipe_resource * etna_screen_resource_create(struct pipe_screen *sc
if(!translate_samples_to_xyscale(nr_samples, &msaa_xscale, &msaa_yscale, NULL))
{
/* Number of samples not supported */
- assert(0);
+ return NULL;
}
/* Determine needed padding (alignment of height/width) */
@@ -177,18 +174,12 @@ static struct pipe_resource * etna_screen_resource_create(struct pipe_screen *sc
&paddingX, &paddingY, &halign);
assert(paddingX && paddingY);
- /* determine mipmap levels */
+ /* compute mipmap level sizes and offsets */
struct etna_resource *resource = CALLOC_STRUCT(etna_resource);
int max_mip_level = templat->last_level;
if(unlikely(max_mip_level >= ETNA_NUM_LOD)) /* max LOD supported by hw */
max_mip_level = ETNA_NUM_LOD - 1;
- /* take care about DXTx formats, which have a divSize of non-1x1
- * also: lower mipmaps are still 4x4 due to tiling. In as sense, compressed formats are already tiled.
- * XXX UYVY formats?
- */
- unsigned divSizeX = util_format_get_blockwidth(templat->format);
- unsigned divSizeY = util_format_get_blockheight(templat->format);
unsigned ix = 0;
unsigned x = templat->width0, y = templat->height0;
unsigned offset = 0;
@@ -199,10 +190,9 @@ static struct pipe_resource * etna_screen_resource_create(struct pipe_screen *sc
mip->height = y;
mip->padded_width = align(x * msaa_xscale, paddingX);
mip->padded_height = align(y * msaa_yscale, paddingY);
- mip->stride = align(mip->padded_width, divSizeX)/divSizeX * element_size;
+ mip->stride = util_format_get_stride(templat->format, mip->padded_width);
mip->offset = offset;
- mip->layer_stride = align(mip->padded_width, divSizeX)/divSizeX *
- align(mip->padded_height, divSizeY)/divSizeY * element_size;
+ mip->layer_stride = mip->stride * util_format_get_nblocksy(templat->format, mip->padded_height);
mip->size = templat->array_size * mip->layer_stride;
offset += align(mip->size, ETNA_PE_ALIGNMENT); /* align mipmaps to 64 bytes to be able to render to them */
if(ix == max_mip_level || (x == 1 && y == 1))
@@ -212,9 +202,6 @@ static struct pipe_resource * etna_screen_resource_create(struct pipe_screen *sc
ix += 1;
}
- /* Determine memory size, and whether to create a tile status */
- size_t rt_size = offset;
-
/* determine memory type */
uint32_t flags = 0; /* XXX DRM_ETNA_GEM_CACHE_xxx */
enum viv_surf_type memtype = VIV_SURF_UNKNOWN;
@@ -228,14 +215,13 @@ static struct pipe_resource * etna_screen_resource_create(struct pipe_screen *sc
flags |= DRM_ETNA_GEM_TYPE_IDX;
else if(templat->bind & PIPE_BIND_VERTEX_BUFFER)
flags |= DRM_ETNA_GEM_TYPE_VTX;
-
- DBG_F(ETNA_DBG_RESOURCE_MSGS, "%p: Allocate surface of %ix%i (padded to %ix%i) of format %s (%i bpe %ix%i), size %08x flags %08x, memtype %i",
+ DBG_F(ETNA_DBG_RESOURCE_MSGS, "%p: Allocate surface of %ix%i (padded to %ix%i), %i layers, of format %s, size %08x flags %08x, memtype %i",
resource,
- templat->width0, templat->height0, resource->levels[0].padded_width, resource->levels[0].padded_height, util_format_name(templat->format),
- element_size, divSizeX, divSizeY, rt_size, templat->bind, memtype);
+ templat->width0, templat->height0, resource->levels[0].padded_width, resource->levels[0].padded_height, templat->array_size, util_format_name(templat->format),
+ offset, templat->bind, memtype);
- struct etna_bo *rt = 0;
- if(unlikely((rt = etna_bo_new(priv->dev, rt_size, flags)) == NULL))
+ struct etna_bo *bo = 0;
+ if(unlikely((bo = etna_bo_new(priv->dev, offset, flags)) == NULL))
{
BUG("Problem allocating video memory for resource");
return NULL;
@@ -247,14 +233,14 @@ static struct pipe_resource * etna_screen_resource_create(struct pipe_screen *sc
resource->base.nr_samples = nr_samples;
resource->layout = layout;
resource->halign = halign;
- resource->bo = rt;
+ resource->bo = bo;
resource->ts_bo = 0; /* TS is only created when first bound to surface */
pipe_reference_init(&resource->base.reference, 1);
if(DBG_ENABLED(ETNA_DBG_ZERO))
{
- void *map = etna_bo_map(resource->bo);
- memset(map, 0, rt_size);
+ void *map = etna_bo_map(bo);
+ memset(map, 0, offset);
}
return &resource->base;
diff --git a/src/driver/etna_screen.c b/src/driver/etna_screen.c
index aff9ad6..f381c7d 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/driver/etna_transfer.c b/src/driver/etna_transfer.c
index 56631d4..4d22e5e 100644
--- a/src/driver/etna_transfer.c
+++ b/src/driver/etna_transfer.c
@@ -140,7 +140,7 @@ static void *etna_pipe_transfer_map(struct pipe_context *pipe,
{
if(resource_priv->layout == ETNA_LAYOUT_TILED && !util_format_is_compressed(resource_priv->base.format))
{
- etna_texture_untile(ptrans->buffer, mapped,
+ etna_texture_untile(ptrans->buffer, mapped + ptrans->base.box.z * res_level->layer_stride,
ptrans->base.box.x, ptrans->base.box.y, res_level->stride,
ptrans->base.box.width, ptrans->base.box.height, ptrans->base.stride,
util_format_get_blocksize(resource_priv->base.format));
@@ -198,7 +198,7 @@ static void etna_pipe_transfer_unmap(struct pipe_context *pipe,
{
if(resource->layout == ETNA_LAYOUT_TILED && !util_format_is_compressed(resource->base.format))
{
- etna_texture_tile(mapped, ptrans->buffer,
+ etna_texture_tile(mapped + ptrans->base.box.z * res_level->layer_stride, ptrans->buffer,
ptrans->base.box.x, ptrans->base.box.y, res_level->stride,
ptrans->base.box.width, ptrans->base.box.height, ptrans->base.stride,
util_format_get_blocksize(resource->base.format));
diff --git a/src/etnaviv/etna.c b/src/etnaviv/etna.c
index 5763bd6..e35d32e 100644
--- a/src/etnaviv/etna.c
+++ b/src/etnaviv/etna.c
@@ -58,7 +58,6 @@ static int gpu_context_clear(struct etna_ctx *ctx);
static int gpu_context_initialize(struct etna_ctx *ctx)
{
- int rv;
gcoCONTEXT vctx = ETNA_CALLOC_STRUCT(_gcoCONTEXT);
if(vctx == NULL)
{
@@ -87,7 +86,7 @@ static int gpu_context_initialize(struct etna_ctx *ctx)
ctx->ctx = VIV_TO_HANDLE(vctx);
/* Allocate initial context buffer */
/* XXX DRM_ETNA_GEM_CACHE_xxx */
- if((ctx->ctx_info = etna_bo_new(ctx->conn, COMMAND_BUFFER_SIZE, DRM_ETNA_GEM_TYPE_CMD)) == NULL)
+ if((ctx->ctx_bo = etna_bo_new(ctx->conn, COMMAND_BUFFER_SIZE, DRM_ETNA_GEM_TYPE_CMD)) == NULL)
{
ETNA_FREE(vctx);
return ETNA_OUT_OF_MEMORY;
@@ -114,21 +113,21 @@ static int gpu_context_clear(struct etna_ctx *ctx)
#ifdef DEBUG
printf("gpu_context_clear: context was in use, deferred freeing and reallocating it\n");
#endif
- if((rv = etna_bo_del(ctx->conn, ctx->ctx_info, ctx->queue)) != ETNA_OK)
+ if((rv = etna_bo_del(ctx->conn, ctx->ctx_bo, ctx->queue)) != ETNA_OK)
{
return rv;
}
- if((ctx->ctx_info = etna_bo_new(ctx->conn, COMMAND_BUFFER_SIZE, DRM_ETNA_GEM_TYPE_CMD)) == NULL)
+ if((ctx->ctx_bo = etna_bo_new(ctx->conn, COMMAND_BUFFER_SIZE, DRM_ETNA_GEM_TYPE_CMD)) == NULL)
{
return ETNA_OUT_OF_MEMORY;
}
}
/* Leave space at beginning of buffer for PIPE switch */
GCCTX(ctx)->bufferSize = BEGIN_COMMIT_CLEARANCE;
- GCCTX(ctx)->logical = ctx->ctx_info.logical;
+ GCCTX(ctx)->logical = etna_bo_map(ctx->ctx_bo);
#ifdef GCABI_CONTEXT_HAS_PHYSICAL
- GCCTX(ctx)->bytes = ctx->ctx_info.bytes; /* actual size of buffer */
- GCCTX(ctx)->physical = HANDLE_TO_VIV(ctx->ctx_info.physical);
+ GCCTX(ctx)->bytes = etna_bo_size(ctx->ctx_bo); /* actual size of buffer */
+ GCCTX(ctx)->physical = HANDLE_TO_VIV(etna_bo_gpu_address(ctx->ctx_bo));
#endif
/* When context is empty, initial pipe should default to entry pipe so that
* no pipe switch is needed within the context and the kernel does the
diff --git a/src/etnaviv/etna_bo.c b/src/etnaviv/etna_bo.c
index 0231896..8c6069e 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"
@@ -35,9 +38,10 @@
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 /* Direct physical mapping */
+ ETNA_BO_TYPE_PHYSICAL /* Mmap-ed physical memory */
};
/* Structure describing a block of video or user memory */
@@ -183,16 +187,42 @@ 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;
}
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)
@@ -228,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)
{
@@ -246,7 +282,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);
@@ -255,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)
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);
diff --git a/src/fb/alpha_blend.c b/src/fb/alpha_blend.c
index ba5449c..8ff59c6 100644
--- a/src/fb/alpha_blend.c
+++ b/src/fb/alpha_blend.c
@@ -354,7 +354,7 @@ int main(int argc, char **argv)
etna_swap_buffers(fbs->buffers);
}
#ifdef DUMP
- bmp_dump32(fbs->fb.logical[1-fbs->buffers->backbuffer], width, height, false, "/mnt/sdcard/fb.bmp");
+ bmp_dump32(etna_bo_map(fbs->fb.buffer[1-fbs->buffers->backbuffer]), width, height, false, "/mnt/sdcard/fb.bmp");
printf("Dump complete\n");
#endif
fbdemo_free(fbs);
diff --git a/src/fb/cube_companion.c b/src/fb/cube_companion.c
index 144ac92..2aad4df 100644
--- a/src/fb/cube_companion.c
+++ b/src/fb/cube_companion.c
@@ -410,7 +410,7 @@ int main(int argc, char **argv)
etna_swap_buffers(fbs->buffers);
}
#ifdef DUMP
- bmp_dump32(fbs->fb.logical[1-fbs->buffers->backbuffer], width, height, false, "/mnt/sdcard/fb.bmp");
+ bmp_dump32(etna_bo_map(fbs->fb.buffer[1-fbs->buffers->backbuffer]), width, height, false, "/mnt/sdcard/fb.bmp");
printf("Dump complete\n");
#endif
fbdemo_free(fbs);
diff --git a/src/fb/cubemap_sphere.c b/src/fb/cubemap_sphere.c
index 1970dd6..2efa45c 100644
--- a/src/fb/cubemap_sphere.c
+++ b/src/fb/cubemap_sphere.c
@@ -388,7 +388,7 @@ int main(int argc, char **argv)
etna_swap_buffers(fbs->buffers);
}
#ifdef DUMP
- bmp_dump32(fbs->fb.logical[1-fbs->buffers->backbuffer], width, height, false, "/mnt/sdcard/fb.bmp");
+ bmp_dump32(etna_bo_map(fbs->fb.buffer[1-fbs->buffers->backbuffer]), width, height, false, "/mnt/sdcard/fb.bmp");
printf("Dump complete\n");
#endif
fbdemo_free(fbs);
diff --git a/src/fb/displacement.c b/src/fb/displacement.c
index 189bab2..032fe12 100644
--- a/src/fb/displacement.c
+++ b/src/fb/displacement.c
@@ -421,7 +421,7 @@ int main(int argc, char **argv)
etna_swap_buffers(fbs->buffers);
}
#ifdef DUMP
- bmp_dump32(fbs->fb.logical[1-fbs->buffers->backbuffer], width, height, false, "/mnt/sdcard/fb.bmp");
+ bmp_dump32(etna_bo_map(fbs->fb.buffer[1-fbs->buffers->backbuffer]), width, height, false, "/mnt/sdcard/fb.bmp");
printf("Dump complete\n");
#endif
fbdemo_free(fbs);
diff --git a/src/fb/mip_cube.c b/src/fb/mip_cube.c
index befe33a..2b2dae1 100644
--- a/src/fb/mip_cube.c
+++ b/src/fb/mip_cube.c
@@ -535,7 +535,7 @@ int main(int argc, char **argv)
etna_swap_buffers(fbs->buffers);
}
#ifdef DUMP
- bmp_dump32(fbs->fb.logical[1-fbs->buffers->backbuffer], width, height, false, "/mnt/sdcard/fb.bmp");
+ bmp_dump32(etna_bo_map(fbs->fb.buffer[1-fbs->buffers->backbuffer]), width, height, false, "/mnt/sdcard/fb.bmp");
printf("Dump complete\n");
#endif
fbdemo_free(fbs);
diff --git a/src/fb/particle_system.c b/src/fb/particle_system.c
index e866709..9c668f0 100644
--- a/src/fb/particle_system.c
+++ b/src/fb/particle_system.c
@@ -398,7 +398,7 @@ int main(int argc, char **argv)
etna_swap_buffers(fbs->buffers);
}
#ifdef DUMP
- bmp_dump32(fbs->fb.logical[1-fbs->buffers->backbuffer], width, height, false, "/mnt/sdcard/fb.bmp");
+ bmp_dump32(etna_bo_map(fbs->fb.buffer[1-fbs->buffers->backbuffer]), width, height, false, "/mnt/sdcard/fb.bmp");
printf("Dump complete\n");
#endif
fbdemo_free(fbs);
diff --git a/src/fb/ps_sandbox.c b/src/fb/ps_sandbox.c
index 0fcc315..8ffad7a 100644
--- a/src/fb/ps_sandbox.c
+++ b/src/fb/ps_sandbox.c
@@ -357,7 +357,7 @@ int main(int argc, char **argv)
etna_swap_buffers(fbs->buffers);
}
#ifdef DUMP
- bmp_dump32(fbs->fb.logical[1-fbs->buffers->backbuffer], width, height, false, "/mnt/sdcard/fb.bmp");
+ bmp_dump32(etna_bo_map(fbs->fb.buffer[1-fbs->buffers->backbuffer]), width, height, false, "/mnt/sdcard/fb.bmp");
printf("Dump complete\n");
#endif
fbdemo_free(fbs);
diff --git a/src/fb/rotate_cube.c b/src/fb/rotate_cube.c
index 3c7336e..02228df 100644
--- a/src/fb/rotate_cube.c
+++ b/src/fb/rotate_cube.c
@@ -423,7 +423,7 @@ int main(int argc, char **argv)
etna_swap_buffers(fbs->buffers);
}
#ifdef DUMP
- bmp_dump32(fbs->fb.logical[1-fbs->buffers->backbuffer], width, height, false, "/mnt/sdcard/fb.bmp");
+ bmp_dump32(etna_bo_map(fbs->fb.buffer[1-fbs->buffers->backbuffer]), width, height, false, "/mnt/sdcard/fb.bmp");
printf("Dump complete\n");
#endif
fbdemo_free(fbs);
diff --git a/src/fb/stencil_test.c b/src/fb/stencil_test.c
index 149bdf4..9f2731a 100644
--- a/src/fb/stencil_test.c
+++ b/src/fb/stencil_test.c
@@ -509,7 +509,7 @@ int main(int argc, char **argv)
etna_swap_buffers(fbs->buffers);
}
#ifdef DUMP
- bmp_dump32(fbs->fb.logical[1-fbs->buffers->backbuffer], width, height, false, "/mnt/sdcard/fb.bmp");
+ bmp_dump32(etna_bo_map(fbs->fb.buffer[1-fbs->buffers->backbuffer]), width, height, false, "/mnt/sdcard/fb.bmp");
printf("Dump complete\n");
#endif
fbdemo_free(fbs);
diff --git a/src/fb_old/cube_companion.c b/src/fb_old/cube_companion.c
index f005a0f..414525e 100644
--- a/src/fb_old/cube_companion.c
+++ b/src/fb_old/cube_companion.c
@@ -672,7 +672,7 @@ int main(int argc, char **argv)
etna_set_state(ctx, VIVS_RS_CLEAR_CONTROL, VIVS_RS_CLEAR_CONTROL_MODE_DISABLED);
etna_set_state(ctx, VIVS_RS_EXTRA_CONFIG, 0);
etna_set_state(ctx, VIVS_RS_SOURCE_ADDR, etna_bo_gpu_address(rt));
- etna_set_state(ctx, VIVS_RS_DEST_ADDR, fbs->fb.physical[backbuffer]);
+ etna_set_state(ctx, VIVS_RS_DEST_ADDR, etna_bo_gpu_address(fbs->fb.buffer[backbuffer]));
etna_set_state(ctx, VIVS_RS_WINDOW_SIZE,
VIVS_RS_WINDOW_SIZE_HEIGHT(height * supersample_y) |
VIVS_RS_WINDOW_SIZE_WIDTH(width * supersample_x));
diff --git a/src/fb_rawshader/alpha_blend.c b/src/fb_rawshader/alpha_blend.c
index 45012dc..93e1b9a 100644
--- a/src/fb_rawshader/alpha_blend.c
+++ b/src/fb_rawshader/alpha_blend.c
@@ -367,7 +367,7 @@ int main(int argc, char **argv)
etna_swap_buffers(fbs->buffers);
}
#ifdef DUMP
- bmp_dump32(fbs->fb.logical[1-fbs->buffers->backbuffer], width, height, false, "/mnt/sdcard/fb.bmp");
+ bmp_dump32(etna_bo_map(fbs->fb.buffer[1-fbs->buffers->backbuffer]), width, height, false, "/mnt/sdcard/fb.bmp");
printf("Dump complete\n");
#endif
fbdemo_free(fbs);
diff --git a/src/fb_rawshader/cube_companion.c b/src/fb_rawshader/cube_companion.c
index 922e60f..b9e8495 100644
--- a/src/fb_rawshader/cube_companion.c
+++ b/src/fb_rawshader/cube_companion.c
@@ -415,7 +415,7 @@ int main(int argc, char **argv)
etna_swap_buffers(fbs->buffers);
}
#ifdef DUMP
- bmp_dump32(fbs->fb.logical[1-fbs->buffers->backbuffer], width, height, false, "/mnt/sdcard/fb.bmp");
+ bmp_dump32(etna_bo_map(fbs->fb.buffer[1-fbs->buffers->backbuffer]), width, height, false, "/mnt/sdcard/fb.bmp");
printf("Dump complete\n");
#endif
fbdemo_free(fbs);
diff --git a/src/fb_rawshader/cubemap_sphere.c b/src/fb_rawshader/cubemap_sphere.c
index 792f750..c8c4861 100644
--- a/src/fb_rawshader/cubemap_sphere.c
+++ b/src/fb_rawshader/cubemap_sphere.c
@@ -397,7 +397,7 @@ int main(int argc, char **argv)
etna_swap_buffers(fbs->buffers);
}
#ifdef DUMP
- bmp_dump32(fbs->fb.logical[1-fbs->buffers->backbuffer], width, height, false, "/mnt/sdcard/fb.bmp");
+ bmp_dump32(etna_bo_map(fbs->fb.buffer[1-fbs->buffers->backbuffer]), width, height, false, "/mnt/sdcard/fb.bmp");
printf("Dump complete\n");
#endif
fbdemo_free(fbs);
diff --git a/src/fb_rawshader/displacement.c b/src/fb_rawshader/displacement.c
index 66761bd..05605a3 100644
--- a/src/fb_rawshader/displacement.c
+++ b/src/fb_rawshader/displacement.c
@@ -431,7 +431,7 @@ int main(int argc, char **argv)
etna_swap_buffers(fbs->buffers);
}
#ifdef DUMP
- bmp_dump32(fbs->fb.logical[1-fbs->buffers->backbuffer], width, height, false, "/mnt/sdcard/fb.bmp");
+ bmp_dump32(etna_bo_map(fbs->fb.buffer[1-fbs->buffers->backbuffer]), width, height, false, "/mnt/sdcard/fb.bmp");
printf("Dump complete\n");
#endif
fbdemo_free(fbs);
diff --git a/src/fb_rawshader/mip_cube.c b/src/fb_rawshader/mip_cube.c
index 7e9c456..e8f9426 100644
--- a/src/fb_rawshader/mip_cube.c
+++ b/src/fb_rawshader/mip_cube.c
@@ -501,7 +501,7 @@ int main(int argc, char **argv)
etna_swap_buffers(fbs->buffers);
}
#ifdef DUMP
- bmp_dump32(fbs->fb.logical[1-fbs->buffers->backbuffer], width, height, false, "/mnt/sdcard/fb.bmp");
+ bmp_dump32(etna_bo_map(fbs->fb.buffer[1-fbs->buffers->backbuffer]), width, height, false, "/mnt/sdcard/fb.bmp");
printf("Dump complete\n");
#endif
fbdemo_free(fbs);
diff --git a/src/fb_rawshader/particle_system.c b/src/fb_rawshader/particle_system.c
index 050bf06..12e2ae6 100644
--- a/src/fb_rawshader/particle_system.c
+++ b/src/fb_rawshader/particle_system.c
@@ -400,7 +400,7 @@ int main(int argc, char **argv)
etna_swap_buffers(fbs->buffers);
}
#ifdef DUMP
- bmp_dump32(fbs->fb.logical[1-fbs->buffers->backbuffer], width, height, false, "/mnt/sdcard/fb.bmp");
+ bmp_dump32(etna_bo_map(fbs->fb.buffer[1-fbs->buffers->backbuffer]), width, height, false, "/mnt/sdcard/fb.bmp");
printf("Dump complete\n");
#endif
fbdemo_free(fbs);
diff --git a/src/fb_rawshader/rotate_cube.c b/src/fb_rawshader/rotate_cube.c
index bc8a43e..4e7ebba 100644
--- a/src/fb_rawshader/rotate_cube.c
+++ b/src/fb_rawshader/rotate_cube.c
@@ -431,7 +431,7 @@ int main(int argc, char **argv)
etna_swap_buffers(fbs->buffers);
}
#ifdef DUMP
- bmp_dump32(fbs->fb.logical[1-fbs->buffers->backbuffer], width, height, false, "/mnt/sdcard/fb.bmp");
+ bmp_dump32(etna_bo_map(fbs->fb.buffer[1-fbs->buffers->backbuffer]), width, height, false, "/mnt/sdcard/fb.bmp");
printf("Dump complete\n");
#endif
fbdemo_free(fbs);
diff --git a/src/fb_rawshader/stencil_test.c b/src/fb_rawshader/stencil_test.c
index e82fa80..eb97458 100644
--- a/src/fb_rawshader/stencil_test.c
+++ b/src/fb_rawshader/stencil_test.c
@@ -528,7 +528,7 @@ int main(int argc, char **argv)
etna_swap_buffers(fbs->buffers);
}
#ifdef DUMP
- bmp_dump32(fbs->fb.logical[1-fbs->buffers->backbuffer], width, height, false, "/mnt/sdcard/fb.bmp");
+ bmp_dump32(etna_bo_map(fbs->fb.buffer[1-fbs->buffers->backbuffer]), width, height, false, "/mnt/sdcard/fb.bmp");
printf("Dump complete\n");
#endif
fbdemo_free(fbs);
diff --git a/src/lib/fbdemos.c b/src/lib/fbdemos.c
index cc1dff5..3d3d55b 100644
--- a/src/lib/fbdemos.c
+++ b/src/lib/fbdemos.c
@@ -22,6 +22,7 @@
*/
#include "fbdemos.h"
+#include <etnaviv/etna_bo.h>
#include "etna_pipe.h"
#include "etna_translate.h"
#include "etna_screen.h"
@@ -53,14 +54,6 @@ void fbdemo_init(struct fbdemos_scaffold **out)
{
struct fbdemos_scaffold *fbs = CALLOC_STRUCT(fbdemos_scaffold);
int rv;
-
- rv = fb_open(0, &fbs->fb);
- if(rv!=0)
- {
- exit(1);
- }
- fbs->width = fbs->fb.fb_var.xres;
- fbs->height = fbs->fb.fb_var.yres;
if(getenv("ETNA_MSAA_SAMPLES"))
fbdemos_msaa_samples = atoi(getenv("ETNA_MSAA_SAMPLES"));
@@ -73,6 +66,14 @@ void fbdemo_init(struct fbdemos_scaffold **out)
}
printf("Succesfully opened device\n");
+ rv = fb_open(fbs->conn, 0, &fbs->fb);
+ if(rv!=0)
+ {
+ exit(1);
+ }
+ fbs->width = fbs->fb.fb_var.xres;
+ fbs->height = fbs->fb.fb_var.yres;
+
/* Create screen */
if((fbs->screen = etna_screen_create(fbs->conn)) == NULL)
{
@@ -166,7 +167,7 @@ void etna_convert_r8g8b8_to_b8g8r8x8(uint32_t *dst, const uint8_t *src, unsigned
}
/* Open framebuffer and get information */
-int fb_open(int num, struct fb_info *out)
+int fb_open(struct viv_conn *conn, int num, struct fb_info *out)
{
char devname[256];
memset(out, 0, sizeof(struct fb_info));
@@ -211,8 +212,6 @@ int fb_open(int num, struct fb_info *out)
out->stride = out->fb_fix.line_length;
out->buffer_stride = out->stride * out->fb_var.yres;
out->num_buffers = out->fb_fix.smem_len / out->buffer_stride;
- out->map = mmap(NULL, out->fb_fix.smem_len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
- printf(" mmap: %p\n", out->map);
if(out->num_buffers > ETNA_FB_MAX_BUFFERS)
out->num_buffers = ETNA_FB_MAX_BUFFERS;
@@ -226,8 +225,9 @@ int fb_open(int num, struct fb_info *out)
for(int idx=0; idx<out->num_buffers; ++idx)
{
- out->physical[idx] = out->fb_fix.smem_start + idx * out->buffer_stride;
- out->logical[idx] = (void*)((size_t)out->map + idx * out->buffer_stride);
+ out->buffer[idx] = etna_bo_from_fbdev(conn, fd,
+ idx * out->buffer_stride,
+ out->buffer_stride);
}
printf("number of fb buffers: %i\n", out->num_buffers);
int req_virth = (out->num_buffers * out->fb_var.yres);
@@ -272,8 +272,6 @@ int fb_set_buffer(struct fb_info *fb, int buffer)
int fb_close(struct fb_info *fb)
{
- if(fb->map)
- munmap(fb->map, fb->fb_fix.smem_len);
close(fb->fd);
return 0;
}
@@ -298,7 +296,7 @@ int etna_fb_bind_resource(struct fbdemos_scaffold *fbs, struct pipe_resource *rt
.source_stride = rt_resource->levels[0].stride,
.dest_format = fb->rs_format,
.dest_tiling = ETNA_LAYOUT_LINEAR,
- .dest_addr = fb->physical[bi],
+ .dest_addr = etna_bo_gpu_address(fb->buffer[bi]),
.dest_stride = fb->fb_fix.line_length,
.downsample_x = msaa_xscale > 1,
.downsample_y = msaa_yscale > 1,
diff --git a/src/lib/fbdemos.h b/src/lib/fbdemos.h
index a0d7612..f3604df 100644
--- a/src/lib/fbdemos.h
+++ b/src/lib/fbdemos.h
@@ -29,19 +29,17 @@
#define ETNA_FB_MAX_BUFFERS (2) /* double buffering is enough */
struct pipe_resource;
+struct etna_bo;
+
struct fb_info
{
int fd;
int num_buffers;
- /* GPU addresses of buffers */
- size_t physical[ETNA_FB_MAX_BUFFERS];
- /* CPU addresses of buffers */
- void *logical[ETNA_FB_MAX_BUFFERS];
+ struct etna_bo *buffer[ETNA_FB_MAX_BUFFERS];
size_t stride;
size_t buffer_stride;
struct fb_var_screeninfo fb_var;
struct fb_fix_screeninfo fb_fix;
- void *map;
struct etna_resource *resource;
struct compiled_rs_state copy_to_screen[ETNA_FB_MAX_BUFFERS];
@@ -79,7 +77,7 @@ void etna_pipe_inline_write(struct pipe_context *pipe, struct pipe_resource *res
void etna_convert_r8g8b8_to_b8g8r8x8(uint32_t *dst, const uint8_t *src, unsigned num_pixels);
/* Open framebuffer and get information */
-int fb_open(int num, struct fb_info *out);
+int fb_open(struct viv_conn *conn, int num, struct fb_info *out);
/* Set currently visible buffer id */
int fb_set_buffer(struct fb_info *fb, int buffer);