From 74ddc23daf1400c2560c3bd96bd9f4759e75b5b6 Mon Sep 17 00:00:00 2001 From: Ralf Grillenberger Date: Wed, 7 Apr 2010 21:07:17 +0000 Subject: [PATCH] Allow the renderer to abort a screen. Fixes crashes occurring with certain output modes, platforms and games. Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@3576 --- include/render.h | 2 +- src/gui/render.cpp | 4 ++-- src/hardware/vga_draw.cpp | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/include/render.h b/include/render.h index bbfd90eb..1d703e2e 100644 --- a/include/render.h +++ b/include/render.h @@ -91,7 +91,7 @@ extern Render_t render; extern ScalerLineHandler_t RENDER_DrawLine; void RENDER_SetSize(Bitu width,Bitu height,Bitu bpp,float fps,double ratio,bool dblw,bool dblh); bool RENDER_StartUpdate(void); -void RENDER_EndUpdate( ); +void RENDER_EndUpdate(bool abort); void RENDER_SetPal(Bit8u entry,Bit8u red,Bit8u green,Bit8u blue); diff --git a/src/gui/render.cpp b/src/gui/render.cpp index c76047c1..1ba60975 100644 --- a/src/gui/render.cpp +++ b/src/gui/render.cpp @@ -201,7 +201,7 @@ static void RENDER_Halt( void ) { } extern Bitu PIC_Ticks; -void RENDER_EndUpdate( void ) { +void RENDER_EndUpdate( bool abort ) { if (GCC_UNLIKELY(!render.updating)) return; RENDER_DrawLine = RENDER_EmptyLineHandler; @@ -220,7 +220,7 @@ void RENDER_EndUpdate( void ) { flags, fps, (Bit8u *)&scalerSourceCache, (Bit8u*)&render.pal.rgb ); } if ( render.scale.outWrite ) { - GFX_EndUpdate( Scaler_ChangedLines ); + GFX_EndUpdate( abort? NULL : Scaler_ChangedLines ); render.frameskip.hadSkip[render.frameskip.index] = 0; } else { #if 0 diff --git a/src/hardware/vga_draw.cpp b/src/hardware/vga_draw.cpp index 16b270eb..e981da0e 100644 --- a/src/hardware/vga_draw.cpp +++ b/src/hardware/vga_draw.cpp @@ -660,7 +660,7 @@ static void VGA_DrawSingleLine(Bitu /*blah*/) { if (vga.draw.split_line==vga.draw.lines_done) VGA_ProcessSplit(); if (vga.draw.lines_done < vga.draw.lines_total) { PIC_AddEvent(VGA_DrawSingleLine,(float)vga.draw.delay.htotal); - } else RENDER_EndUpdate(); + } else RENDER_EndUpdate(false); } static void VGA_DrawPart(Bitu lines) { @@ -690,7 +690,7 @@ static void VGA_DrawPart(Bitu lines) { #ifdef VGA_KEEP_CHANGES VGA_ChangesEnd(); #endif - RENDER_EndUpdate(); + RENDER_EndUpdate(false); } } @@ -883,7 +883,7 @@ static void VGA_VerticalTimer(Bitu /*val*/) { if (GCC_UNLIKELY(vga.draw.parts_left)) { LOG(LOG_VGAMISC,LOG_NORMAL)( "Parts left: %d", vga.draw.parts_left ); PIC_RemoveEvents(VGA_DrawPart); - RENDER_EndUpdate(); + RENDER_EndUpdate(true); } vga.draw.lines_done = 0; vga.draw.parts_left = vga.draw.parts_total; @@ -894,7 +894,7 @@ static void VGA_VerticalTimer(Bitu /*val*/) { LOG(LOG_VGAMISC,LOG_NORMAL)( "Lines left: %d", vga.draw.lines_total-vga.draw.lines_done); PIC_RemoveEvents(VGA_DrawSingleLine); - RENDER_EndUpdate(); + RENDER_EndUpdate(true); } vga.draw.lines_done = 0; PIC_AddEvent(VGA_DrawSingleLine,(float)(vga.draw.delay.htotal/4.0 + draw_skip)); @@ -1495,5 +1495,5 @@ void VGA_KillDrawing(void) { PIC_RemoveEvents(VGA_DrawSingleLine); vga.draw.parts_left = 0; vga.draw.lines_done = ~0; - RENDER_EndUpdate(); + RENDER_EndUpdate(true); }