From 7fe60435bce6595a9c58a9bfd8244d74b5320e96 Mon Sep 17 00:00:00 2001 From: Benjamin Franzke Date: Tue, 15 Jan 2013 08:46:13 +0100 Subject: Import DirectFB141_2k11R3_beta5 --- Source/DirectFB/src/core/shared_surface_pool.c | 227 +++++++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100755 Source/DirectFB/src/core/shared_surface_pool.c (limited to 'Source/DirectFB/src/core/shared_surface_pool.c') diff --git a/Source/DirectFB/src/core/shared_surface_pool.c b/Source/DirectFB/src/core/shared_surface_pool.c new file mode 100755 index 0000000..5199a84 --- /dev/null +++ b/Source/DirectFB/src/core/shared_surface_pool.c @@ -0,0 +1,227 @@ +/* + (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org) + (c) Copyright 2000-2004 Convergence (integrated media) GmbH + + All rights reserved. + + Written by Denis Oliver Kropp , + Andreas Hundt , + Sven Neumann , + Ville Syrjälä and + Claudio Ciccani . + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include + +#include + +#include +#include +#include + +#include +#include + +#include + +/**********************************************************************************************************************/ + +typedef struct { + FusionSHMPoolShared *shmpool; +} SharedPoolData; + +typedef struct { + CoreDFB *core; + FusionWorld *world; +} SharedPoolLocalData; + +typedef struct { + void *addr; + int pitch; + int size; +} SharedAllocationData; + +/**********************************************************************************************************************/ + +static int +sharedPoolDataSize( void ) +{ + return sizeof(SharedPoolData); +} + +static int +sharedPoolLocalDataSize( void ) +{ + return sizeof(SharedPoolLocalData); +} + +static int +sharedAllocationDataSize( void ) +{ + return sizeof(SharedAllocationData); +} + +static DFBResult +sharedInitPool( CoreDFB *core, + CoreSurfacePool *pool, + void *pool_data, + void *pool_local, + void *system_data, + CoreSurfacePoolDescription *ret_desc ) +{ + DFBResult ret; + SharedPoolData *data = pool_data; + SharedPoolLocalData *local = pool_local; + + D_MAGIC_ASSERT( pool, CoreSurfacePool ); + D_ASSERT( ret_desc != NULL ); + + local->core = core; + local->world = dfb_core_world( core ); + + ret = fusion_shm_pool_create( local->world, "Surface Memory Pool", dfb_config->surface_shmpool_size, + fusion_config->debugshm, &data->shmpool ); + if (ret) + return ret; + + ret_desc->caps = CSPCAPS_NONE; + ret_desc->access[CSAID_CPU] = CSAF_READ | CSAF_WRITE | CSAF_SHARED; + ret_desc->access[CSAID_LAYER0] = CSAF_READ | CSAF_SHARED; + ret_desc->access[CSAID_LAYER1] = CSAF_READ | CSAF_SHARED; + ret_desc->types = CSTF_LAYER | CSTF_WINDOW | CSTF_CURSOR | CSTF_FONT | CSTF_SHARED | CSTF_INTERNAL; + ret_desc->priority = CSPP_DEFAULT; + + snprintf( ret_desc->name, DFB_SURFACE_POOL_DESC_NAME_LENGTH, "Shared Memory" ); + + return DFB_OK; +} + +static DFBResult +sharedDestroyPool( CoreSurfacePool *pool, + void *pool_data, + void *pool_local ) +{ + SharedPoolData *data = pool_data; + SharedPoolLocalData *local = pool_local; + + D_MAGIC_ASSERT( pool, CoreSurfacePool ); + + fusion_shm_pool_destroy( local->world, data->shmpool ); + + return DFB_OK; +} + +static DFBResult +sharedAllocateBuffer( CoreSurfacePool *pool, + void *pool_data, + void *pool_local, + CoreSurfaceBuffer *buffer, + CoreSurfaceAllocation *allocation, + void *alloc_data ) +{ + CoreSurface *surface; + SharedPoolData *data = pool_data; + SharedAllocationData *alloc = alloc_data; + + D_MAGIC_ASSERT( pool, CoreSurfacePool ); + D_MAGIC_ASSERT( buffer, CoreSurfaceBuffer ); + + surface = buffer->surface; + + D_MAGIC_ASSERT( surface, CoreSurface ); + + dfb_surface_calc_buffer_size( surface, 8, 0, &alloc->pitch, &alloc->size ); + + alloc->addr = SHMALLOC( data->shmpool, alloc->size ); + if (!alloc->addr) + return D_OOSHM(); + + allocation->flags = CSALF_VOLATILE; + allocation->size = alloc->size; + + return DFB_OK; +} + +static DFBResult +sharedDeallocateBuffer( CoreSurfacePool *pool, + void *pool_data, + void *pool_local, + CoreSurfaceBuffer *buffer, + CoreSurfaceAllocation *allocation, + void *alloc_data ) +{ + SharedPoolData *data = pool_data; + SharedAllocationData *alloc = alloc_data; + + D_MAGIC_ASSERT( pool, CoreSurfacePool ); + D_MAGIC_ASSERT( buffer, CoreSurfaceBuffer ); + + SHFREE( data->shmpool, alloc->addr ); + + return DFB_OK; +} + +static DFBResult +sharedLock( CoreSurfacePool *pool, + void *pool_data, + void *pool_local, + CoreSurfaceAllocation *allocation, + void *alloc_data, + CoreSurfaceBufferLock *lock ) +{ + SharedAllocationData *alloc = alloc_data; + + D_MAGIC_ASSERT( pool, CoreSurfacePool ); + D_MAGIC_ASSERT( allocation, CoreSurfaceAllocation ); + D_MAGIC_ASSERT( lock, CoreSurfaceBufferLock ); + + lock->addr = alloc->addr; + lock->pitch = alloc->pitch; + + return DFB_OK; +} + +static DFBResult +sharedUnlock( CoreSurfacePool *pool, + void *pool_data, + void *pool_local, + CoreSurfaceAllocation *allocation, + void *alloc_data, + CoreSurfaceBufferLock *lock ) +{ + D_MAGIC_ASSERT( pool, CoreSurfacePool ); + D_MAGIC_ASSERT( allocation, CoreSurfaceAllocation ); + D_MAGIC_ASSERT( lock, CoreSurfaceBufferLock ); + + return DFB_OK; +} + +const SurfacePoolFuncs sharedSurfacePoolFuncs = { + .PoolDataSize = sharedPoolDataSize, + .PoolLocalDataSize = sharedPoolLocalDataSize, + .AllocationDataSize = sharedAllocationDataSize, + .InitPool = sharedInitPool, + .DestroyPool = sharedDestroyPool, + + .AllocateBuffer = sharedAllocateBuffer, + .DeallocateBuffer = sharedDeallocateBuffer, + + .Lock = sharedLock, + .Unlock = sharedUnlock, +}; + -- cgit