Annotation of quake2/linux/rw_svgalib.c, revision 1.1.1.1

1.1       root        1: /*
                      2: ** RW_SVGALBI.C
                      3: **
                      4: ** This file contains ALL Linux specific stuff having to do with the
                      5: ** software refresh.  When a port is being made the following functions
                      6: ** must be implemented by the port:
                      7: **
                      8: ** SWimp_EndFrame
                      9: ** SWimp_Init
                     10: ** SWimp_InitGraphics
                     11: ** SWimp_SetPalette
                     12: ** SWimp_Shutdown
                     13: ** SWimp_SwitchFullscreen
                     14: */
                     15: 
                     16: #include <termios.h>
                     17: #include <sys/ioctl.h>
                     18: #include <sys/stat.h>
                     19: #include <sys/vt.h>
                     20: #include <stdarg.h>
                     21: #include <stdio.h>
                     22: #include <signal.h>
                     23: #include <sys/mman.h>
                     24: 
                     25: #include <asm/io.h>
                     26: 
                     27: #include "vga.h"
                     28: #include "vgakeyboard.h"
                     29: #include "vgamouse.h"
                     30: 
                     31: #include "../ref_soft/r_local.h"
                     32: #include "../client/keys.h"
                     33: #include "../linux/rw_linux.h"
                     34: 
                     35: /*****************************************************************************/
                     36: 
                     37: int            VGA_width, VGA_height, VGA_rowbytes, VGA_bufferrowbytes, VGA_planar;
                     38: byte   *VGA_pagebase;
                     39: char   *framebuffer_ptr;
                     40: 
                     41: void VGA_UpdatePlanarScreen (void *srcbuffer);
                     42: 
                     43: int num_modes;
                     44: vga_modeinfo *modes;
                     45: int current_mode;
                     46: 
                     47: // Console variables that we need to access from this module
                     48: 
                     49: /*****************************************************************************/
                     50: 
                     51: void VID_InitModes(void)
                     52: {
                     53: 
                     54: int i;
                     55: 
                     56:        // get complete information on all modes
                     57: 
                     58:        num_modes = vga_lastmodenumber()+1;
                     59:        modes = malloc(num_modes * sizeof(vga_modeinfo));
                     60:        for (i=0 ; i<num_modes ; i++)
                     61:        {
                     62:                if (vga_hasmode(i))
                     63:                        memcpy(&modes[i], vga_getmodeinfo(i), sizeof (vga_modeinfo));
                     64:                else
                     65:                        modes[i].width = 0; // means not available
                     66:        }
                     67: 
                     68:        // filter for modes i don't support
                     69: 
                     70:        for (i=0 ; i<num_modes ; i++)
                     71:        {
                     72:                if (modes[i].bytesperpixel != 1 && modes[i].colors != 256) 
                     73:                        modes[i].width = 0;
                     74:        }
                     75: 
                     76:        for (i = 0; i < num_modes; i++)
                     77:                if (modes[i].width)
                     78:                        ri.Con_Printf(PRINT_ALL, "mode %d: %d %d\n", modes[i].width, modes[i].height);
                     79: 
                     80: }
                     81: 
                     82: /*
                     83: ** SWimp_Init
                     84: **
                     85: ** This routine is responsible for initializing the implementation
                     86: ** specific stuff in a software rendering subsystem.
                     87: */
                     88: int SWimp_Init( void *hInstance, void *wndProc )
                     89: {
                     90:        vga_init();
                     91: 
                     92:        VID_InitModes();
                     93: 
                     94:        return true;
                     95: }
                     96: 
                     97: int get_mode(int width, int height)
                     98: {
                     99: 
                    100:        int i;
                    101:        int ok, match;
                    102: 
                    103:        for (i=0 ; i<num_modes ; i++)
                    104:                if (modes[i].width &&
                    105:                        modes[i].width == width && modes[i].height == height)
                    106:                                break;
                    107:        if (i==num_modes)
                    108:                return -1; // not found
                    109: 
                    110:        return i;
                    111: }
                    112: 
                    113: /*
                    114: ** SWimp_InitGraphics
                    115: **
                    116: ** This initializes the software refresh's implementation specific
                    117: ** graphics subsystem.  In the case of Windows it creates DIB or
                    118: ** DDRAW surfaces.
                    119: **
                    120: ** The necessary width and height parameters are grabbed from
                    121: ** vid.width and vid.height.
                    122: */
                    123: static qboolean SWimp_InitGraphics( qboolean fullscreen )
                    124: {
                    125:        int bsize, zsize, tsize;
                    126: 
                    127:        SWimp_Shutdown();
                    128: 
                    129:        current_mode = get_mode(vid.width, vid.height);
                    130: 
                    131:        if (current_mode < 0) {
                    132:                ri.Con_Printf (PRINT_ALL, "Mode %d %d not found\n", vid.width, vid.height);
                    133:                return false; // mode not found
                    134:        }
                    135: 
                    136:        // let the sound and input subsystems know about the new window
                    137:        ri.Vid_NewWindow (vid.width, vid.height);
                    138: 
                    139:        ri.Con_Printf (PRINT_ALL, "Setting VGAMode: %d\n", current_mode );
                    140: 
                    141: //     Cvar_SetValue ("vid_mode", (float)modenum);
                    142:        
                    143:        VGA_width = modes[current_mode].width;
                    144:        VGA_height = modes[current_mode].height;
                    145:        VGA_planar = modes[current_mode].bytesperpixel == 0;
                    146:        VGA_rowbytes = modes[current_mode].linewidth;
                    147: 
                    148:        vid.rowbytes = modes[current_mode].linewidth;
                    149: 
                    150:        if (VGA_planar) {
                    151:                VGA_bufferrowbytes = modes[current_mode].linewidth * 4;
                    152:                vid.rowbytes = modes[current_mode].linewidth*4;
                    153:        }
                    154: 
                    155: // get goin'
                    156: 
                    157:        vga_setmode(current_mode);
                    158: 
                    159:        VGA_pagebase = framebuffer_ptr = (char *) vga_getgraphmem();
                    160: //             if (vga_setlinearaddressing()>0)
                    161: //                     framebuffer_ptr = (char *) vga_getgraphmem();
                    162:        if (!framebuffer_ptr)
                    163:                Sys_Error("This mode isn't hapnin'\n");
                    164: 
                    165:        vga_setpage(0);
                    166: 
                    167:        vid.buffer = malloc(vid.rowbytes * vid.height);
                    168:        if (!vid.buffer)
                    169:                Sys_Error("Unabled to alloc vid.buffer!\n");
                    170: 
                    171:        return true;
                    172: }
                    173: 
                    174: /*
                    175: ** SWimp_EndFrame
                    176: **
                    177: ** This does an implementation specific copy from the backbuffer to the
                    178: ** front buffer.  In the Win32 case it uses BitBlt or BltFast depending
                    179: ** on whether we're using DIB sections/GDI or DDRAW.
                    180: */
                    181: void SWimp_EndFrame (void)
                    182: {
                    183:        if (!vga_oktowrite())
                    184:                return; // can't update screen if it's not active
                    185: 
                    186: //     if (vid_waitforrefresh.value)
                    187: //             vga_waitretrace();
                    188: 
                    189:        if (VGA_planar)
                    190:                VGA_UpdatePlanarScreen (vid.buffer);
                    191: 
                    192:        else {
                    193:                int total = vid.rowbytes * vid.height;
                    194:                int offset;
                    195: 
                    196:                for (offset=0;offset<total;offset+=0x10000) {
                    197:                        vga_setpage(offset/0x10000);
                    198:                        memcpy(framebuffer_ptr,
                    199:                                        vid.buffer + offset,
                    200:                                        ((total-offset>0x10000)?0x10000:(total-offset)));
                    201:                }
                    202:        } 
                    203: }
                    204: 
                    205: /*
                    206: ** SWimp_SetMode
                    207: */
                    208: rserr_t SWimp_SetMode( int *pwidth, int *pheight, int mode, qboolean fullscreen )
                    209: {
                    210:        rserr_t retval = rserr_ok;
                    211: 
                    212:        ri.Con_Printf (PRINT_ALL, "setting mode %d:", mode );
                    213: 
                    214:        if ( !ri.Vid_GetModeInfo( pwidth, pheight, mode ) )
                    215:        {
                    216:                ri.Con_Printf( PRINT_ALL, " invalid mode\n" );
                    217:                return rserr_invalid_mode;
                    218:        }
                    219: 
                    220:        ri.Con_Printf( PRINT_ALL, " %d %d\n", *pwidth, *pheight);
                    221: 
                    222:        if ( !SWimp_InitGraphics( false ) ) {
                    223:                // failed to set a valid mode in windowed mode
                    224:                return rserr_invalid_mode;
                    225:        }
                    226: 
                    227:        R_GammaCorrectAndSetPalette( ( const unsigned char * ) d_8to24table );
                    228: 
                    229:        return retval;
                    230: }
                    231: 
                    232: /*
                    233: ** SWimp_SetPalette
                    234: **
                    235: ** System specific palette setting routine.  A NULL palette means
                    236: ** to use the existing palette.  The palette is expected to be in
                    237: ** a padded 4-byte xRGB format.
                    238: */
                    239: void SWimp_SetPalette( const unsigned char *palette )
                    240: {
                    241:        static int tmppal[256*3];
                    242:        const unsigned char *pal;
                    243:        int *tp;
                    244:        int i;
                    245: 
                    246:     if ( !palette )
                    247:         palette = ( const unsigned char * ) sw_state.currentpalette;
                    248:  
                    249:        if (vga_getcolors() == 256)
                    250:        {
                    251:                tp = tmppal;
                    252:                pal = palette;
                    253: 
                    254:                for (i=0 ; i < 256 ; i++, pal += 4, tp += 3) {
                    255:                        tp[0] = pal[0] >> 2;
                    256:                        tp[1] = pal[1] >> 2;
                    257:                        tp[2] = pal[2] >> 2;
                    258:                }
                    259: 
                    260:                if (vga_oktowrite())
                    261:                        vga_setpalvec(0, 256, tmppal);
                    262:        }
                    263: }
                    264: 
                    265: /*
                    266: ** SWimp_Shutdown
                    267: **
                    268: ** System specific graphics subsystem shutdown routine.  Destroys
                    269: ** DIBs or DDRAW surfaces as appropriate.
                    270: */
                    271: void SWimp_Shutdown( void )
                    272: {
                    273:        if (vid.buffer) {
                    274:                free(vid.buffer);
                    275:                vid.buffer = NULL;
                    276:        }
                    277:        vga_setmode(TEXT);
                    278: }
                    279: 
                    280: /*
                    281: ** SWimp_AppActivate
                    282: */
                    283: void SWimp_AppActivate( qboolean active )
                    284: {
                    285: }
                    286: 
                    287: //===============================================================================
                    288: 
                    289: /*
                    290: ================
                    291: Sys_MakeCodeWriteable
                    292: ================
                    293: */
                    294: void Sys_MakeCodeWriteable (unsigned long startaddr, unsigned long length)
                    295: {
                    296: 
                    297:        int r;
                    298:        unsigned long addr;
                    299:        int psize = getpagesize();
                    300: 
                    301:        addr = (startaddr & ~(psize-1)) - psize;
                    302: 
                    303: //     fprintf(stderr, "writable code %lx(%lx)-%lx, length=%lx\n", startaddr,
                    304: //                     addr, startaddr+length, length);
                    305: 
                    306:        r = mprotect((char*)addr, length + startaddr - addr + psize, 7);
                    307: 
                    308:        if (r < 0)
                    309:                Sys_Error("Protection change failed\n");
                    310: }
                    311: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.