Flycast and overscan

In some dreamcast games there are black bars that I cannot get rid of, they are not always the same. I tried to look for options regarding overscan but I couldn’t find any, is there a solution to this? In case of N64 with mupen, for example, there are slider to manually adjust the overscan.

You can see for example in:

Super Street Fighter II X -> top and bottom

Street Fighter Alpha 3 -> top and bottom

Street Fighter III - 3rd Strike -> Bottom and Right

images in my post:

This happens in many ported 2D games. The vertical resolution is lower and they fill with black spaces. SSF2X, has a vertical resolution of 224 (x2 = 448) to reach the 480 of the TV, they fill with black.

In 3D cases like n64, it doesn’t matter too much to fill, but in case of 2D pixels, it is complicated to stretch the fixed matrix image. I don’t know if Flycast can stretch the image, but you have some shaders that do overscan, even automatic.

By the way, I like those presets, what’s the name of the shader?

A curiosity, SSF2X on Saturn is 240i, on dreamcast is 480p.

Yeah, I knew that those ports had “different” resolutions but I think I’ve seen that on OG hardware this was not showing and the image was stretched to fill the 4/3 screen, so I thought/think it can be done with the core as well.

The shader is mainly guest’s advance with a pass of SMAA linear before it.

here’s my preset, mind that is done to work with my monitor @1080p I’m not sure how it can look on a 1440p or 4k panel.

shaders = "17"
feedback_pass = "0"
shader0 = "shaders_slang/stock.slang"
filter_linear0 = "false"
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
alias0 = "SMAA_Input"
float_framebuffer0 = "false"
srgb_framebuffer0 = "false"
scale_type_x0 = "source"
scale_x0 = "1.000000"
scale_type_y0 = "source"
scale_y0 = "1.000000"
shader1 = "shaders_slang/anti-aliasing/shaders/smaa/smaa-pass0.slang"
filter_linear1 = "true"
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
alias1 = ""
float_framebuffer1 = "false"
srgb_framebuffer1 = "false"
scale_type_x1 = "source"
scale_x1 = "1.000000"
scale_type_y1 = "source"
scale_y1 = "1.000000"
shader2 = "shaders_slang/anti-aliasing/shaders/smaa/smaa-pass1.slang"
filter_linear2 = "true"
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "false"
alias2 = ""
float_framebuffer2 = "false"
srgb_framebuffer2 = "false"
scale_type_x2 = "source"
scale_x2 = "1.000000"
scale_type_y2 = "source"
scale_y2 = "1.000000"
shader3 = "shaders_slang/anti-aliasing/shaders/smaa/smaa-pass2.slang"
filter_linear3 = "true"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "false"
alias3 = ""
float_framebuffer3 = "false"
srgb_framebuffer3 = "false"
scale_type_x3 = "source"
scale_x3 = "1.000000"
scale_type_y3 = "source"
scale_y3 = "1.000000"
shader4 = "shaders_slang/stock.slang"
filter_linear4 = "true"
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "false"
alias4 = ""
float_framebuffer4 = "false"
srgb_framebuffer4 = "false"
scale_type_x4 = "viewport"
scale_x4 = "1.000000"
scale_type_y4 = "viewport"
scale_y4 = "1.000000"
shader5 = "shaders_slang/crt/shaders/guest/advanced/stock.slang"
filter_linear5 = "false"
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "false"
alias5 = ""
float_framebuffer5 = "false"
srgb_framebuffer5 = "false"
scale_type_x5 = "source"
scale_x5 = "1.000000"
scale_type_y5 = "source"
scale_y5 = "1.000000"
shader6 = "shaders_slang/crt/shaders/guest/advanced/stock.slang"
filter_linear6 = "false"
wrap_mode6 = "clamp_to_border"
mipmap_input6 = "false"
alias6 = "StockPass"
float_framebuffer6 = "false"
srgb_framebuffer6 = "false"
scale_type_x6 = "source"
scale_x6 = "1.000000"
scale_type_y6 = "source"
scale_y6 = "1.000000"
shader7 = "shaders_slang/crt/shaders/guest/advanced/afterglow0.slang"
filter_linear7 = "false"
wrap_mode7 = "clamp_to_border"
mipmap_input7 = "false"
alias7 = "AfterglowPass"
float_framebuffer7 = "false"
srgb_framebuffer7 = "false"
scale_type_x7 = "source"
scale_x7 = "1.000000"
scale_type_y7 = "source"
scale_y7 = "1.000000"
shader8 = "shaders_slang/crt/shaders/guest/advanced/pre-shaders-afterglow.slang"
filter_linear8 = "false"
wrap_mode8 = "clamp_to_border"
mipmap_input8 = "true"
alias8 = "PrePass"
float_framebuffer8 = "false"
srgb_framebuffer8 = "false"
scale_type_x8 = "source"
scale_x8 = "1.000000"
scale_type_y8 = "source"
scale_y8 = "1.000000"
shader9 = "shaders_slang/crt/shaders/guest/advanced/avg-lum.slang"
filter_linear9 = "true"
wrap_mode9 = "clamp_to_border"
mipmap_input9 = "true"
alias9 = "AvgLumPass"
float_framebuffer9 = "false"
srgb_framebuffer9 = "false"
scale_type_x9 = "source"
scale_x9 = "1.000000"
scale_type_y9 = "source"
scale_y9 = "1.000000"
shader10 = "shaders_slang/crt/shaders/guest/advanced/linearize.slang"
filter_linear10 = "true"
wrap_mode10 = "clamp_to_border"
mipmap_input10 = "false"
alias10 = "LinearizePass"
float_framebuffer10 = "true"
srgb_framebuffer10 = "false"
scale_type_x10 = "source"
scale_x10 = "1.000000"
scale_type_y10 = "source"
scale_y10 = "1.000000"
shader11 = "shaders_slang/crt/shaders/guest/advanced/gaussian_horizontal.slang"
filter_linear11 = "true"
wrap_mode11 = "clamp_to_border"
mipmap_input11 = "false"
alias11 = ""
float_framebuffer11 = "true"
srgb_framebuffer11 = "false"
scale_type_x11 = "absolute"
scale_x11 = "800"
scale_type_y11 = "source"
scale_y11 = "1.000000"
shader12 = "shaders_slang/crt/shaders/guest/advanced/gaussian_vertical.slang"
filter_linear12 = "true"
wrap_mode12 = "clamp_to_border"
mipmap_input12 = "false"
alias12 = "GlowPass"
float_framebuffer12 = "true"
srgb_framebuffer12 = "false"
scale_type_x12 = "absolute"
scale_x12 = "800"
scale_type_y12 = "absolute"
scale_y12 = "600"
shader13 = "shaders_slang/crt/shaders/guest/advanced/bloom_horizontal.slang"
filter_linear13 = "true"
wrap_mode13 = "clamp_to_border"
mipmap_input13 = "false"
alias13 = ""
float_framebuffer13 = "true"
srgb_framebuffer13 = "false"
scale_type_x13 = "absolute"
scale_x13 = "800"
scale_type_y13 = "absolute"
scale_y13 = "600"
shader14 = "shaders_slang/crt/shaders/guest/advanced/bloom_vertical.slang"
filter_linear14 = "true"
wrap_mode14 = "clamp_to_border"
mipmap_input14 = "false"
alias14 = "BloomPass"
float_framebuffer14 = "true"
srgb_framebuffer14 = "false"
scale_type_x14 = "source"
scale_x14 = "1.000000"
scale_type_y14 = "source"
scale_y14 = "1.000000"
shader15 = "shaders_slang/crt/shaders/guest/advanced/crt-guest-advanced.slang"
filter_linear15 = "true"
wrap_mode15 = "clamp_to_border"
mipmap_input15 = "false"
alias15 = ""
float_framebuffer15 = "true"
srgb_framebuffer15 = "false"
scale_type_x15 = "viewport"
scale_x15 = "1.000000"
scale_type_y15 = "viewport"
scale_y15 = "1.000000"
shader16 = "shaders_slang/crt/shaders/guest/advanced/deconvergence.slang"
filter_linear16 = "true"
wrap_mode16 = "clamp_to_border"
mipmap_input16 = "false"
alias16 = ""
float_framebuffer16 = "false"
srgb_framebuffer16 = "false"
scale_type_x16 = "viewport"
scale_x16 = "1.000000"
scale_type_y16 = "viewport"
scale_y16 = "1.000000"
SMAA_THRESHOLD = "0.100000"
SMAA_CORNER_ROUNDING = "100.000000"
AS = "0.250000"
sat = "0.450000"
CS = "1.000000"
CP = "1.000000"
WP = "-10.000000"
wp_saturation = "1.250000"
pre_bb = "1.080000"
vigstr = "0.250000"
vigdef = "1.000001"
interm = "4.000000"
m_glow = "1.000000"
m_glow_cutoff = "0.350000"
SIZEH = "7.000000"
SIGMA_H = "1.500000"
SIZEV = "7.000000"
SIGMA_V = "1.500000"
SIZEHB = "6.000000"
SIGMA_HB = "0.950000"
SIZEVB = "6.000000"
SIGMA_VB = "0.900000"
glow = "0.150000"
bloom = "-0.250000"
mask_bloom = "0.250000"
bloom_dist = "0.100000"
gamma_c = "0.900000"
brightboost1 = "1.150000"
scanline1 = "5.000000"
scanline2 = "5.000000"
beam_min = "1.350000"
beam_max = "1.100000"
beam_size = "0.200000"
scans = "0.700000"
scan_falloff = "0.700000"
h_sharp = "3.400000"
smart_ei = "0.300000"
ei_limit = "0.350000"
warpX = "0.040000"
warpY = "0.060000"
csize = "0.050000"
bsize1 = "0.100000"
shadowMask = "6.000000"
maskstr = "0.800000"
mcut = "1.200000"
mask_gamma = "2.600000"
slotmask = "0.750000"
slotmask1 = "0.750000"
slotwidth = "1.000000"
mclip = "0.200000"
smoothmask = "1.000000"
addnoised = "0.360000"
noiseresd = "1.000000"
post_br = "1.060000"
textures = "areaTex;searchTex;SamplerLUT1;SamplerLUT2;SamplerLUT3;SamplerLUT4"
areaTex = "shaders_slang/anti-aliasing/shaders/smaa/AreaTex.png"
areaTex_wrap_mode = "clamp_to_border"
areaTex_mipmap = "false"
searchTex = "shaders_slang/anti-aliasing/shaders/smaa/SearchTex.png"
searchTex_wrap_mode = "clamp_to_border"
searchTex_mipmap = "false"
SamplerLUT1 = "shaders_slang/crt/shaders/guest/advanced/lut/trinitron-lut.png"
SamplerLUT1_wrap_mode = "clamp_to_border"
SamplerLUT1_mipmap = "false"
SamplerLUT2 = "shaders_slang/crt/shaders/guest/advanced/lut/inv-trinitron-lut.png"
SamplerLUT2_wrap_mode = "clamp_to_border"
SamplerLUT2_mipmap = "false"
SamplerLUT3 = "shaders_slang/crt/shaders/guest/advanced/lut/nec-lut.png"
SamplerLUT3_wrap_mode = "clamp_to_border"
SamplerLUT3_mipmap = "false"
SamplerLUT4 = "shaders_slang/crt/shaders/guest/advanced/lut/ntsc-lut.png"
SamplerLUT4_wrap_mode = "clamp_to_border"
SamplerLUT4_mipmap = "false"

What is OG hardware?
Some hardware or emulators can do it, but RetroArch uses the native output, which is used for shader and other things like SwitRes. Guest’s Advance has overscan, this can be a solution.

I’m going to try what you did, I was curious that the mesh is interleaved.

1 Like

Original hardware (actual dreamcast in this case)

Anyway I’m using guest’s advance shader since forever but I didn’t thought about adjusting overscan with it! and it works! unfortunately it cannot solve SFIII because that weird right+bottom overscan, but that’s the only game that it is like that! so problem mostly solved I guess! Still, would be great if flycast could do it on the fly… :innocent:

1 Like

Yes, although it’s a hassle to do it for each game (you can save the changes for each game), you also have guest’s integre scaling. It adjusts automatically and removes some borders,.

@Ranmori was exploring using Mega-Bezel’s automatic scaler in other presets. I don’t know if he managed to get it, but it’s not an easy thing to do.

[/quote]

I still don’t understand the Flycast core, or the design of the Dreamcast. I was able to grasp the law of the Sega Saturn (Beetle Saturn) to some extent, but the Dreamcast often does not work properly with the Flycast core, so I haven’t done a thorough test yet.

By the way, in the case of Sega Saturn, in the case of Yabause or YabaSanshiro or Kronos, these three cores switch native resolution in real time. When entering the game screen via the SEGA logo from the BIOS screen, the resolution changes frequently. Therefore, it can be displayed without discomfort with ordinary shaders including Mega Bezel.

Since Beetle Saturn doesn’t change resolution, Can use Smart Integer Scaling features such as Mega Bezel to fit the screen just right, or even crop it.

I haven’t done any research around here in Flycast core yet. I know there are games that protrude four times the size of the screen, but…

I am aware that some games are displayed at 15360x8640 on a 3840x2160 monitor and only the upper left corner of the screen is displayed…

About the automatic scaler. The X and Y inputs and the X and Y outputs become quite complex when using such a feature, so I gave up and decided to use both Guest Advance or Mega Bezel.

2 Likes