1 /* 2 SDL - Simple DirectMedia Layer 3 Copyright (C) 1997-2006 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 (at) libsdl.org 21 */ 22 #include "SDL_config.h" 23 24 #ifndef _SDL_fbvideo_h 25 #define _SDL_fbvideo_h 26 27 #include <sys/types.h> 28 #include <termios.h> 29 #include <linux/fb.h> 30 31 #include "SDL_mouse.h" 32 #include "SDL_mutex.h" 33 #include "../SDL_sysvideo.h" 34 #if SDL_INPUT_TSLIB 35 #include "tslib.h" 36 #endif 37 38 /* Hidden "this" pointer for the video functions */ 39 #define _THIS SDL_VideoDevice *this 40 41 42 /* This is the structure we use to keep track of video memory */ 43 typedef struct vidmem_bucket { 44 struct vidmem_bucket *prev; 45 int used; 46 int dirty; 47 char *base; 48 unsigned int size; 49 struct vidmem_bucket *next; 50 } vidmem_bucket; 51 52 /* Private display data */ 53 struct SDL_PrivateVideoData { 54 int console_fd; 55 struct fb_var_screeninfo cache_vinfo; 56 struct fb_var_screeninfo saved_vinfo; 57 int saved_cmaplen; 58 __u16 *saved_cmap; 59 60 int current_vt; 61 int saved_vt; 62 int keyboard_fd; 63 int saved_kbd_mode; 64 struct termios saved_kbd_termios; 65 66 int mouse_fd; 67 #if SDL_INPUT_TSLIB 68 struct tsdev *ts_dev; 69 #endif 70 71 char *mapped_mem; 72 int mapped_memlen; 73 int mapped_offset; 74 char *mapped_io; 75 long mapped_iolen; 76 int flip_page; 77 char *flip_address[2]; 78 79 #define NUM_MODELISTS 4 /* 8, 16, 24, and 32 bits-per-pixel */ 80 int SDL_nummodes[NUM_MODELISTS]; 81 SDL_Rect **SDL_modelist[NUM_MODELISTS]; 82 83 vidmem_bucket surfaces; 84 int surfaces_memtotal; 85 int surfaces_memleft; 86 87 SDL_mutex *hw_lock; 88 int switched_away; 89 struct fb_var_screeninfo screen_vinfo; 90 Uint32 screen_arealen; 91 Uint8 *screen_contents; 92 __u16 screen_palette[3*256]; 93 94 void (*wait_vbl)(_THIS); 95 void (*wait_idle)(_THIS); 96 }; 97 /* Old variable names */ 98 #define console_fd (this->hidden->console_fd) 99 #define current_vt (this->hidden->current_vt) 100 #define saved_vt (this->hidden->saved_vt) 101 #define keyboard_fd (this->hidden->keyboard_fd) 102 #define saved_kbd_mode (this->hidden->saved_kbd_mode) 103 #define saved_kbd_termios (this->hidden->saved_kbd_termios) 104 #define mouse_fd (this->hidden->mouse_fd) 105 #if SDL_INPUT_TSLIB 106 #define ts_dev (this->hidden->ts_dev) 107 #endif 108 #define cache_vinfo (this->hidden->cache_vinfo) 109 #define saved_vinfo (this->hidden->saved_vinfo) 110 #define saved_cmaplen (this->hidden->saved_cmaplen) 111 #define saved_cmap (this->hidden->saved_cmap) 112 #define mapped_mem (this->hidden->mapped_mem) 113 #define mapped_memlen (this->hidden->mapped_memlen) 114 #define mapped_offset (this->hidden->mapped_offset) 115 #define mapped_io (this->hidden->mapped_io) 116 #define mapped_iolen (this->hidden->mapped_iolen) 117 #define flip_page (this->hidden->flip_page) 118 #define flip_address (this->hidden->flip_address) 119 #define SDL_nummodes (this->hidden->SDL_nummodes) 120 #define SDL_modelist (this->hidden->SDL_modelist) 121 #define surfaces (this->hidden->surfaces) 122 #define surfaces_memtotal (this->hidden->surfaces_memtotal) 123 #define surfaces_memleft (this->hidden->surfaces_memleft) 124 #define hw_lock (this->hidden->hw_lock) 125 #define switched_away (this->hidden->switched_away) 126 #define screen_vinfo (this->hidden->screen_vinfo) 127 #define screen_arealen (this->hidden->screen_arealen) 128 #define screen_contents (this->hidden->screen_contents) 129 #define screen_palette (this->hidden->screen_palette) 130 #define wait_vbl (this->hidden->wait_vbl) 131 #define wait_idle (this->hidden->wait_idle) 132 133 /* Accelerator types that are supported by the driver, but are not 134 necessarily in the kernel headers on the system we compile on. 135 */ 136 #ifndef FB_ACCEL_MATROX_MGAG400 137 #define FB_ACCEL_MATROX_MGAG400 26 /* Matrox G400 */ 138 #endif 139 #ifndef FB_ACCEL_3DFX_BANSHEE 140 #define FB_ACCEL_3DFX_BANSHEE 31 /* 3Dfx Banshee */ 141 #endif 142 143 /* These functions are defined in SDL_fbvideo.c */ 144 extern void FB_SavePaletteTo(_THIS, int palette_len, __u16 *area); 145 extern void FB_RestorePaletteFrom(_THIS, int palette_len, __u16 *area); 146 147 /* These are utility functions for working with video surfaces */ 148 149 static __inline__ void FB_AddBusySurface(SDL_Surface *surface) 150 { 151 ((vidmem_bucket *)surface->hwdata)->dirty = 1; 152 } 153 154 static __inline__ int FB_IsSurfaceBusy(SDL_Surface *surface) 155 { 156 return ((vidmem_bucket *)surface->hwdata)->dirty; 157 } 158 159 static __inline__ void FB_WaitBusySurfaces(_THIS) 160 { 161 vidmem_bucket *bucket; 162 163 /* Wait for graphic operations to complete */ 164 wait_idle(this); 165 166 /* Clear all surface dirty bits */ 167 for ( bucket=&surfaces; bucket; bucket=bucket->next ) { 168 bucket->dirty = 0; 169 } 170 } 171 172 static __inline__ void FB_dst_to_xy(_THIS, SDL_Surface *dst, int *x, int *y) 173 { 174 *x = (long)((char *)dst->pixels - mapped_mem)%this->screen->pitch; 175 *y = (long)((char *)dst->pixels - mapped_mem)/this->screen->pitch; 176 if ( dst == this->screen ) { 177 *x += this->offset_x; 178 *y += this->offset_y; 179 } 180 } 181 182 #endif /* _SDL_fbvideo_h */ 183