From f0478225f0fbbe7bdf1b738bb74b3950219a5bc1 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Tue, 12 Nov 2019 19:30:28 -0500 Subject: [PATCH 1/2] Adjusts logic to reduce number of output spans. --- Machines/Atari/ST/Video.cpp | 40 ++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/Machines/Atari/ST/Video.cpp b/Machines/Atari/ST/Video.cpp index d98f690ef..a20a0a4c6 100644 --- a/Machines/Atari/ST/Video.cpp +++ b/Machines/Atari/ST/Video.cpp @@ -11,6 +11,7 @@ #include "../../../Outputs/Log.hpp" #include +#include using namespace Atari::ST; @@ -377,9 +378,13 @@ void Video::Shifter::flush_output(OutputMode next_mode) { case OutputMode::Sync: crt_.output_sync(duration_); break; case OutputMode::Blank: crt_.output_blank(duration_); break; case OutputMode::Border: { - uint16_t *const colour_pointer = reinterpret_cast(crt_.begin_data(1)); - if(colour_pointer) *colour_pointer = border_colour_; - crt_.output_level(duration_); + if(!border_colour_) { + crt_.output_blank(duration_); + } else { + uint16_t *const colour_pointer = reinterpret_cast(crt_.begin_data(1)); + if(colour_pointer) *colour_pointer = border_colour_; + crt_.output_level(duration_); + } } break; case OutputMode::Pixels: { crt_.output_data(duration_, pixel_pointer_); @@ -428,9 +433,34 @@ void Video::Shifter::output_border(int duration, OutputBpp bpp) { } void Video::Shifter::output_pixels(int duration, OutputBpp bpp) { - // If the shifter is empty, redirect this to an output_level call. + // If the shifter is empty and there's no pixel buffer at present, + // redirect this to an output_level call. Otherwise, do a quick + // memset-type fill, since the special case has been detected anyway. if(!output_shifter_) { - output_border(duration, bpp); + if(!pixel_buffer_) { + output_border(duration, bpp); + } else { + duration_ += duration; + + switch(bpp_) { + case OutputBpp::One: { + const size_t pixels = size_t(duration << 1); + memset(&pixel_buffer_[pixel_pointer_], 0, pixels * sizeof(uint16_t)); + pixel_pointer_ += pixels; + } break; + + default: + case OutputBpp::Four: + assert(!(duration & 1)); + duration >>= 1; + case OutputBpp::Two: { + while(duration--) { + pixel_buffer_[pixel_pointer_] = palette_[0]; + ++pixel_pointer_; + } + } break; + } + } return; } From 6a82c873209dcfd97be329484ddc5f60fa59d7ba Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Tue, 12 Nov 2019 19:33:13 -0500 Subject: [PATCH 2/2] Withdraws border optimisation temporarily; I think I may be onto an output bug here. --- Machines/Atari/ST/Video.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Machines/Atari/ST/Video.cpp b/Machines/Atari/ST/Video.cpp index a20a0a4c6..4a975c622 100644 --- a/Machines/Atari/ST/Video.cpp +++ b/Machines/Atari/ST/Video.cpp @@ -378,13 +378,13 @@ void Video::Shifter::flush_output(OutputMode next_mode) { case OutputMode::Sync: crt_.output_sync(duration_); break; case OutputMode::Blank: crt_.output_blank(duration_); break; case OutputMode::Border: { - if(!border_colour_) { - crt_.output_blank(duration_); - } else { +// if(!border_colour_) { +// crt_.output_blank(duration_); +// } else { uint16_t *const colour_pointer = reinterpret_cast(crt_.begin_data(1)); if(colour_pointer) *colour_pointer = border_colour_; crt_.output_level(duration_); - } +// } } break; case OutputMode::Pixels: { crt_.output_data(duration_, pixel_pointer_);