From a04621fc0f73f67ebecf2f38f676fd7a552af544 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Thu, 4 Dec 2025 19:16:24 +0200 Subject: [PATCH] Always use temp display buffer mode when recording. --- drawing.cpp | 9 ++++++++- include/drawing.h | 1 + od-win32/avioutput.cpp | 2 ++ od-win32/screenshot.cpp | 7 ++++++- od-win32/win32_scaler.cpp | 4 ++-- 5 files changed, 19 insertions(+), 4 deletions(-) diff --git a/drawing.cpp b/drawing.cpp index 660ccd18..8d418604 100644 --- a/drawing.cpp +++ b/drawing.cpp @@ -287,6 +287,7 @@ static int resolution_count[RES_MAX + 1], lines_count; static int center_reset; static bool init_genlock_data; bool need_genlock_data; +int video_recording_active; /* Lookup tables for dual playfields. The dblpf_*1 versions are for the case that playfield 1 has the priority, dbplpf_*2 are used if playfield 2 has @@ -1927,13 +1928,16 @@ static void refresh_indicator_init(void) bool drawing_can_lineoptimizations(void) { - if (currprefs.monitoremu || currprefs.cs_cd32fmv || ((currprefs.genlock || currprefs.genlock_effects) && currprefs.genlock_image) || + if (currprefs.cs_cd32fmv || ((currprefs.genlock || currprefs.genlock_effects) && currprefs.genlock_image) || currprefs.cs_color_burst || currprefs.gfx_grayscale || currprefs.monitoremu) { return false; } if ((lightpen_active && currprefs.lightpen_crosshair) || debug_dma >= 2 || debug_heatmap >= 2) { return false; } + if (video_recording_active) { + return false; + } return true; } @@ -1958,6 +1962,9 @@ static void draw_frame_extras(struct vidbuffer *vb, int y_start, int y_end) lightpen_update(vb, 1); } } + if (video_recording_active) { + denise_lock(); + } } extern bool beamracer_debug; diff --git a/include/drawing.h b/include/drawing.h index cc3b939d..3880cc08 100644 --- a/include/drawing.h +++ b/include/drawing.h @@ -24,6 +24,7 @@ extern int visible_left_border, visible_right_border; extern int detected_screen_resolution; extern int hsync_end_left_border, hdisplay_left_border, denisehtotal; extern int vsync_startline; +extern int video_recording_active; #define AMIGA_WIDTH_MAX (754 / 2) #define AMIGA_HEIGHT_MAX_PAL (576 / 2) diff --git a/od-win32/avioutput.cpp b/od-win32/avioutput.cpp index 3434ef56..33dde02e 100644 --- a/od-win32/avioutput.cpp +++ b/od-win32/avioutput.cpp @@ -1399,6 +1399,7 @@ static void AVIOutput_End2(bool fullrestart) fclose (wavfile); wavfile = 0; } + video_recording_active &= ~1; } void AVIOutput_End(void) @@ -1603,6 +1604,7 @@ static void AVIOutput_Begin2(bool fullstart, bool immediate) fps_in_use = avioutput_fps; uae_start_thread(_T("aviworker"), AVIOutput_worker, NULL, NULL); write_log(_T("AVIOutput enabled: monitor=%d video=%d audio=%d path='%s'\n"), aviout_monid, avioutput_video, avioutput_audio, avioutput_filename_inuse); + video_recording_active |= 1; return; error: diff --git a/od-win32/screenshot.cpp b/od-win32/screenshot.cpp index 5ec70f18..eac426f5 100644 --- a/od-win32/screenshot.cpp +++ b/od-win32/screenshot.cpp @@ -1235,8 +1235,10 @@ oops: recursive--; - if (failed) + if (failed) { screenshot_multi = 0; + video_recording_active &= ~2; + } return failed == 0; } @@ -1251,13 +1253,16 @@ void screenshot(int monid, int mode, int doprepare) if (mode == 2) { screenshot_multi = 10; + video_recording_active |= 2; screenshot_prepare_multi(); } else if (mode == 3) { screenshot_multi = -1; screenshot_prepare_multi(); + video_recording_active &= ~2; } else if (mode == 4) { screenshot_multi = 0; filenumber = 0; + video_recording_active &= ~2; } else { screenshotf(monid, NULL, mode, doprepare, -1, NULL); } diff --git a/od-win32/win32_scaler.cpp b/od-win32/win32_scaler.cpp index d422136c..a555dd26 100644 --- a/od-win32/win32_scaler.cpp +++ b/od-win32/win32_scaler.cpp @@ -789,7 +789,7 @@ void freefilterbuffer(int monid, uae_u8 *buf, bool unlock) { struct AmigaMonitor *mon = &AMonitors[monid]; struct vidbuf_description *avidinfo = &adisplays[monid].gfxvidinfo; - struct vidbuffer *vb = avidinfo->outbuffer; + struct vidbuffer *vb = avidinfo->inbuffer; if (!vb) return; @@ -802,7 +802,7 @@ uae_u8 *getfilterbuffer(int monid, int *widthp, int *heightp, int *pitch, int *d { struct AmigaMonitor *mon = &AMonitors[monid]; struct vidbuf_description *avidinfo = &adisplays[monid].gfxvidinfo; - struct vidbuffer *vb = avidinfo->outbuffer; + struct vidbuffer *vb = avidinfo->inbuffer; int w, h; *widthp = 0; -- 2.47.3