]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Check both D3D9 and D3D11 before falling back to GDI.
authorToni Wilen <twilen@winuae.net>
Wed, 2 Apr 2025 17:08:21 +0000 (20:08 +0300)
committerToni Wilen <twilen@winuae.net>
Wed, 2 Apr 2025 17:08:21 +0000 (20:08 +0300)
od-win32/direct3d.cpp
od-win32/gdirender.cpp
od-win32/win32gfx.cpp

index 6866f0318c9be7abfe475de7b919367f87559458..13925f5ad79c1496ede64bd9a4956c14185e0ac7 100644 (file)
@@ -2852,6 +2852,13 @@ static const TCHAR *D3D_init2 (struct d3dstruct *d3d, HWND ahwnd, int w_w, int w
        
        write_log (_T("\n"));
 
+       if (!(d3dCaps.TextureCaps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL) && (d3dCaps.TextureCaps & D3DPTEXTURECAPS_POW2)) {
+               D3D_free(monid, true);
+               _stprintf(errmsg, _T("%s: Display driver only supports power of 2 texture sizes."),
+                       D3DHEAD);
+               return errmsg;
+       }
+
        write_log (_T("%s: PS=%d.%d VS=%d.%d %d*%d*%d%s%s VS=%d B=%d%s %d (%dx%d)\n"),
                D3DHEAD,
                (d3dCaps.PixelShaderVersion >> 8) & 0xff, d3dCaps.PixelShaderVersion & 0xff,
@@ -3786,11 +3793,13 @@ static void xD3D_unlocktexture(int monid, int y_start, int y_end)
                if (d3d->locked == 2) {
                        tex = d3d->texture2;
                }
-               if (currprefs.leds_on_screen & (STATUSLINE_CHIPSET | STATUSLINE_RTG))
+               if (currprefs.leds_on_screen & (STATUSLINE_CHIPSET | STATUSLINE_RTG)) {
                        updateleds(d3d);
+               }
                hr = tex->UnlockRect(0);
-               if (y_start >= 0 && y_end >= 0 && !d3d->turbo_skip)
+               if (y_start >= 0 && y_end >= 0 && !d3d->turbo_skip) {
                        xD3D_flushtexture(monid, y_start, y_end);
+               }
        }
        d3d->locked = 0;
        d3d->fulllocked = 0;
index e8340ab537146b6868dd4f8bb0bf7039f1cf00a0..cb7087239c9f77ab32555ae96562676095f5fc83 100644 (file)
@@ -407,6 +407,7 @@ static void gdi_showframe(int monid)
 static void gdi_refresh(int monid)
 {
        gdi_clear(monid);
+       gdi_renderframe(monid, true, true);
        gdi_showframe(monid);
 }
 
@@ -435,7 +436,7 @@ static const TCHAR *gdi_init(HWND ahwnd, int monid, int w_w, int w_h, int *freq,
 
        if (isfullscreen() > 0) {
                *errp = 2;
-               return _T("GDI fullscreen not supported");
+               return _T("GDI: fullscreen not supported");
        }
        gdi_free(monid, true);
        gdi->hwnd = ahwnd;
@@ -453,7 +454,7 @@ static const TCHAR *gdi_init(HWND ahwnd, int monid, int w_w, int w_h, int *freq,
        }
 
        *errp = 1;
-       return _T("failed to allocate buffer");
+       return _T("GDI: failed to allocate buffers");
 }
 
 static HDC gdi_getDC(int monid, HDC hdc)
index 0a642c67f6e5ca4d7514f14b3b64371383ffb54a..70a57a9a48685a47ef0c9f40c2bb7d59bd09b9c6 100644 (file)
@@ -2936,11 +2936,6 @@ void gfx_set_picasso_colors(int monid, RGBFTYPE rgbfmt)
        alloc_colors_picasso(red_bits, green_bits, blue_bits, red_shift, green_shift, blue_shift, rgbfmt, p96_rgbx16);
 }
 
-static void gfxmode_reset(int monid)
-{
-       struct amigadisplay *ad = &adisplays[monid];
-}
-
 int machdep_init(void)
 {
        for (int i = 0; i < MAX_AMIGAMONITORS; i++) {
@@ -2972,10 +2967,8 @@ int graphics_init(bool mousecapture)
        systray (hHiddenWnd, TRUE);
        systray (hHiddenWnd, FALSE);
        d3d_select(&currprefs);
-       gfxmode_reset(0);
        if (open_windows(&AMonitors[0], mousecapture, false)) {
                if (currprefs.monitoremu_mon > 0 && currprefs.monitoremu) {
-                       gfxmode_reset(currprefs.monitoremu_mon);
                        open_windows(&AMonitors[currprefs.monitoremu_mon], mousecapture, false);
                }
                return true;
@@ -3765,6 +3758,8 @@ static BOOL doInit(struct AmigaMonitor *mon)
 {
        int ret = 0;
        bool modechanged;
+       int retrymask = 0;
+       int original_api = currprefs.gfx_api;
 
 retry:
        struct vidbuf_description *avidinfo = &adisplays[mon->monitor_id].gfxvidinfo;
@@ -3776,7 +3771,7 @@ retry:
        if (wasfs[1] == 0)
                regqueryint(NULL, wasfsname[1], &wasfs[1]);
 
-       gfxmode_reset(mon->monitor_id);
+       d3d_select(&currprefs);
 
        for (;;) {
                updatemodes(mon);
@@ -3837,42 +3832,75 @@ retry:
                const TCHAR *err = D3D_init(mon->hAmigaWnd, mon->monitor_id, mon->currentmode.native_width, mon->currentmode.native_height,
                        &mon->currentmode.freq, fmh, fmv, &errv);
                if (errv > 0) {
+                       // GDI but fullscreen/not supported
                        if (errv == 2 && currprefs.gfx_api == 0) {
-                               write_log("Retrying D3D %s\n", err);
-                               changed_prefs.gfx_api = currprefs.gfx_api = 2;
-                               update_gfxparams(mon);
-                               goto retry;
+                               if (!(retrymask & (1 << 2))) {
+                                       retrymask |= 1 << 2;
+                                       write_log(_T("Retrying: D3D11, ERR=%s\n"), err);
+                                       changed_prefs.gfx_api = currprefs.gfx_api = 2;
+                                       update_gfxparams(mon);
+                                       goto retry;
+                               }
                        }
-                       gfx_hdr = false;
-                       if (currprefs.gfx_api >= 2) {
-                               D3D_free(0, true);
-                               changed_prefs.gfx_api = currprefs.gfx_api = 1;
-                               d3d_select(&currprefs);
-                               error_log(_T("Direct3D11 failed to initialize ('%s'), falling back to Direct3D9."), err);
-                               errv = 0;
-                               err = D3D_init(mon->hAmigaWnd, mon->monitor_id, mon->currentmode.native_width, mon->currentmode.native_height,
-                                       &mon->currentmode.freq, fmh, fmv, &errv);
+                       // D3D9 but not supported
+                       if (errv == 1 && currprefs.gfx_api == 1) {
+                               if (!(retrymask & (1 << 2))) {
+                                       retrymask |= 1 << 2;
+                                       write_log(_T("Retrying: D3D11, ERR=%s\n"), err);
+                                       changed_prefs.gfx_api = currprefs.gfx_api = 2;
+                                       update_gfxparams(mon);
+                                       goto retry;
+                               } else if (!(retrymask & (1 << 0))) {
+                                       retrymask |= 1 << 0;
+                                       write_log(_T("Retrying: GDI, ERR=%s\n"), err);
+                                       changed_prefs.gfx_api = currprefs.gfx_api = 0;
+                                       update_gfxparams(mon);
+                                       goto retry;
+                               }
+                       }
+                       // D3D11 but not supported
+                       if (errv == 1 && currprefs.gfx_api == 2) {
+                               if (!(retrymask & (1 << 1))) {
+                                       retrymask |= 1 << 1;
+                                       write_log(_T("Retrying: D3D9, ERR=%s\n"), err);
+                                       changed_prefs.gfx_api = currprefs.gfx_api = 1;
+                                       update_gfxparams(mon);
+                                       goto retry;
+                               }
+                       }
+                       if (errv == 1 && currprefs.gfx_api == 3) {
+                               if (!(retrymask & (1 << 2))) {
+                                       retrymask |= 1 << 2;
+                                       write_log(_T("Retrying: D3D11 NOHDR, ERR=%s\n"), err);
+                                       changed_prefs.gfx_api = currprefs.gfx_api = 2;
+                                       update_gfxparams(mon);
+                                       goto retry;
+                               } else if (!(retrymask & (1 << 1))) {
+                                       retrymask |= 1 << 1;
+                                       write_log(_T("Retrying: D3D9, ERR=%s\n"), err);
+                                       changed_prefs.gfx_api = currprefs.gfx_api = 1;
+                                       update_gfxparams(mon);
+                                       goto retry;
+                               } else if (!(retrymask & (1 << 0))) {
+                                       retrymask |= 1 << 0;
+                                       write_log(_T("Retrying: GDI, ERR=%s\n"), err);
+                                       changed_prefs.gfx_api = currprefs.gfx_api = 0;
+                                       update_gfxparams(mon);
+                                       goto retry;
+                               }
                        }
                        if (errv > 0) {
-                               D3D_free(0, true);
                                if (isfullscreen() > 0) {
                                        int idx = mon->screen_is_picasso ? 1 : 0;
                                        changed_prefs.gfx_apmode[idx].gfx_fullscreen = currprefs.gfx_apmode[idx].gfx_fullscreen = GFX_FULLWINDOW;
-                                       goto retry;
-                               } else if (currprefs.gfx_api > 0) {
-                                       changed_prefs.gfx_api = currprefs.gfx_api = 0;
-                                       changed_prefs.gf[ad->gf_index].gfx_filter = currprefs.gf[ad->gf_index].gfx_filter = 1;
+                                       retrymask = 0;
+                                       changed_prefs.gfx_api = currprefs.gfx_api = original_api;
                                        update_gfxparams(mon);
-                                       d3d_select(&currprefs);
-                                       error_log(_T("Direct3D9/11 failed to initialize ('%s'), falling back to GDI."), err);
-                                       errv = 0;
-                                       err = D3D_init(mon->hAmigaWnd, mon->monitor_id, mon->currentmode.native_width, mon->currentmode.native_height,
-                                               &mon->currentmode.freq, fmh, fmv, &errv);
-                                       if (errv) {
-                                               error_log(_T("Failed to initialize any rendering modes."));
-                                       }
+                                       goto retry;
+                               }
+                               if ((retrymask & (1 | 2 | 4)) == (1 | 2 | 4)) { // don't care about D3D11 HDR
+                                       error_log(_T("Failed to initialize any rendering modes."));
                                }
-                               gfxmode_reset(mon->monitor_id);
                                ret = -1;
                                goto oops;
                        }