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:
parent
41d307292b
commit
77970d28cd
5 changed files with 100 additions and 9 deletions
|
@ -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;
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue