src/video/directfb/SDL_DirectFB_video.h
author Sam Lantinga <slouken@libsdl.org>
Sat, 05 Feb 2011 16:07:10 -0800
changeset 5199 164f20ba08eb
parent 4636 b196d2758026
child 5218 572a73d71b5f
permissions -rw-r--r--
Updated the DirectFB support, from Couriersud

attached is a working directfb driver diff which works with the current
changes. There are a number of changes around it as well, e.g.
configure.in.

The directfb renderdriver right now still depends on a some "includes"
from src/video/directfb. That's why it is not yet moved to the new
render folder.
     1 /*
     2     SDL - Simple DirectMedia Layer
     3     Copyright (C) 1997-2010 Sam Lantinga
     4 
     5     This library is free software; you can redistribute it and/or
     6     modify it under the terms of the GNU Lesser General Public
     7     License as published by the Free Software Foundation; either
     8     version 2.1 of the License, or (at your option) any later version.
     9 
    10     This library is distributed in the hope that it will be useful,
    11     but WITHOUT ANY WARRANTY; without even the implied warranty of
    12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    13     Lesser General Public License for more details.
    14 
    15     You should have received a copy of the GNU Lesser General Public
    16     License along with this library; if not, write to the Free Software
    17     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    18 
    19     Sam Lantinga
    20     slouken@libsdl.org
    21 
    22     SDL1.3 DirectFB driver by couriersud@arcor.de
    23 	
    24 */
    25 
    26 #include "SDL_config.h"
    27 
    28 #ifndef _SDL_DirectFB_video_h
    29 #define _SDL_DirectFB_video_h
    30 
    31 #include <directfb.h>
    32 #include <directfb_version.h>
    33 
    34 #include "../SDL_sysvideo.h"
    35 #include "SDL_scancode.h"
    36 #include "SDL_render.h"
    37 
    38 #define DFB_VERSIONNUM(X, Y, Z)						\
    39 	((X)*1000 + (Y)*100 + (Z))
    40 
    41 #define DFB_COMPILEDVERSION \
    42 	DFB_VERSIONNUM(DIRECTFB_MAJOR_VERSION, DIRECTFB_MINOR_VERSION, DIRECTFB_MICRO_VERSION)
    43 
    44 #define DFB_VERSION_ATLEAST(X, Y, Z) \
    45 	(DFB_COMPILEDVERSION >= DFB_VERSIONNUM(X, Y, Z))
    46 
    47 #if (DFB_VERSION_ATLEAST(1,0,0))
    48 #define SDL_DIRECTFB_OPENGL 1
    49 #else
    50 #error "SDL_DIRECTFB: Please compile against libdirectfb version >= 1.0.0"
    51 #endif
    52 
    53 /* Set below to 1 to compile with (old) multi mice/keyboard api. Code left in
    54  * in case we see this again ... 
    55  */
    56 
    57 #define USE_MULTI_API	(0)
    58 
    59 /* Support for LUT8/INDEX8 pixel format.
    60  * This is broken in DirectFB 1.4.3. It works in 1.4.0 and 1.4.5
    61  * occurred.
    62  */
    63 
    64 #if (DFB_COMPILEDVERSION == DFB_VERSIONNUM(1, 4, 3))
    65 #define ENABLE_LUT8		(0)
    66 #else
    67 #define ENABLE_LUT8		(1)
    68 #endif
    69 
    70 #define DIRECTFB_DEBUG 1
    71 #define LOG_CHANNEL 	stdout
    72 
    73 #define DFBENV_USE_YUV_UNDERLAY 	"SDL_DIRECTFB_YUV_UNDERLAY"     /* Default: off */
    74 #define DFBENV_USE_YUV_DIRECT   	"SDL_DIRECTFB_YUV_DIRECT"       /* Default: off */
    75 #define DFBENV_USE_X11_CHECK		"SDL_DIRECTFB_X11_CHECK"        /* Default: on  */
    76 #define DFBENV_USE_LINUX_INPUT		"SDL_DIRECTFB_LINUX_INPUT"      /* Default: on  */
    77 #define DFBENV_USE_WM				"SDL_DIRECTFB_WM"       /* Default: off  */
    78 
    79 #define SDL_DFB_RELEASE(x) do { if ( (x) != NULL ) { SDL_DFB_CHECK(x->Release(x)); x = NULL; } } while (0)
    80 #define SDL_DFB_FREE(x) do { if ( (x) != NULL ) { SDL_free(x); x = NULL; } } while (0)
    81 #define SDL_DFB_UNLOCK(x) do { if ( (x) != NULL ) { x->Unlock(x); } } while (0)
    82 
    83 #define SDL_DFB_CONTEXT "SDL_DirectFB"
    84 
    85 #define SDL_DFB_ERR(x...) 							\
    86 	do {											\
    87 		fprintf(LOG_CHANNEL, "%s: %s <%d>:\n\t",	\
    88 			SDL_DFB_CONTEXT, __FILE__, __LINE__ );	\
    89         fprintf(LOG_CHANNEL, x ); 					\
    90 	} while (0)
    91 
    92 #if (DIRECTFB_DEBUG)
    93 
    94 #define SDL_DFB_LOG(x...) 							\
    95 	do {											\
    96 		fprintf(LOG_CHANNEL, SDL_DFB_CONTEXT);		\
    97         fprintf(LOG_CHANNEL, x ); 					\
    98 		fprintf(LOG_CHANNEL, "\n");					\
    99 	} while (0)
   100 
   101 #define SDL_DFB_DEBUG(x...) SDL_DFB_ERR( x )
   102 
   103 static inline DFBResult sdl_dfb_check(DFBResult ret, const char *src_file, int src_line) {
   104 	if (ret != DFB_OK) {
   105 		SDL_DFB_LOG("%s (%d):%s", src_file, src_line, DirectFBErrorString (ret) );
   106 		SDL_SetError("%s:%s", SDL_DFB_CONTEXT, DirectFBErrorString (ret) );
   107 	}
   108 	return ret;
   109 }
   110 
   111 #define SDL_DFB_CHECK(x...) do { sdl_dfb_check( x, __FILE__, __LINE__); } while (0)
   112 #define SDL_DFB_CHECKERR(x...) do { if ( sdl_dfb_check( x, __FILE__, __LINE__) != DFB_OK ) goto error; } while (0)
   113 
   114 #else
   115 
   116 #define SDL_DFB_CHECK(x...) x
   117 #define SDL_DFB_CHECKERR(x...) do { if (x != DFB_OK ) goto error; } while (0)
   118 #define SDL_DFB_LOG(x...) do {} while (0)
   119 #define SDL_DFB_DEBUG(x...) do {} while (0)
   120 
   121 #endif
   122 
   123 
   124 #define SDL_DFB_CALLOC(r, n, s) \
   125      do {                                           \
   126           r = SDL_calloc (n, s);                    \
   127           if (!(r)) {                               \
   128                SDL_DFB_ERR("Out of memory"); 		\
   129                SDL_OutOfMemory();                   \
   130                goto error; 					      	\
   131           }                                         \
   132      } while (0)
   133 
   134 #define SDL_DFB_ALLOC_CLEAR(r, s) SDL_DFB_CALLOC(r, 1, s)
   135 
   136 /* Private display data */
   137 
   138 #define SDL_DFB_DEVICEDATA(dev)  DFB_DeviceData *devdata = (dev ? (DFB_DeviceData *) ((dev)->driverdata) : NULL)
   139 
   140 #define DFB_MAX_SCREENS 10
   141 
   142 typedef struct _DFB_KeyboardData DFB_KeyboardData;
   143 struct _DFB_KeyboardData
   144 {
   145 	const SDL_ScanCode	*map;		/* keyboard scancode map */
   146 	int				map_size;	/* size of map */
   147 	int				map_adjust; /* index adjust */
   148     int 			is_generic; /* generic keyboard */
   149     int id;
   150 };
   151 
   152 typedef struct _DFB_DeviceData DFB_DeviceData;
   153 struct _DFB_DeviceData
   154 {
   155     int initialized;
   156 
   157     IDirectFB 			*dfb;
   158     int 				num_mice;
   159     int 				mouse_id[0x100];
   160     int 				num_keyboard;
   161     DFB_KeyboardData 	keyboard[10];
   162     SDL_Window	 		*firstwin;
   163 
   164     int 				use_yuv_underlays;
   165     int 				use_yuv_direct;
   166     int 				use_linux_input;
   167     int 				has_own_wm;
   168 
   169 
   170 	/* window grab */
   171 	SDL_Window 			*grabbed_window;
   172 
   173     /* global events */
   174     IDirectFBEventBuffer *events;
   175 };
   176 
   177 Uint32 DirectFB_DFBToSDLPixelFormat(DFBSurfacePixelFormat pixelformat);
   178 DFBSurfacePixelFormat DirectFB_SDLToDFBPixelFormat(Uint32 format);
   179 void DirectFB_SetSupportedPixelFormats(SDL_RendererInfo *ri);
   180 
   181 
   182 #endif /* _SDL_DirectFB_video_h */