From 77970d28cdcdeae77caa29a8c49d5188e4477cd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Strohh=C3=A4cker?= Date: Sun, 11 Dec 2011 17:30:50 +0000 Subject: [PATCH] small additions: vga override, lazy fullscreen switching, pci read override Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@3768 --- include/pci_bus.h | 7 ++-- include/vga.h | 3 ++ src/gui/sdlmain.cpp | 71 +++++++++++++++++++++++++++++++++++++-- src/hardware/pci_bus.cpp | 6 ++++ src/hardware/vga_draw.cpp | 22 ++++++++++-- 5 files changed, 100 insertions(+), 9 deletions(-) diff --git a/include/pci_bus.h b/include/pci_bus.h index 470114ff..adec2d9b 100644 --- a/include/pci_bus.h +++ b/include/pci_bus.h @@ -61,16 +61,17 @@ public: PCI_Device* GetSubdevice(Bits subfct); Bit16u NumSubdevices(void) { - if (num_subdevices>PCI_MAX_PCIFUNCTIONS-1) return PCI_MAX_PCIFUNCTIONS-1; - return num_subdevices; + if (num_subdevices>PCI_MAX_PCIFUNCTIONS-1) return (Bit16u)(PCI_MAX_PCIFUNCTIONS-1); + return (Bit16u)num_subdevices; } Bits GetNextSubdeviceNumber(void) { if (num_subdevices>=PCI_MAX_PCIFUNCTIONS-1) return -1; - return num_subdevices+1; + return (Bits)num_subdevices+1; } virtual Bits ParseReadRegister(Bit8u regnum)=0; + virtual bool OverrideReadRegister(Bit8u regnum, Bit8u* rval, Bit8u* rval_mask)=0; virtual Bits ParseWriteRegister(Bit8u regnum,Bit8u value)=0; virtual bool InitializeRegisters(Bit8u registers[256])=0; diff --git a/include/vga.h b/include/vga.h index 95aa8f07..6b19e6eb 100644 --- a/include/vga.h +++ b/include/vga.h @@ -166,6 +166,7 @@ typedef struct { } cursor; Drawmode mode; bool vret_triggered; + bool vga_override; } VGA_Draw; typedef struct { @@ -448,6 +449,8 @@ void VGA_SetCGA4Table(Bit8u val0,Bit8u val1,Bit8u val2,Bit8u val3); void VGA_ActivateHardwareCursor(void); void VGA_KillDrawing(void); +void VGA_SetOverride(bool vga_override); + extern VGA_Type vga; /* Support for modular SVGA implementation */ diff --git a/src/gui/sdlmain.cpp b/src/gui/sdlmain.cpp index 31a5e458..5c5d89b3 100644 --- a/src/gui/sdlmain.cpp +++ b/src/gui/sdlmain.cpp @@ -171,6 +171,8 @@ struct SDL_Block { } window; Bit8u bpp; bool fullscreen; + bool lazy_fullscreen; + bool lazy_fullscreen_req; bool doublebuf; SCREEN_TYPES type; SCREEN_TYPES want_type; @@ -353,6 +355,16 @@ void GFX_ResetScreen(void) { CPU_Reset_AutoAdjust(); } +void GFX_ForceFullscreenExit(void) { + if (sdl.desktop.lazy_fullscreen) { +// sdl.desktop.lazy_fullscreen_req=true; + LOG_MSG("GFX LF: invalid screen change"); + } else { + sdl.desktop.fullscreen=false; + GFX_ResetScreen(); + } +} + static int int_log2 (int val) { int log = 0; while ((val >>= 1) != 0) @@ -405,6 +417,16 @@ static SDL_Surface * GFX_SetupSurfaceScaled(Bit32u sdl_flags, Bit32u bpp) { } } +void GFX_TearDown(void) { + if (sdl.updating) + GFX_EndUpdate( 0 ); + + if (sdl.blit.surface) { + SDL_FreeSurface(sdl.blit.surface); + sdl.blit.surface=0; + } +} + Bitu GFX_SetSize(Bitu width,Bitu height,Bitu flags,double scalex,double scaley,GFX_CallBack_t callback) { if (sdl.updating) GFX_EndUpdate( 0 ); @@ -670,6 +692,18 @@ void GFX_CaptureMouse(void) { mouselocked=sdl.mouse.locked; } +void GFX_UpdateSDLCaptureState(void) { + if (sdl.mouse.locked) { + SDL_WM_GrabInput(SDL_GRAB_ON); + SDL_ShowCursor(SDL_DISABLE); + } else { + SDL_WM_GrabInput(SDL_GRAB_OFF); + if (sdl.mouse.autoenable || !sdl.mouse.autolock) SDL_ShowCursor(SDL_ENABLE); + } + CPU_Reset_AutoAdjust(); + GFX_SetTitle(-1,-1,false); +} + bool mouselocked; //Global variable for mapper static void CaptureMouse(bool pressed) { if (!pressed) @@ -718,7 +752,32 @@ void GFX_SwitchFullScreen(void) { static void SwitchFullScreen(bool pressed) { if (!pressed) return; - GFX_SwitchFullScreen(); + + if (sdl.desktop.lazy_fullscreen) { +// sdl.desktop.lazy_fullscreen_req=true; + LOG_MSG("GFX LF: fullscreen switching not supported"); + } else { + GFX_SwitchFullScreen(); + } +} + +void GFX_SwitchLazyFullscreen(bool lazy) { + sdl.desktop.lazy_fullscreen=lazy; + sdl.desktop.lazy_fullscreen_req=false; +} + +void GFX_SwitchFullscreenNoReset(void) { + sdl.desktop.fullscreen=!sdl.desktop.fullscreen; +} + +bool GFX_LazyFullscreenRequested(void) { + if (sdl.desktop.lazy_fullscreen) return sdl.desktop.lazy_fullscreen_req; + return false; +} + +void GFX_RestoreMode(void) { + GFX_SetSize(sdl.draw.width,sdl.draw.height,sdl.draw.flags,sdl.draw.scalex,sdl.draw.scaley,sdl.draw.callback); + GFX_UpdateSDLCaptureState(); } @@ -1035,6 +1094,9 @@ static void GUI_StartUp(Section * sec) { SDL_WM_SetIcon(logos,NULL); #endif + sdl.desktop.lazy_fullscreen=false; + sdl.desktop.lazy_fullscreen_req=false; + sdl.desktop.fullscreen=section->Get_bool("fullscreen"); sdl.wait_on_error=section->Get_bool("waitonerror"); @@ -1339,6 +1401,10 @@ void GFX_LosingFocus(void) { MAPPER_LosingFocus(); } +bool GFX_IsFullscreen(void) { + return sdl.desktop.fullscreen; +} + void GFX_Events() { SDL_Event event; #if defined (REDUCE_JOYSTICK_POLLING) @@ -1364,8 +1430,7 @@ void GFX_Events() { #ifdef WIN32 if (sdl.desktop.fullscreen) { VGA_KillDrawing(); - sdl.desktop.fullscreen=false; - GFX_ResetScreen(); + GFX_ForceFullscreenExit(); } #endif GFX_CaptureMouse(); diff --git a/src/hardware/pci_bus.cpp b/src/hardware/pci_bus.cpp index f958cda2..43634ff9 100644 --- a/src/hardware/pci_bus.cpp +++ b/src/hardware/pci_bus.cpp @@ -131,6 +131,12 @@ static Bit8u read_pci_register(PCI_Device* dev,Bit8u regnum) { if ((parsed_regnum>=0) && (parsed_regnum<256)) return pci_cfg_data[dev->PCIId()][dev->PCISubfunction()][parsed_regnum]; + Bit8u newval, mask; + if (dev->OverrideReadRegister(regnum, &newval, &mask)) { + Bit8u oldval=pci_cfg_data[dev->PCIId()][dev->PCISubfunction()][regnum] & (~mask); + return oldval | (newval & mask); + } + return 0xff; } diff --git a/src/hardware/vga_draw.cpp b/src/hardware/vga_draw.cpp index e2089371..e4a57ef4 100644 --- a/src/hardware/vga_draw.cpp +++ b/src/hardware/vga_draw.cpp @@ -825,7 +825,7 @@ static void VGA_VerticalTimer(Bitu /*val*/) { break; } //Check if we can actually render, else skip the rest (frameskip) - if (!RENDER_StartUpdate()) + if (vga.draw.vga_override || !RENDER_StartUpdate()) return; vga.draw.address_line = vga.config.hlines_skip; @@ -1557,7 +1557,9 @@ void VGA_SetupDrawing(Bitu /*val*/) { LOG(LOG_VGA,LOG_NORMAL)("%s width, %s height aspect %f", doublewidth ? "double":"normal",doubleheight ? "double":"normal",aspect_ratio); #endif - RENDER_SetSize(width,height,bpp,(float)fps,aspect_ratio,doublewidth,doubleheight); + if (!vga.draw.vga_override) + RENDER_SetSize(width, height, bpp, (float)fps, aspect_ratio, + doublewidth, doubleheight); } } @@ -1567,5 +1569,19 @@ void VGA_KillDrawing(void) { PIC_RemoveEvents(VGA_DrawEGASingleLine); vga.draw.parts_left = 0; vga.draw.lines_done = ~0; - RENDER_EndUpdate(true); + if (!vga.draw.vga_override) RENDER_EndUpdate(true); +} + +void VGA_SetOverride(bool vga_override) { + if (vga.draw.vga_override!=vga_override) { + + if (vga_override) { + VGA_KillDrawing(); + vga.draw.vga_override=true; + } else { + vga.draw.vga_override=false; + vga.draw.width=0; // change it so the output window gets updated + VGA_SetupDrawing(0); + } + } }