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@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 */ 43typedef 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 */ 53struct 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 */ 144extern void FB_SavePaletteTo(_THIS, int palette_len, __u16 *area); 145extern void FB_RestorePaletteFrom(_THIS, int palette_len, __u16 *area); 146 147/* These are utility functions for working with video surfaces */ 148 149static __inline__ void FB_AddBusySurface(SDL_Surface *surface) 150{ 151 ((vidmem_bucket *)surface->hwdata)->dirty = 1; 152} 153 154static __inline__ int FB_IsSurfaceBusy(SDL_Surface *surface) 155{ 156 return ((vidmem_bucket *)surface->hwdata)->dirty; 157} 158 159static __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 172static __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