From 2e95de187a1d7f36181358c7d8227219eb58589d Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sun, 23 Apr 2023 19:16:50 +0300 Subject: [PATCH] Size/coordinate change detection is now identical in all 3 render backends. --- od-win32/direct3d.cpp | 9 +++++++-- od-win32/direct3d11.cpp | 11 +++++------ od-win32/gdirender.cpp | 15 ++++++++------- od-win32/win32gfx.cpp | 1 + 4 files changed, 21 insertions(+), 15 deletions(-) diff --git a/od-win32/direct3d.cpp b/od-win32/direct3d.cpp index a36b1ea2..c9ae0569 100644 --- a/od-win32/direct3d.cpp +++ b/od-win32/direct3d.cpp @@ -211,6 +211,7 @@ struct d3dstruct float xmult, ymult; bool cursor_v, cursor_scale; int statusbar_vx, statusbar_hx; + RECT sr2, dr2, zr2; struct gfx_filterdata *filterd3d; int filterd3didx; @@ -2096,8 +2097,6 @@ static void setupscenecoords(struct d3dstruct *d3d, bool normalrender, int monid if (!normalrender) return; - //write_log (_T("%dx%d %dx%d %dx%d\n"), tin_w, tin_h, tin_w, tin_h, window_w, window_h); - getfilterrect2 (monid, &dr, &sr, &zr, d3d->window_w, d3d->window_h, d3d->tin_w / d3d->dmult, d3d->tin_h / d3d->dmult, d3d->dmult, &d3d->dmode, d3d->tin_w, d3d->tin_h); if (memcmp (&sr, &sr2[monid], sizeof RECT) || memcmp (&dr, &dr2[monid], sizeof RECT) || memcmp (&zr, &zr2[monid], sizeof RECT)) { @@ -2110,6 +2109,10 @@ static void setupscenecoords(struct d3dstruct *d3d, bool normalrender, int monid zr2[monid] = zr; } + d3d->sr2 = sr; + d3d->dr2 = dr; + d3d->zr2 = zr; + dw = (float)dr.right - dr.left; dh = (float)dr.bottom - dr.top; w = (float)sr.right - sr.left; @@ -3100,6 +3103,8 @@ static bool xD3D_alloctexture (int monid, int w, int h) if (d3d->fakemode) return false; + setupscenecoords(d3d, true, monid); + changed_prefs.leds_on_screen |= STATUSLINE_TARGET; currprefs.leds_on_screen |= STATUSLINE_TARGET; diff --git a/od-win32/direct3d11.cpp b/od-win32/direct3d11.cpp index 7bd291d1..1f1643c8 100644 --- a/od-win32/direct3d11.cpp +++ b/od-win32/direct3d11.cpp @@ -1544,16 +1544,14 @@ static bool UpdateBuffers(struct d3d11struct *d3d, int monid) static void setupscenecoords(struct d3d11struct *d3d, bool normalrender, int monid) { RECT sr, dr, zr; + static RECT sr2[MAX_AMIGAMONITORS], dr2[MAX_AMIGAMONITORS], zr2[MAX_AMIGAMONITORS]; if (!normalrender) return; getfilterrect2(d3d->num, &dr, &sr, &zr, d3d->m_screenWidth, d3d->m_screenHeight, d3d->m_bitmapWidth / d3d->dmult, d3d->m_bitmapHeight / d3d->dmult, d3d->dmult, &d3d->dmode, d3d->m_bitmapWidth, d3d->m_bitmapHeight); - if (!memcmp(&sr, &d3d->sr2, sizeof RECT) && !memcmp(&dr, &d3d->dr2, sizeof RECT) && !memcmp(&zr, &d3d->zr2, sizeof RECT)) { - return; - } - if (1) { + if (memcmp(&sr, &sr2[monid], sizeof RECT) || memcmp(&dr, &dr2[monid], sizeof RECT) || memcmp(&zr, &zr2[monid], sizeof RECT)) { write_log(_T("POS (%d %d %d %d) - (%d %d %d %d)[%d,%d] (%d %d) S=%d*%d B=%d*%d\n"), dr.left, dr.top, dr.right, dr.bottom, sr.left, sr.top, sr.right, sr.bottom, @@ -1561,6 +1559,9 @@ static void setupscenecoords(struct d3d11struct *d3d, bool normalrender, int mon zr.left, zr.top, d3d->m_screenWidth, d3d->m_screenHeight, d3d->m_bitmapWidth, d3d->m_bitmapHeight); + sr2[monid] = sr; + dr2[monid] = dr; + zr2[monid] = zr; } d3d->sr2 = sr; @@ -1596,8 +1597,6 @@ static void setupscenecoords(struct d3d11struct *d3d, bool normalrender, int mon d3d->cursor_offset_x = -zr.left; d3d->cursor_offset_y = -zr.top; - write_log(_T("%d %d %.f %.f\n"), d3d->xoffset, d3d->yoffset, d3d->xmult, d3d->ymult); - UpdateBuffers(d3d, monid); xD3DXMatrixOrthoOffCenterLH(&d3d->m_matProj_out, 0, w + 0.05f, 0, h + 0.05f, 0.0f, 1.0f); diff --git a/od-win32/gdirender.cpp b/od-win32/gdirender.cpp index 650013e5..f1313673 100644 --- a/od-win32/gdirender.cpp +++ b/od-win32/gdirender.cpp @@ -80,16 +80,14 @@ static void gdi_restore(int monid, bool checkonly) struct gdistruct *gdi = &gdidata[monid]; } -static void setupscenecoords(struct gdistruct *gdi) +static void setupscenecoords(struct gdistruct *gdi, int monid) { RECT sr, dr, zr; + static RECT sr2[MAX_AMIGAMONITORS], dr2[MAX_AMIGAMONITORS], zr2[MAX_AMIGAMONITORS]; getfilterrect2(gdi->num, &dr, &sr, &zr, gdi->wwidth, gdi->wheight, gdi->bm.width / gdi->dmult, gdi->bm.height / gdi->dmult, gdi->dmult, &gdi->dmode, gdi->bm.width, gdi->bm.height); - if (!memcmp(&sr, &gdi->sr2, sizeof RECT) && !memcmp(&dr, &gdi->dr2, sizeof RECT) && !memcmp(&zr, &gdi->zr2, sizeof RECT)) { - return; - } - if (1) { + if (memcmp(&sr, &sr2[monid], sizeof RECT) || memcmp(&dr, &dr2[monid], sizeof RECT) || memcmp(&zr, &zr2[monid], sizeof RECT)) { write_log(_T("POS (%d %d %d %d) - (%d %d %d %d)[%d,%d] (%d %d) S=%d*%d B=%d*%d\n"), dr.left, dr.top, dr.right, dr.bottom, sr.left, sr.top, sr.right, sr.bottom, @@ -97,6 +95,9 @@ static void setupscenecoords(struct gdistruct *gdi) zr.left, zr.top, gdi->wwidth, gdi->wheight, gdi->bm.width, gdi->bm.height); + sr2[monid] = sr; + dr2[monid] = dr; + zr2[monid] = zr; } gdi->sr2 = sr; @@ -242,7 +243,7 @@ static bool gdi_alloctexture(int monid, int w, int h) SetDCBrushColor(gdi->hdc, RGB(0, 0, 0)); if (allocsprite(gdi, &gdi->bm, w, h)) { gdi->dmult = S2X_getmult(monid); - setupscenecoords(gdi); + setupscenecoords(gdi, monid); return true; } } @@ -326,7 +327,7 @@ static bool gdi_renderframe(int monid, int mode, bool immediate) { struct gdistruct *gdi = &gdidata[monid]; - setupscenecoords(gdi); + setupscenecoords(gdi, monid); return gdi->bm.hbm != NULL; } diff --git a/od-win32/win32gfx.cpp b/od-win32/win32gfx.cpp index efa4e72a..317f95b5 100644 --- a/od-win32/win32gfx.cpp +++ b/od-win32/win32gfx.cpp @@ -3051,6 +3051,7 @@ void gfx_set_picasso_modeinfo(int monid, RGBFTYPE rgbfmt) #ifdef RETROPLATFORM rp_set_hwnd(mon->hAmigaWnd); #endif + target_graphics_buffer_update(monid); } #endif -- 2.47.3