Fix rendering buffer handling
[mercenary-reloaded.git] / src / mercenary / main.c
index 27935dd..cd0bd6a 100644 (file)
@@ -298,6 +298,7 @@ static void main_loop(void)
 {
        double frame_step, frame_time = 0.0, frame_render = 1;
        int had_first_irq = 0;
+       int render_improved_rc;
        static uint32_t current_time, last_time = 0, diff;
        int i, rc;
        int space, length;
@@ -337,10 +338,8 @@ static void main_loop(void)
                        /* be sure to clean all capture history, so we don't get glichtes when turning on improved rendering again */
                        render_capture_reset();
                }
-               if (render_improved) {
+               if (render_improved)
                        opengl_viewport_improved(debug_opengl, (double_pixel_size) ? BENSON_AT_LINE * 2 : BENSON_AT_LINE, config_fov, benson_size);
-                       opengl_copy_last();
-               }
                /* STEP 1: let the CPU render/process the game, also improve rendering via OpenGL, if enabled */
                /* amgia speed: don't render if we still delay */
                /* non amiga speed: render if we need a new frame */
@@ -378,7 +377,9 @@ static void main_loop(void)
                }
                /* render improved graphics, interpolate, if required */
                if (render_improved)
-                       render_all_items((config_amiga_speed) ? 1.0 : frame_time);
+                       render_improved_rc = render_all_items((config_amiga_speed) ? 1.0 : frame_time);
+               else
+                       render_improved_rc = -1;
                /* advance frame time, if we are not in help view  */
                if (!(had_first_irq && help_view)) {
 //printf("frame rate: %.6f, frame-step=%.5f frame-time=%.5f\n", 1.0 / vbl_duration, frame_step,frame_time);
@@ -394,11 +395,11 @@ static void main_loop(void)
                        /* render game view without benson
                         * because benson is not updated before VBL IRQ, we don't want old image from double buffer
                         */
-                       if (render_legacy)
+                       if (render_legacy || render_improved_rc)
                                emul_video(image, memory, palette, IMAGE_WIDTH, IMAGE_HEIGHT, IMAGE_DIWSTART, chipreg, 0, BENSON_AT_LINE, double_pixel_size);
                }
                /* render benson + osd ontop of improved opengl rendering, if enabled */
-               if (render_improved) {
+               if (render_improved && render_improved_rc == 0) {
                        opengl_blit_benson(image, config_video_filter, (double_pixel_size) ? BENSON_AT_LINE * 2 : BENSON_AT_LINE, config_fov, benson_size, (double_pixel_size) ? 2 : 1);
                        if (help_view)
                                opengl_blit_osd(0, help_osd, config_video_filter, (double_pixel_size) ? BENSON_AT_LINE * 2 : BENSON_AT_LINE, config_fov, benson_size, 1.0, 1.0, 0.0, 0.0);
@@ -409,7 +410,8 @@ static void main_loop(void)
                        }
                }
                /* setup viewport for legacy image and render image, if enabled */
-               if (render_legacy) {
+               /* also render legacy, if render_improved failed due to not (yet) available items */
+               if (render_legacy || (render_improved && render_improved_rc)) {
                        opengl_viewport_legacy(debug_opengl);
                        opengl_blit_legacy(image, config_video_filter);
                        if (help_view)