]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
2410 2410
authorToni Wilen <twilen@winuae.net>
Wed, 9 May 2012 13:50:55 +0000 (16:50 +0300)
committerToni Wilen <twilen@winuae.net>
Wed, 9 May 2012 13:50:55 +0000 (16:50 +0300)
12 files changed:
akiko.cpp
custom.cpp
hardfile.cpp
include/xwin.h
od-win32/WinUAE_Install.nsi
od-win32/direct3d.cpp
od-win32/direct3d.h
od-win32/rp.cpp
od-win32/win32.h
od-win32/win32_scaler.cpp
od-win32/win32gfx.cpp
od-win32/winuaechangelog.txt

index ab1421e31ec48bff13a8d66f3b52db906111eeba..8da30cdb83e7898701f611b87f2b36c20f7551a6 100644 (file)
--- a/akiko.cpp
+++ b/akiko.cpp
@@ -897,6 +897,9 @@ static int cdrom_command_stop (void)
 /* pause CD audio */
 static int cdrom_command_pause (void)
 {
+#if AKIKO_DEBUG_IO_CMD
+       write_log (_T("CD32: pause: %d, %d\n"), cdrom_paused, cdrom_playing);
+#endif
        cdrom_audiotimeout = 0;
        cdrom_toc_counter = -1;
        cdrom_result_buffer[0] = cdrom_command;
@@ -915,6 +918,9 @@ static int cdrom_command_pause (void)
 /* unpause CD audio */
 static int cdrom_command_unpause (void)
 {
+#if AKIKO_DEBUG_IO_CMD
+       write_log (_T("CD32: unpause: %d, %d\n"), cdrom_paused, cdrom_playing);
+#endif
        cdrom_result_buffer[0] = cdrom_command;
        if (checkerr ())
                return 2;
index e21199cfc33b70efa0dcfda736fe5f1fdc8d6347..79dde56e939748b7122ecc18708559913b507421 100644 (file)
@@ -5225,8 +5225,8 @@ static void framewait (void)
                int t;
                curr_time = read_processor_time ();
                vsyncwaittime = vsyncmaxtime = curr_time + vsynctimebase;
-               if (!frame_rendered)
-                       frame_rendered = render_screen ();
+               if (!frame_rendered && !picasso_on)
+                       frame_rendered = render_screen (false);
                if (!frame_shown)
                        show_screen ();
                t = read_processor_time () - curr_time;
@@ -5260,6 +5260,14 @@ static void framewait (void)
                        int max, adjust, flipdelay;
                        frame_time_t now;
 
+                       if (!frame_rendered && !picasso_on) {
+                               frame_time_t start, end;
+                               start = read_processor_time ();
+                               frame_rendered = render_screen (currprefs.gfx_apmode[0].gfx_vflip == 0);
+                               end = read_processor_time ();
+                               frameskipt += end - start;
+                       }
+
                        curr_time = vsync_busywait_end (&flipdelay); // vsync time
                        vsync_busywait_do (NULL, (bplcon0 & 4) != 0 && !lof_changed && !lof_changing, lof_store != 0);
                        vsync_busywait_start ();
@@ -5275,13 +5283,19 @@ static void framewait (void)
 
                        now = read_processor_time (); // current time
                        adjust = (int)now - (int)curr_time;
+                       //write_log (_T("%d "), adjust);
                        if (adjust < 0)
                                adjust = 0;
+                       if (adjust > vsynctimebase * 2 / 3)
+                               adjust = 0;
+                       //write_log (_T("%d "), adjust);
                        
                        if (currprefs.gfx_apmode[0].gfx_vflip == 0) {
                                adjust += skipcnt;
-                               //write_log (L"%d ", skipcnt);
+                               //write_log (_T("%d "), skipcnt);
                        }
+                       adjust += frameskipt;
+                       //write_log (_T("%d "), adjust);
 
                        if (adjust > vsynctimebase / 2)
                                adjust = vsynctimebase / 2;
@@ -5305,17 +5319,20 @@ static void framewait (void)
                        frame_time_t now;
 
                        flipdelay = 0;
-                       frame_rendered = render_screen ();
-                       curr_time = vsync_busywait_do (&freetime, (bplcon0 & 4) != 0 && !lof_changed && !lof_changing, lof_store != 0);
-                       vsync_busywait_end (&flipdelay);
+                       if (!frame_rendered && !picasso_on)
+                               frame_rendered = render_screen (false);
+                       vsync_busywait_do (&freetime, (bplcon0 & 4) != 0 && !lof_changed && !lof_changing, lof_store != 0);
+                       curr_time = vsync_busywait_end (&flipdelay);
                        if (extraframewait)
                                sleep_millis_main (extraframewait);
                        now = read_processor_time ();
                        adjust = (int)now - (int)curr_time;
                        if (adjust < 0)
                                adjust = 0;
-                       if (adjust > vsynctimebase / 3)
-                               adjust = vsynctimebase / 3;
+                       if (adjust > vsynctimebase)
+                               adjust = 0;
+                       if (adjust > vsynctimebase / 2)
+                               adjust = vsynctimebase / 2;
                        max = vsynctimebase - (adjust * 3 / 2);
 
                        vsyncmintime = now;
@@ -5335,11 +5352,11 @@ static void framewait (void)
                        }
 
                        vsynctimeperline = (max - skipcnt * 2) / 3;
-                       //if (vsynctimeperline < 1)
+                       if (vsynctimeperline < 1)
                                vsynctimeperline = 1;
                        vsyncmaxtime = now + max;
 
-                       //write_log (L"%d ", vsynctimeperline);
+                       //write_log (_T("%d:%d:%d "), adjust, skipcnt, vsynctimeperline);
 
                        frame_shown = true;
 
@@ -5349,6 +5366,9 @@ static void framewait (void)
 
        if (currprefs.m68k_speed < 0) {
 
+               if (!frame_rendered && !picasso_on)
+                       frame_rendered = render_screen (false);
+
                if (currprefs.m68k_speed_throttle) {
                        // this delay can safely overshoot frame time by 1-2 ms, following code will compensate for it.
                        for (;;) {
@@ -5387,7 +5407,7 @@ static void framewait (void)
 
                if (!frame_rendered && !picasso_on) {
                        start = read_processor_time ();
-                       frame_rendered = render_screen ();
+                       frame_rendered = render_screen (false);
                        t = read_processor_time () - start;
                }
                for (;;) {
@@ -5514,10 +5534,10 @@ static void vsync_handler_pre (void)
        
        if (!picasso_on) {
                if (!frame_rendered && vblank_hz_state) {
-                       frame_rendered = render_screen ();
-                       if (frame_rendered && !frame_shown) {
-                               frame_shown = show_screen_maybe (isvsync_chipset () >= 0);
-                       }
+                       frame_rendered = render_screen (false);
+               }
+               if (frame_rendered && !frame_shown) {
+                       frame_shown = show_screen_maybe (isvsync_chipset () >= 0);
                }
        }
 
@@ -6069,6 +6089,7 @@ static void hsync_handler_post (bool onvsync)
                        while (!vblank_found_chipset && (int)vsyncmintime - (int)(rpt + vsynctimebase / 10) > 0 && (int)vsyncmintime - (int)rpt < vsynctimebase) {
                                sleep_millis_main (1);
                                rpt = read_processor_time ();
+                               //write_log (L"*");
                        }
                }
        }
@@ -6182,7 +6203,7 @@ static void hsync_handler_post (bool onvsync)
                vsync_rendered = true;
                vsync_handle_redraw (lof_store, lof_changed, bplcon0, bplcon3);
                if (vblank_hz_state) {
-                       frame_rendered = render_screen ();
+                       frame_rendered = render_screen (true);
                }
                frame_shown = true;
                end = read_processor_time ();
index a7f56b998065eae21ba8adbde4165e96c47058f0..d9ef11e6e10915a4bef1a632d9b2ad9518098226 100644 (file)
@@ -1563,7 +1563,7 @@ static uae_u32 REGPARAM2 hardfile_open (TrapContext *context)
                        }
                }
                if (unit < 1000 || is_hardfile (unit) == FILESYS_VIRTUAL || is_hardfile (unit) == FILESYS_CD)
-                       err = 50; /* c */
+                       err = 50; /* HFERR_NoBoard */
        } else {
                err = IOERR_BADLENGTH;
        }
index 6ab7ea5593372d63f0055b89dfd3cb5c4c3b67a0..de4c61b45c77f2d218f21061b2633563a5e4fbc3 100644 (file)
@@ -43,7 +43,7 @@ extern void flush_line (struct vidbuffer*, int);
 extern void flush_block (struct vidbuffer*, int, int);
 extern void flush_screen (struct vidbuffer*, int, int);
 extern void flush_clear_screen (struct vidbuffer*);
-extern bool render_screen (void);
+extern bool render_screen (bool);
 extern void show_screen (void);
 extern bool show_screen_maybe (bool);
 
index b096b95a988437d49a6563fc3fc50f5d5b75a5ff..332505e624bd263c74a139e42ee5555f51051b61 100644 (file)
@@ -1,5 +1,5 @@
 !define PRODUCT_NAME "WinUAE"
-!define PRODUCT_VERSION "2.4.0"
+!define PRODUCT_VERSION "2.4.1"
 !define PRODUCT_PUBLISHER "Arabuusimiehet"
 !define PRODUCT_WEB_SITE "http://www.winuae.net/"
 !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\winuae.exe"
index 7a9ee3063a66dd21d4e7afc41b830a1d61fb92fb..0c822c081b5c51b0ac00e1fc18e3897e79ea986a 100644 (file)
@@ -2735,11 +2735,12 @@ void D3D_unlocktexture (void)
 
        if (!isd3d () || !texture)
                return;
-       if (currprefs.leds_on_screen & (STATUSLINE_CHIPSET | STATUSLINE_RTG))
-               updateleds ();
 
-       if (locked)
+       if (locked) {
+               if (currprefs.leds_on_screen & (STATUSLINE_CHIPSET | STATUSLINE_RTG))
+                       updateleds ();
                hr = texture->UnlockRect (0);
+       }
        locked = 0;
        fulllocked = 0;
 }
@@ -2816,7 +2817,7 @@ static void flushgpu (bool wait)
        }
 }
 
-bool D3D_renderframe (void)
+bool D3D_renderframe (bool immediate)
 {
        static int vsync2_cnt;
 
@@ -2824,8 +2825,12 @@ bool D3D_renderframe (void)
                return false;
 
        if (filenotificationhandle != NULL) {
+               bool notify = false;
                while (WaitForSingleObject (filenotificationhandle, 0) == WAIT_OBJECT_0) {
                        FindNextChangeNotification (filenotificationhandle);
+                       notify = true;
+               }
+               if (notify) {
                        devicelost = 2;
                        write_log (_T("%s: Shader file modification notification\n"), D3DHEAD);
                }
@@ -2838,7 +2843,7 @@ bool D3D_renderframe (void)
        }
 
        D3D_render2 ();
-       flushgpu (false);
+       flushgpu (immediate);
 
        return true;
 }
index 78fbecf762378c29af1cca98688676c7676d476b..df04c8d58fdf98020c075f149d54b88a1a5daed0 100644 (file)
@@ -4,7 +4,7 @@ extern const TCHAR *D3D_init (HWND ahwnd, int w_w, int h_h, int depth, int mmult
 extern bool D3D_alloctexture (int, int);
 extern void D3D_getpixelformat (int depth,int *rb, int *bb, int *gb, int *rs, int *bs, int *gs, int *ab, int *ar, int *a);
 extern void D3D_refresh (void);
-extern bool D3D_renderframe (void);
+extern bool D3D_renderframe (bool);
 extern void D3D_showframe (void);
 extern uae_u8 *D3D_locktexture(int*, bool);
 extern void D3D_unlocktexture(void);
index 236376071a71ac45ea65effbdd49c1c071ad2cd2..5931cd0c56bdd5ffc69104e150922287d24c116e 100644 (file)
@@ -739,11 +739,17 @@ static void set_screenmode (struct RPScreenMode *sm, struct uae_prefs *p)
        } else if (integerscale) {
                hmult = vmult = 1;
                p->gfx_filter_autoscale = AUTOSCALE_INTEGER;
-               if (sm->lClipWidth > 0)
-                       p->gfx_xcenter_size = sm->lClipWidth;
-               if (sm->lClipHeight > 0)
-                       p->gfx_ycenter_size = sm->lClipHeight;
-
+               if (sm->dwClipFlags & RP_CLIPFLAGS_AUTOCLIP) {
+                       p->gfx_xcenter_pos = -1;
+                       p->gfx_ycenter_pos = -1;
+                       p->gfx_xcenter_size = -1;
+                       p->gfx_ycenter_size = -1;
+               } else {
+                       if (sm->lClipWidth > 0)
+                               p->gfx_xcenter_size = sm->lClipWidth;
+                       if (sm->lClipHeight > 0)
+                               p->gfx_ycenter_size = sm->lClipHeight;
+               }
        }
 
        if (keepaspect) {
index 5e2ee498d1942bc62b762b51ddaed7c58649e8a0..0bb8ee2fd9ba675e256e615e6cda89ad4608aed1 100644 (file)
 #define GETBDM(x) (((x) - ((x / 10000) * 10000)) / 100)
 #define GETBDD(x) ((x) % 100)
 
-#define WINUAEPUBLICBETA 1
+#define WINUAEPUBLICBETA 0
 #define LANG_DLL 1
 
-//#define WINUAEBETA _T("")
-#define WINUAEBETA _T("14")
-#define WINUAEDATE MAKEBD(2012, 5, 6)
+#define WINUAEBETA _T("")
+//#define WINUAEBETA _T("14")
+#define WINUAEDATE MAKEBD(2012, 5, 9)
 #define WINUAEEXTRA _T("")
 //#define WINUAEEXTRA _T("AmiKit Preview")
 #define WINUAEREV _T("")
index f2f06e7397047547f70d3b4ee9e809214ced9726..9d04ee841c9b45df573fd5ae47f61922ce247941 100644 (file)
@@ -244,16 +244,16 @@ void getfilterrect2 (RECT *sr, RECT *dr, RECT *zr, int dst_width, int dst_height
                                cw = gfxvidinfo.outbuffer->outwidth;
                                ch = gfxvidinfo.outbuffer->outheight;
                        } else {
-                               cw = gfxvidinfo.drawbuffer.inwidth;
-                               ch = gfxvidinfo.drawbuffer.inheight;
                                cx = 0;
                                cy = 0;
+                               cw = gfxvidinfo.drawbuffer.inwidth;
+                               ch = gfxvidinfo.drawbuffer.inheight;
                                cv = 1;
-                               if (!(beamcon0 & 0x80) && (scalemode == AUTOSCALE_STATIC_NOMINAL || scalemode == AUTOSCALE_INTEGER)) {
-                                       cw -= 40 << currprefs.gfx_resolution;
-                                       ch -= 25 << currprefs.gfx_vresolution;
+                               if (!(beamcon0 & 0x80) && (scalemode == AUTOSCALE_STATIC_NOMINAL)) { // || scalemode == AUTOSCALE_INTEGER)) {
                                        cx = 28 << currprefs.gfx_resolution;
                                        cy = 10 << currprefs.gfx_vresolution;
+                                       cw -= 40 << currprefs.gfx_resolution;
+                                       ch -= 25 << currprefs.gfx_vresolution;
                                }
                        }
 
@@ -262,8 +262,15 @@ void getfilterrect2 (RECT *sr, RECT *dr, RECT *zr, int dst_width, int dst_height
                                int maxh = currprefs.gfx_size.height;
                                int mult = 1;
 
-                               if (currprefs.gfx_xcenter_pos > 0 || currprefs.gfx_xcenter_size > 0)
-                                       getmanualpos (&cx, &cy, &cw, &ch);
+                               if (currprefs.gfx_xcenter_pos >= 0 || currprefs.gfx_ycenter_pos >= 0) {
+                                       changed_prefs.gfx_filter_horiz_offset = currprefs.gfx_filter_horiz_offset = 0;
+                                       changed_prefs.gfx_filter_vert_offset = currprefs.gfx_filter_vert_offset = 0;
+                                       filter_horiz_offset = 0;
+                                       filter_vert_offset = 0;
+                                       get_custom_topedge (&cx, &cy);
+                               }
+
+                               getmanualpos (&cx, &cy, &cw, &ch);
 
                                if (cw > maxw || ch > maxh) {
                                        while (cw / mult > maxw || ch / mult > maxh)
index a118d5ed395aa605dc73ca6370a6a377633271da..235b26d2e15ea6d69b54d35c612aae75eed0e36d 100644 (file)
@@ -912,7 +912,7 @@ void flush_screen (struct vidbuffer *vb, int a, int b)
 
 static volatile bool render_ok;
 
-bool render_screen (void)
+bool render_screen (bool immediate)
 {
        bool v = false;
 
@@ -923,7 +923,7 @@ bool render_screen (void)
        flushymax = currentmode->amiga_height;
        EnterCriticalSection (&screen_cs);
        if (currentmode->flags & DM_D3D) {
-               v = D3D_renderframe ();
+               v = D3D_renderframe (immediate);
        } else if (currentmode->flags & DM_SWSCALE) {
                S2X_render ();
                v = true;
@@ -1225,7 +1225,7 @@ void gfx_unlock_picasso (bool dorender)
                }
                D3D_unlocktexture ();
                if (dorender) {
-                       if (D3D_renderframe ()) {
+                       if (D3D_renderframe (false)) {
                                LeaveCriticalSection (&screen_cs);
                                render_ok = true;
                                show_screen_maybe (true);
@@ -2582,7 +2582,6 @@ static unsigned int __stdcall vblankthread (void *dummy)
                        Sleep (100);
                } else if (mode == VBLANKTH_ACTIVE_WAIT) {
                        sleep_millis (1);
-                       ResetEvent (vblankwaitevent);
                } else if (mode == VBLANKTH_ACTIVE_START) {
                        // do not start until vblank has been passed
                        int vp;
@@ -2595,6 +2594,7 @@ static unsigned int __stdcall vblankthread (void *dummy)
                                sleep_millis (1);
                                continue;
                        }
+                       ResetEvent (vblankwaitevent);
                        if (vp > maxscanline / 2)
                                vp = maxscanline / 2;
                        frame_time_t rpt = read_processor_time ();
@@ -2666,9 +2666,11 @@ static unsigned int __stdcall vblankthread (void *dummy)
                                                        }
                                                        show_screen ();
                                                        render_ok = false;
-                                                       int delay = (read_processor_time () - t) / (vblank_skipeveryother ? 2 : 1);
+                                                       int delay = read_processor_time () - t;
                                                        if (delay < 0)
                                                                delay = 0;
+                                                       else if (delay > vblankbasefull)
+                                                               delay = 0;
                                                        else if (delay > vblankbasefull * 2 / 3)
                                                                delay = vblankbasefull * 2 / 3;
                                                        vblank_found_flipdelay = delay;
@@ -2696,8 +2698,8 @@ static unsigned int __stdcall vblankthread (void *dummy)
                                thread_vblank_time = thread_vblank_time2;
                                vblank_found_rtg = vblank_found_rtg2;
                                vblank_found = vblank_found2;
-                               SetEvent (vblankwaitevent);
                                vblankthread_mode = VBLANKTH_ACTIVE_WAIT;
+                               SetEvent (vblankwaitevent);
                        } else if (!donotwait || ap->gfx_vflip || picasso_on) {
                                sleep_millis (1);
                        }
@@ -2728,12 +2730,13 @@ frame_time_t vsync_busywait_end (int *flipdelay)
                }
                prev = vblank_prev_time;
                if (!dooddevenskip) {
-                       if (vblankthread_mode == VBLANKTH_ACTIVE) {
-                               frame_time_t t = read_processor_time ();
-                               while (vblankthread_mode == VBLANKTH_ACTIVE)
-                                       WaitForSingleObject (vblankwaitevent, 10);
-                               idletime += read_processor_time () - t;
+                       int delay = 10;
+                       frame_time_t t = read_processor_time ();
+                       while (delay-- > 0) {
+                               if (WaitForSingleObject (vblankwaitevent, 10) != WAIT_TIMEOUT)
+                                       break;
                        }
+                       idletime += read_processor_time () - t;
                }
                if (flipdelay)
                        *flipdelay = vblank_found_flipdelay;
@@ -2742,7 +2745,7 @@ frame_time_t vsync_busywait_end (int *flipdelay)
        } else {
                if (flipdelay)
                        *flipdelay = vblank_flip_delay;
-               return vblank_prev_time + vblankbasefull;
+               return vblank_prev_time;
        }
 }
 
index 8d39018086203eafd24b0fe20684aecfb535a760..37678178f2f6823a2a037434cdb3886039660134 100644 (file)
@@ -1,11 +1,20 @@
 
 - restore only single input target to default.
 - hdd from command line
+- no-buffer tearing updates
+- 50/60 autoswitch: support also 100/120
+- cd32 cda problems (universe, rnc loader)
+
+2.4.1
+
+- Try to flush GPU queue after rendering the frame to prevent delayed background flipping that
+  introduces tearing on fastest possible no buffer low latency mode.
+- Integer scaling + gfx_xcenter_pos or gfx_ycenter_pos set had wrong positioning.
 
 Beta 14: (RC3)
 
 - Cycle-exact/approximate CPU speed non-vsync b1 sound sync update didn't work, it did nothing.
-- Some more low latency vsync timing updates, improved dynamic adjusment.
+- Some more low latency vsync timing updates, improved dynamic adjustment.
 - Legacy vsync slowdown problems fixed (2.4.0)
 - Restored (50Hz) and (60Hz) fake rates that were removed in 2.4.0. Only available in legacy vsync mode.
 - RTG + low latency vsync was not stable.