MiSTer-devel / Main_MiSTer

Main MiSTer binary and Wiki
GNU General Public License v3.0
3.03k stars 329 forks source link

calculated video_mode doesn't match the same preset mode #641

Closed c0d3h4x0r closed 1 year ago

c0d3h4x0r commented 2 years ago

video_mode=12 works on my 4K TV to set 1920x1440@60Hz. The MiSTer stdout shows:

Send HDMI parameters:
video: 1920(1920), 48(48), 32(32), 80(80), 1440(1440), 2(2), 4(4), 38(38), -hsync, -vsync

video_mode=1920,1440,60 does not work on the same TV (never achieves picture sync). The MiSTer stdout shows:

Send HDMI parameters:
video: 1920(1920), 48(48), 32(32), 80(80), 1440(1440), 3(3), 4(4), 34(34), -hsync, -vsync

Note that 38 != 34 and 2 != 3.

Shouldn't these two ways of defining the same video mode yield the same numbers and results?

wickerwaka commented 2 years ago

They aren't guaranteed to be the same. I don't know what the source of the preset mode timing parameters are and it's not something I would want to modify in order to make them match the calculated modes since it could cause issues (like you have demonstrated).

What display do you have? I'm surprised that a display that could support this resolution would be so sensitive to this.

c0d3h4x0r commented 2 years ago

It defies all expectations and logic that these two ways of defining the same thing would not actually yield the same thing. So if that's "by design", then it's "by bad design".

My display is a VIZIO P65QX-H1 4K LCD TV.

wickerwaka commented 2 years ago

The preset video mode timings are hand crafted and aren't following any one particular timing formula. Changing the presets to exactly match CVT timings could have been a breaking change for some users, it certainly would have been for you. So while it may be bad design from a pure engineering perspective, it is the right choice to make for existing users.

If you could capture EDID data for your monitor it might help identifying why it is having problems.

c0d3h4x0r commented 2 years ago

Is the EDID data dumped to stdout? If so, I can grab it later and post it here.

wickerwaka commented 2 years ago

Yes, but you need to comment out the video_mode in your ini so it goes through the video mode detection path. That will fetch the edid data and print the hex to stdout.

Are you directly connected to the TV or going through a receiver/switch?

c0d3h4x0r commented 2 years ago

I am connected through multiple daisy-chained HDMI switches and an ONKYO TX-NR6100 AVR. It is not possible to directly connect to the TV given the complexity of my system. It's also worth noting that no other HDMI sources that pass through the same series of switches and AVR exhibit any problems correctly detecting the TV's capabilities and producing a video signal the TV is happy with, so the AVR is not a problem.

c0d3h4x0r commented 2 years ago

Here's the complete output of MiSTer while launching it with my HDMI switches, AVR, and TV all hooked up and powered on per usual:

root@MiSTer:/media/fat>MiSTer

Minimig by Dennis van Weeren
ARM Controller by Jakub Bednarski
MiSTer code by Sorgelig

Version 220529

Looking for root device...
Using SD card as a root device
Identified 8BIT core*** Found SDRAM config: 3
Core name is "MENU"
** altcfg: no cfg
INI_PARSER : Start INI parser for core "MENU"(MENU), video mode "0x0@0.0".
INI_PARSER : Opened file MiSTer.ini with size 11580 bytes.
INI_PARSER : line(0): "[MiSTer]".
INI_PARSER : Got SECTION 'MiSTer'
INI_PARSER : line(1): "key_menu_as_rgui=0".
INI_PARSER : Got VAR 'key_menu_as_rgui' with VALUE 0
INI_PARSER : line(1): "forced_scandoubler=0".
INI_PARSER : Got VAR 'forced_scandoubler' with VALUE 0
INI_PARSER : line(1): "ypbpr=0".
INI_PARSER : Got VAR 'ypbpr' with VALUE 0
INI_PARSER : line(1): "composite_sync=0".
INI_PARSER : Got VAR 'composite_sync' with VALUE 0
INI_PARSER : line(1): "vga_scaler=0".
INI_PARSER : Got VAR 'vga_scaler' with VALUE 0
INI_PARSER : line(1): "hdmi_audio_96k=0".
INI_PARSER : Got VAR 'hdmi_audio_96k' with VALUE 0
INI_PARSER : line(1): "keyrah_mode=0x18d80002".
INI_PARSER : Got VAR 'keyrah_mode' with VALUE 0x18d80002
INI_PARSER : line(1): "vscale_mode=4".
INI_PARSER : Got VAR 'vscale_mode' with VALUE 4
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "vscale_border=0".
INI_PARSER : Got VAR 'vscale_border' with VALUE 0
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "rbf_hide_datecode=0".
INI_PARSER : Got VAR 'rbf_hide_datecode' with VALUE 0
INI_PARSER : line(1): "menu_pal=0".
INI_PARSER : Got VAR 'menu_pal' with VALUE 0
INI_PARSER : line(1): "hdmi_limited=0".
INI_PARSER : Got VAR 'hdmi_limited' with VALUE 0
INI_PARSER : line(1): "".
INI_PARSER : line(1): "direct_video=0".
INI_PARSER : Got VAR 'direct_video' with VALUE 0
INI_PARSER : line(1): "fb_size=2".
INI_PARSER : Got VAR 'fb_size' with VALUE 2
INI_PARSER : line(1): "fb_terminal=1".
INI_PARSER : Got VAR 'fb_terminal' with VALUE 1
INI_PARSER : line(1): "osd_timeout=30".
INI_PARSER : Got VAR 'osd_timeout' with VALUE 30
INI_PARSER : line(1): "".
INI_PARSER : line(1): "osd_rotate=0".
INI_PARSER : Got VAR 'osd_rotate' with VALUE 0
INI_PARSER : line(1): "vga_sog=0".
INI_PARSER : Got VAR 'vga_sog' with VALUE 0
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "recents=0".
INI_PARSER : Got VAR 'recents' with VALUE 0
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "font=font/myfont.pf".
INI_PARSER : Got VAR 'font' with VALUE font/myfont.pf
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "reset_combo=2".
INI_PARSER : Got VAR 'reset_combo' with VALUE 2
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "video_info=0".
INI_PARSER : Got VAR 'video_info' with VALUE 0
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "vsync_adjust=0".
INI_PARSER : Got VAR 'vsync_adjust' with VALUE 0
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "refresh_min=0".
INI_PARSER : Got VAR 'refresh_min' with VALUE 0
INI_PARSER : line(1): "refresh_max=0".
INI_PARSER : Got VAR 'refresh_max' with VALUE 0
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "controller_info=5".
INI_PARSER : Got VAR 'controller_info' with VALUE 5
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "jamma_vid=0x04D8".
INI_PARSER : Got VAR 'jamma_vid' with VALUE 0x04D8
INI_PARSER : line(1): "jamma_pid=0xF3AD".
INI_PARSER : Got VAR 'jamma_pid' with VALUE 0xF3AD
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "sniper_mode=0".
INI_PARSER : Got VAR 'sniper_mode' with VALUE 0
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "browse_expand=0".
INI_PARSER : Got VAR 'browse_expand' with VALUE 0
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "logo=0".
INI_PARSER : Got VAR 'logo' with VALUE 0
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "shared_folder=".
INI_PARSER : Got VAR 'shared_folder' with VALUE
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "afilter_default=Arcade LPF/Arcade LPF 4khz 1st.txt".
INI_PARSER : Got VAR 'afilter_default' with VALUE Arcade LPF/Arcade LPF 4khz 1st.txt
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "gamepad_defaults=0".
INI_PARSER : Got VAR 'gamepad_defaults' with VALUE 0
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "log_file_entry=0".
INI_PARSER : Got VAR 'log_file_entry' with VALUE 0
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "bt_auto_disconnect=5".
INI_PARSER : Got VAR 'bt_auto_disconnect' with VALUE 5
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "bt_reset_before_pair=1".
INI_PARSER : Got VAR 'bt_reset_before_pair' with VALUE 1
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "".
INI_PARSER : line(1): "hdmi_game_mode=1".
INI_PARSER : Got VAR 'hdmi_game_mode' with VALUE 1
INI_PARSER : line(1): "".
INI_PARSER : line(1): "[Minimig]".
INI_PARSER : line(0): "menu_pal=1".
INI_PARSER : line(0): "".
INI_PARSER : line(0): "[PSX]".
INI_PARSER : line(0): "vscale_mode=1".
INI_PARSER : line(0): "".
get cfgstring 0 = MENU
get cfgstring 1 = UART31250,MIDI
Got UART speeds: 31250 0 0 0 0 0 0 0 0 0
Got MIDI speeds: 31250 0 0 0 0 0 0 0 0 0
get cfgstring 2 = V,v220413
get cfgstring 3 = NULL

// Status Bit Map:
//              Upper                          Lower
// 0         1         2         3          4         5         6
// 01234567890123456789012345678901 23456789012345678901234567890123
// 0123456789ABCDEFGHIJKLMNOPQRSTUV 0123456789ABCDEFGHIJKLMNOPQRSTUV
// X

Opened /dev/i2c-1 for device 0x39
Opened /dev/i2c-1 for device 0x3F
EDID:
0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
0080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
00a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
00b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
00c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
00d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
00e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
00f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
Invalid EDID: incorrect header.
Error parsing video_mode parameter:
Calculate PLL for 74.2500 MHz:
Fvco=445.500000, C=6, M=8, K=0.910000(3908420239) -> Fpix=74.250000
Error parsing video_mode parameter:
Calculate PLL for 74.2500 MHz:
Fvco=445.500000, C=6, M=8, K=0.910000(3908420239) -> Fpix=74.250000
Error parsing video_mode parameter:
Calculate PLL for 74.2500 MHz:
Fvco=445.500000, C=6, M=8, K=0.910000(3908420239) -> Fpix=74.250000
FileOpenEx(open) File:/media/fat/config/MENU_gamma.cfg, error: No such file or directory.
FileOpenEx(open) File:/media/fat/config/MENU_scaler.cfg, error: No such file or directory.
Filter '', phases: 0 adaptive: false
Filter '', phases: 0 adaptive: false
Filter '', phases: 0 adaptive: false
video_set_filter: flt_flags=7
Filter '', phases: 0 adaptive: false
Send HDMI parameters:
video: 1280(1280), 110(110), 40(40), 220(220), 720(720), 5(5), 5(5), 20(20), -hsync, -vsync

PLL: 0x4, 0x404, 0x3, 0x10000, 0x5, 0x303, 0x9, 0x2, 0x8, 0x7, 0x7, 0xE8F5C28F, Fpix=74.250000
Opened /dev/i2c-1 for device 0x39
FileOpenEx(open) File:/media/fat/config/MENU_shmask.cfg, error: No such file or directory.
FileOpenEx(open) File:/media/fat/font/myfont.pf, error: No such file or directory.
FileOpenEx(open) File:/media/fat/config/MENU_afilter.cfg, error: No such file or directory.

Loading audio filter: filters_audio/Arcade LPF/Arcade LPF 4khz 1st.txt
version: v1
got 1 values: 7056000
got 1 values: 1.54803e-06
  -> converted to: 851040
got 1 values: 3
got 1 values: 3
got 1 values: 1
got 1 values: -2.97126
  -> converted to: -6231182
got 1 values: 2.94292
  -> converted to: 6171753
got 1 values: -0.971661
  -> converted to: -2037720
sending keymap: 0
Loading config MENU.CFG
Found config:
0000: 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
Logo = 0x569850
** altcfg: no cfg
FileOpenEx(open) File:/media/fat/config/uartmode.MENU, error: No such file or directory.
FileOpenEx(open) File:/media/fat/config/uartspeed.MENU, error: No such file or directory.
UART bauds: 31250/31250/31250
ttyS1: 31250
ttyS1: 31250
Open up to 30 input devices.
make_unique(289B,0057,-1)
make_unique(0E8F,3013,1)
make_unique(16C0,05E1,1)
make_unique(045E,02A1,1)
make_unique(8282,3201,1)
make_unique(1209,FACA,1)
opened 0( 0): /dev/input/event1 (045e:028e) 0 "usb-ffb40000.usb-1.6/input0" "Microsoft X-Box 360 pad"
opened 1( 1): /dev/input/event0 (045e:028e) 0 "usb-ffb40000.usb-1.5/input0" "Microsoft X-Box 360 pad"
pFileExt = (null)
Start to scan dir: /media/fat/
Position on item:
Got 6 dir entries
*** Got SDRAM module type: 7
INFO: Video resolution: 529 x 240, fHorz = 15.7KHz, fVert = 59.8Hz, fPix = 10.00MHz
INFO: Frame time (100MHz counter): VGA = 1671559, HDMI = 1666665
INFO: AR = 0:0, fb_en = 0, fb_width = 0, fb_height = 0

Note that it fails to detect the capabilities of my display and chooses an inferior 1280x720 resolution mode.

c0d3h4x0r commented 2 years ago

The preset video mode timings are hand crafted and aren't following any one particular timing formula.

Why?

Changing the presets to exactly match CVT timings could have been a breaking change for some users

I'm not suggesting the presets should be changed. I'm suggesting the custom mode calculations should be corrected/adjusted.

wickerwaka commented 2 years ago

I'm not suggesting the presets should be changed. I'm suggesting the custom mode calculations should be corrected/adjusted.

The custom mode calculations are correct and there is no programmatic adjustment that could be made to make it match all of the preset modes. If you use a modeline generator like the cvt command line tool you will get the same timing that MiSTer is using for the calculated mode.

Why does a non-standard work when a standard one doesn't? I don't know, there difference in the signal timing is so small I'm surprised it matters. One thing to try is adding a +hsync flag to the video_mode and see if that behaves better.