diff options
Diffstat (limited to 'src')
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); |