]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Added scanline vertical offset option.
authorToni Wilen <twilen@winuae.net>
Thu, 4 Oct 2018 13:51:03 +0000 (16:51 +0300)
committerToni Wilen <twilen@winuae.net>
Thu, 4 Oct 2018 13:51:03 +0000 (16:51 +0300)
cfgfile.cpp
include/options.h
od-win32/direct3d.cpp
od-win32/direct3d11.cpp
od-win32/resources/winuae.rc
od-win32/win32gfx.cpp
od-win32/win32gui.cpp

index 49d29961ae95f645b6462db85ffb712feb843739..bcdcf5c6d856715206ef0817e579abbdde74233e 100644 (file)
@@ -2126,10 +2126,11 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type)
                cfgfile_dwrite_ext (f, _T("gfx_filter_top_border"), ext, _T("%d"), gf->gfx_filter_top_border);
                cfgfile_dwrite_ext (f, _T("gfx_filter_bottom_border"), ext, _T("%d"), gf->gfx_filter_bottom_border);
                
-               cfgfile_dwrite_ext (f, _T("gfx_filter_scanlines"), ext, _T("%d"), gf->gfx_filter_scanlines);
-               cfgfile_dwrite_ext (f, _T("gfx_filter_scanlinelevel"), ext, _T("%d"), gf->gfx_filter_scanlinelevel);
-               cfgfile_dwrite_ext (f, _T("gfx_filter_scanlineratio"), ext, _T("%d"), gf->gfx_filter_scanlineratio);
-               
+               cfgfile_dwrite_ext(f, _T("gfx_filter_scanlines"), ext, _T("%d"), gf->gfx_filter_scanlines);
+               cfgfile_dwrite_ext(f, _T("gfx_filter_scanlinelevel"), ext, _T("%d"), gf->gfx_filter_scanlinelevel);
+               cfgfile_dwrite_ext(f, _T("gfx_filter_scanlineratio"), ext, _T("%d"), gf->gfx_filter_scanlineratio);
+               cfgfile_dwrite_ext(f, _T("gfx_filter_scanlineoffset"), ext, _T("%d"), gf->gfx_filter_scanlineoffset);
+
                cfgfile_dwrite_ext (f, _T("gfx_filter_luminance"), ext, _T("%d"), gf->gfx_filter_luminance);
                cfgfile_dwrite_ext (f, _T("gfx_filter_contrast"), ext, _T("%d"), gf->gfx_filter_contrast);
                cfgfile_dwrite_ext (f, _T("gfx_filter_saturation"), ext, _T("%d"), gf->gfx_filter_saturation);
@@ -3287,31 +3288,32 @@ static int cfgfile_parse_host (struct uae_prefs *p, TCHAR *option, TCHAR *value)
                        || cfgfile_strval (option, value, _T("gfx_filter_autoscale_limit"), ext, &gf->gfx_filter_integerscalelimit, autoscalelimit, 0))
                        return 1;
 
-               if (cfgfile_floatval (option, value, _T("gfx_filter_vert_zoomf"), ext, &gf->gfx_filter_vert_zoom)
-                       || cfgfile_floatval (option, value, _T("gfx_filter_horiz_zoomf"), ext, &gf->gfx_filter_horiz_zoom)
-                       || cfgfile_floatval (option, value, _T("gfx_filter_vert_zoom_multf"), ext, &gf->gfx_filter_vert_zoom_mult)
-                       || cfgfile_floatval (option, value, _T("gfx_filter_horiz_zoom_multf"), ext, &gf->gfx_filter_horiz_zoom_mult)
-                       || cfgfile_floatval (option, value, _T("gfx_filter_vert_offsetf"), ext, &gf->gfx_filter_vert_offset)
-                       || cfgfile_floatval (option, value, _T("gfx_filter_horiz_offsetf"), ext, &gf->gfx_filter_horiz_offset)
-                       || cfgfile_intval (option, value, _T("gfx_filter_left_border"), ext, &gf->gfx_filter_left_border, 1)
-                       || cfgfile_intval (option, value, _T("gfx_filter_right_border"), ext, &gf->gfx_filter_right_border, 1)
-                       || cfgfile_intval (option, value, _T("gfx_filter_top_border"), ext, &gf->gfx_filter_top_border, 1)
-                       || cfgfile_intval (option, value, _T("gfx_filter_bottom_border"), ext, &gf->gfx_filter_bottom_border, 1)
-                       || cfgfile_intval (option, value, _T("gfx_filter_scanlines"), ext, &gf->gfx_filter_scanlines, 1)
-                       || cfgfile_intval (option, value, _T("gfx_filter_scanlinelevel"), ext, &gf->gfx_filter_scanlinelevel, 1)
-                       || cfgfile_intval (option, value, _T("gfx_filter_scanlineratio"), ext, &gf->gfx_filter_scanlineratio, 1)
-                       || cfgfile_intval (option, value, _T("gfx_filter_luminance"), ext, &gf->gfx_filter_luminance, 1)
-                       || cfgfile_intval (option, value, _T("gfx_filter_contrast"), ext, &gf->gfx_filter_contrast, 1)
-                       || cfgfile_intval (option, value, _T("gfx_filter_saturation"), ext, &gf->gfx_filter_saturation, 1)
-                       || cfgfile_intval (option, value, _T("gfx_filter_gamma"), ext, &gf->gfx_filter_gamma, 1)
-                       || cfgfile_intval (option, value, _T("gfx_filter_gamma_r"), ext, &gf->gfx_filter_gamma_ch[0], 1)
-                       || cfgfile_intval (option, value, _T("gfx_filter_gamma_g"), ext, &gf->gfx_filter_gamma_ch[1], 1)
-                       || cfgfile_intval (option, value, _T("gfx_filter_gamma_b"), ext, &gf->gfx_filter_gamma_ch[2], 1)
-                       || cfgfile_intval (option, value, _T("gfx_filter_blur"), ext, &gf->gfx_filter_blur, 1)
-                       || cfgfile_intval (option, value, _T("gfx_filter_noise"), ext, &gf->gfx_filter_noise, 1)
-                       || cfgfile_intval (option, value, _T("gfx_filter_bilinear"), ext, &gf->gfx_filter_bilinear, 1)
-                       || cfgfile_intval (option, value, _T("gfx_filter_keep_autoscale_aspect"), ext, &gf->gfx_filter_keep_autoscale_aspect, 1)
-                       || cfgfile_string (option, value, _T("gfx_filter_mask"), ext, gf->gfx_filtermask[2 * MAX_FILTERSHADERS], sizeof gf->gfx_filtermask[2 * MAX_FILTERSHADERS] / sizeof (TCHAR)))
+               if (cfgfile_floatval(option, value, _T("gfx_filter_vert_zoomf"), ext, &gf->gfx_filter_vert_zoom)
+                       || cfgfile_floatval(option, value, _T("gfx_filter_horiz_zoomf"), ext, &gf->gfx_filter_horiz_zoom)
+                       || cfgfile_floatval(option, value, _T("gfx_filter_vert_zoom_multf"), ext, &gf->gfx_filter_vert_zoom_mult)
+                       || cfgfile_floatval(option, value, _T("gfx_filter_horiz_zoom_multf"), ext, &gf->gfx_filter_horiz_zoom_mult)
+                       || cfgfile_floatval(option, value, _T("gfx_filter_vert_offsetf"), ext, &gf->gfx_filter_vert_offset)
+                       || cfgfile_floatval(option, value, _T("gfx_filter_horiz_offsetf"), ext, &gf->gfx_filter_horiz_offset)
+                       || cfgfile_intval(option, value, _T("gfx_filter_left_border"), ext, &gf->gfx_filter_left_border, 1)
+                       || cfgfile_intval(option, value, _T("gfx_filter_right_border"), ext, &gf->gfx_filter_right_border, 1)
+                       || cfgfile_intval(option, value, _T("gfx_filter_top_border"), ext, &gf->gfx_filter_top_border, 1)
+                       || cfgfile_intval(option, value, _T("gfx_filter_bottom_border"), ext, &gf->gfx_filter_bottom_border, 1)
+                       || cfgfile_intval(option, value, _T("gfx_filter_scanlines"), ext, &gf->gfx_filter_scanlines, 1)
+                       || cfgfile_intval(option, value, _T("gfx_filter_scanlinelevel"), ext, &gf->gfx_filter_scanlinelevel, 1)
+                       || cfgfile_intval(option, value, _T("gfx_filter_scanlineratio"), ext, &gf->gfx_filter_scanlineratio, 1)
+                       || cfgfile_intval(option, value, _T("gfx_filter_scanlineoffset"), ext, &gf->gfx_filter_scanlineoffset, 1)
+                       || cfgfile_intval(option, value, _T("gfx_filter_luminance"), ext, &gf->gfx_filter_luminance, 1)
+                       || cfgfile_intval(option, value, _T("gfx_filter_contrast"), ext, &gf->gfx_filter_contrast, 1)
+                       || cfgfile_intval(option, value, _T("gfx_filter_saturation"), ext, &gf->gfx_filter_saturation, 1)
+                       || cfgfile_intval(option, value, _T("gfx_filter_gamma"), ext, &gf->gfx_filter_gamma, 1)
+                       || cfgfile_intval(option, value, _T("gfx_filter_gamma_r"), ext, &gf->gfx_filter_gamma_ch[0], 1)
+                       || cfgfile_intval(option, value, _T("gfx_filter_gamma_g"), ext, &gf->gfx_filter_gamma_ch[1], 1)
+                       || cfgfile_intval(option, value, _T("gfx_filter_gamma_b"), ext, &gf->gfx_filter_gamma_ch[2], 1)
+                       || cfgfile_intval(option, value, _T("gfx_filter_blur"), ext, &gf->gfx_filter_blur, 1)
+                       || cfgfile_intval(option, value, _T("gfx_filter_noise"), ext, &gf->gfx_filter_noise, 1)
+                       || cfgfile_intval(option, value, _T("gfx_filter_bilinear"), ext, &gf->gfx_filter_bilinear, 1)
+                       || cfgfile_intval(option, value, _T("gfx_filter_keep_autoscale_aspect"), ext, &gf->gfx_filter_keep_autoscale_aspect, 1)
+                       || cfgfile_string(option, value, _T("gfx_filter_mask"), ext, gf->gfx_filtermask[2 * MAX_FILTERSHADERS], sizeof gf->gfx_filtermask[2 * MAX_FILTERSHADERS] / sizeof (TCHAR)))
                        return 1;
        }
 #endif
@@ -7639,6 +7641,7 @@ void default_prefs (struct uae_prefs *p, bool reset, int type)
                struct gfx_filterdata *f = &p->gf[i];
                f->gfx_filter = 0;
                f->gfx_filter_scanlineratio = (1 << 4) | 1;
+               f->gfx_filter_scanlineoffset = 1;
                for (int j = 0; j <= 2 * MAX_FILTERSHADERS; j++) {
                        f->gfx_filtershader[i][0] = 0;
                        f->gfx_filtermask[i][0] = 0;
index 1e1a78e639197898f7d8bf9a22c6bd3842e112b3..cf280f24057265c5d89fdcf4e710ecfce39efc1d 100644 (file)
@@ -353,6 +353,7 @@ struct gfx_filterdata
        int gfx_filter_scanlines;
        int gfx_filter_scanlineratio;
        int gfx_filter_scanlinelevel;
+       int gfx_filter_scanlineoffset;
        float gfx_filter_horiz_zoom, gfx_filter_vert_zoom;
        float gfx_filter_horiz_zoom_mult, gfx_filter_vert_zoom_mult;
        float gfx_filter_horiz_offset, gfx_filter_vert_offset;
index 229d5dda2d5b76f75d906f05e211ac53cdd19c55..a62a33b6a8f105fceeebf0681609ee35992f44f1 100644 (file)
@@ -195,7 +195,7 @@ struct d3dstruct
 
        struct gfx_filterdata *filterd3d;
        int filterd3didx;
-       int scanline_osl1, scanline_osl2, scanline_osl3;
+       int scanline_osl1, scanline_osl2, scanline_osl3, scanline_osl4;
 
        D3DXHANDLE postSourceTextureHandle;
        D3DXHANDLE postMaskTextureHandle;
@@ -1438,12 +1438,15 @@ static void createscanlines (struct d3dstruct *d3d, int force)
 
        if (d3d->scanline_osl1 == d3d->filterd3d->gfx_filter_scanlines &&
                d3d->scanline_osl3 == d3d->filterd3d->gfx_filter_scanlinelevel &&
-               d3d->scanline_osl2 == d3d->filterd3d->gfx_filter_scanlineratio && !force)
+               d3d->scanline_osl2 == d3d->filterd3d->gfx_filter_scanlineratio &&
+               d3d->scanline_osl4 == d3d->filterd3d->gfx_filter_scanlineoffset &&
+               !force)
                return;
        bpp = d3d->t_depth < 32 ? 2 : 4;
        d3d->scanline_osl1 = d3d->filterd3d->gfx_filter_scanlines;
        d3d->scanline_osl3 = d3d->filterd3d->gfx_filter_scanlinelevel;
        d3d->scanline_osl2 = d3d->filterd3d->gfx_filter_scanlineratio;
+       d3d->scanline_osl4 = d3d->filterd3d->gfx_filter_scanlineoffset;
        sl4 = d3d->filterd3d->gfx_filter_scanlines * 16 / 100;
        sl42 = d3d->filterd3d->gfx_filter_scanlinelevel * 16 / 100;
        if (sl4 > 15)
@@ -1469,13 +1472,15 @@ static void createscanlines (struct d3dstruct *d3d, int force)
                return;
        }
        sld = (uae_u8*)locked.pBits;
-       for (y = 0; y < d3d->required_sl_texture_h; y++)
-               memset (sld + y * locked.Pitch, 0, d3d->required_sl_texture_w * bpp);
-       for (y = 1; y < d3d->required_sl_texture_h; y += l1 + l2) {
+       for (y = 0; y < d3d->required_sl_texture_h; y++) {
+               memset(sld + y * locked.Pitch, 0, d3d->required_sl_texture_w * bpp);
+       }
+       for (y = 0; y < d3d->required_sl_texture_h; y += l1 + l2) {
+               int y2 = y + (d3d->filterd3d->gfx_filter_scanlineoffset % (l1 + 1));
                for (yy = 0; yy < l2 && y + yy < d3d->required_sl_texture_h; yy++) {
                        for (x = 0; x < d3d->required_sl_texture_w; x++) {
                                uae_u8 sll = sl42;
-                               p = &sld[(y + yy) * locked.Pitch + (x * bpp)];
+                               p = &sld[(y + y2) * locked.Pitch + (x * bpp)];
                                if (bpp < 4) {
                                        /* 16-bit, A4R4G4B4 */
                                        p[1] = (sl4 << 4) | (sll << 0);
index f87862d7a7962cff8ac2b87324aadb94292b58b6..5514522da92fb26743b05528b9b1e26a81a565e0 100644 (file)
@@ -295,7 +295,7 @@ struct d3d11struct
 
        struct gfx_filterdata *filterd3d;
        int filterd3didx;
-       int scanline_osl1, scanline_osl2, scanline_osl3;
+       int scanline_osl1, scanline_osl2, scanline_osl3, scanline_osl4;
 
        struct shaderdata11 shaders[MAX_SHADERS];
        ID3DX11EffectTechnique *technique;
@@ -2149,12 +2149,15 @@ static void createscanlines(struct d3d11struct *d3d, int force)
 
        if (d3d->scanline_osl1 == d3d->filterd3d->gfx_filter_scanlines &&
                d3d->scanline_osl3 == d3d->filterd3d->gfx_filter_scanlinelevel &&
-               d3d->scanline_osl2 == d3d->filterd3d->gfx_filter_scanlineratio && !force)
+               d3d->scanline_osl2 == d3d->filterd3d->gfx_filter_scanlineratio &&
+               d3d->scanline_osl4 == d3d->filterd3d->gfx_filter_scanlineoffset &&
+               !force)
                return;
        bpp = 4;
        d3d->scanline_osl1 = d3d->filterd3d->gfx_filter_scanlines;
        d3d->scanline_osl3 = d3d->filterd3d->gfx_filter_scanlinelevel;
        d3d->scanline_osl2 = d3d->filterd3d->gfx_filter_scanlineratio;
+       d3d->scanline_osl4 = d3d->filterd3d->gfx_filter_scanlineoffset;
        sl4 = d3d->filterd3d->gfx_filter_scanlines * 16 / 100;
        sl42 = d3d->filterd3d->gfx_filter_scanlinelevel * 16 / 100;
        if (sl4 > 15)
@@ -2180,13 +2183,15 @@ static void createscanlines(struct d3d11struct *d3d, int force)
                return;
        }
        sld = (uae_u8*)map.pData;
-       for (y = 0; y < d3d->m_screenHeight; y++)
+       for (y = 0; y < d3d->m_screenHeight; y++) {
                memset(sld + y * map.RowPitch, 0, d3d->m_screenWidth * bpp);
-       for (y = 1; y < d3d->m_screenHeight; y += l1 + l2) {
+       }
+       for (y = 0; y < d3d->m_screenHeight; y += l1 + l2) {
+               int y2 = y + (d3d->filterd3d->gfx_filter_scanlineoffset % (l1 + 1));
                for (yy = 0; yy < l2 && y + yy < d3d->m_screenHeight; yy++) {
                        for (x = 0; x < d3d->m_screenWidth; x++) {
                                uae_u8 sll = sl42;
-                               p = &sld[(y + yy) * map.RowPitch + (x * bpp)];
+                               p = &sld[(y2 + yy) * map.RowPitch + (x * bpp)];
                                /* 32-bit, A8R8G8B8 */
                                uae_u8 sll4 = sl4 | (sl4 << 4);
                                uae_u8 sll2 = sll | (sll << 4);
index 88174af08453ef43c0046b075b640b6eab4d2f7c..1a55e996eb81d2bd6a71d7a2e6ccfaf7b2bdbfe6 100644 (file)
@@ -2151,7 +2151,7 @@ END
 STRINGTABLE
 BEGIN
     IDS_FILTER_PAL_EXTRA    "Brightness\nContrast\nSaturation\nGamma\nScanlines\nBlurriness\nNoise\n"
-    IDS_FILTER_3D_EXTRA     "Point/Bilinear\nScanline opacity\nScanline level\n"
+    IDS_FILTER_3D_EXTRA     "Point/Bilinear\nScanline opacity\nScanline level\nScanline offset\n"
     IDS_ALWAYS_ON           "Always on"
     IDS_DISPLAY_ATTRIBUTES  "Brightness\nContrast\nGamma\nGamma [R]\nGamma [G]\nGamma [B]\nDark palette fix"
     IDS_NUMSG_NO_PPC        "PPC CPU was started but PPC CPU emulation core plugin was not found. Download available from http://www.winuae.net/"
index 7c54a1c9ff15057344a0726da9dd43aeab1bcbb9..fdde3e203943bba53c80f37095305f85c5789201 100644 (file)
@@ -2291,7 +2291,8 @@ int check_prefs_changed_gfx (void)
 
                c |= gf->gfx_filter_scanlines != gfc->gfx_filter_scanlines ? (1|8) : 0;
                c |= gf->gfx_filter_scanlinelevel != gfc->gfx_filter_scanlinelevel ? (1|8) : 0;
-               c |= gf->gfx_filter_scanlineratio != gfc->gfx_filter_scanlineratio ? (1|8) : 0;
+               c |= gf->gfx_filter_scanlineratio != gfc->gfx_filter_scanlineratio ? (1 | 8) : 0;
+               c |= gf->gfx_filter_scanlineoffset != gfc->gfx_filter_scanlineoffset ? (1 | 8) : 0;
 
                c |= gf->gfx_filter_horiz_zoom_mult != gfc->gfx_filter_horiz_zoom_mult ? (1) : 0;
                c |= gf->gfx_filter_vert_zoom_mult != gfc->gfx_filter_vert_zoom_mult ? (1) : 0;
index b97ddffaff7313e8ac3c0da4c30065d520b6eb34..070c1ab949865fcc0bbc63c7fe06fd0d43224b64 100644 (file)
@@ -18517,6 +18517,7 @@ static struct filterxtra filter_3d_extra[] =
        _T("Point/Bilinear"), &workprefs.gf[0].gfx_filter_bilinear, &workprefs.gf[1].gfx_filter_bilinear, &currprefs.gf[0].gfx_filter_bilinear, &currprefs.gf[1].gfx_filter_bilinear, 0, 1, 1,
        _T("Scanline opacity"), &workprefs.gf[0].gfx_filter_scanlines, &workprefs.gf[1].gfx_filter_scanlines, &currprefs.gf[0].gfx_filter_scanlines, &currprefs.gf[1].gfx_filter_scanlines, 0, 100, 10,
        _T("Scanline level"), &workprefs.gf[0].gfx_filter_scanlinelevel, &workprefs.gf[1].gfx_filter_scanlinelevel, &currprefs.gf[0].gfx_filter_scanlinelevel, &currprefs.gf[1].gfx_filter_scanlinelevel, 0, 100, 10,
+       _T("Scanline offset"), &workprefs.gf[0].gfx_filter_scanlineoffset, &workprefs.gf[1].gfx_filter_scanlineoffset, &currprefs.gf[0].gfx_filter_scanlineoffset, &currprefs.gf[1].gfx_filter_scanlineoffset, 0, 3, 1,
        NULL
 };
 static int dummy_in, dummy_out;