1
0
Fork 0

small additions: vga override, lazy fullscreen switching, pci read override

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@3768
This commit is contained in:
Sebastian Strohhäcker 2011-12-11 17:30:50 +00:00
parent 41d307292b
commit 77970d28cd
5 changed files with 100 additions and 9 deletions

View file

@ -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;

View file

@ -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 */

View file

@ -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();

View file

@ -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;
}

View file

@ -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);
}
}
}