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