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@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 41typedef 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 */ 51typedef 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 */ 61struct 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 */ 162extern void FB_SavePaletteTo(_THIS, int palette_len, __u16 *area); 163extern void FB_RestorePaletteFrom(_THIS, int palette_len, __u16 *area); 164 165/* These are utility functions for working with video surfaces */ 166 167static __inline__ void FB_AddBusySurface(SDL_Surface *surface) 168{ 169 ((vidmem_bucket *)surface->hwdata)->dirty = 1; 170} 171 172static __inline__ int FB_IsSurfaceBusy(SDL_Surface *surface) 173{ 174 return ((vidmem_bucket *)surface->hwdata)->dirty; 175} 176 177static __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 190static __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