flyinghead / flycast

Flycast is a multiplatform Sega Dreamcast, Naomi, Naomi 2 and Atomiswave emulator
GNU General Public License v2.0
1.38k stars 168 forks source link

[RPi3] Visual artifacts with GLES2/VC GPU (Libretro core) #559

Open cmitu opened 2 years ago

cmitu commented 2 years ago

Platform / OS / Hardware

Description of the issue

Using the Libretro core produces some wrong colors and missing textures (?) in a few games, regardless of the video options used (tried to disable Mipmapping, Fog, Anisotropic filtering, any enhancements turned off). Games tested - SF3 3rd Strike, Capcom vs. SNK: Millennium Fight 2000.

Debugging Steps Tested

Tried toggling any of the video and perf. options, but it doesn't seem to have any effect. Standalone Flycast works without an issue though so it doesn't seem GPU/driver related. The old libretro core from libretro/flycast also doesn't exhibit this problem.

Logs Gathered Verbose log from running the libretro core:

Retroarch log ```` Executing: /opt/retropie/emulators/retroarch/bin/retroarch -L /opt/retropie/libretrocores/lr-flycast/flycast_libretro.so "A" [INFO] RetroPad, Port 1, Button "Y (left)" => "X" [INFO] RetroPad, Port 1, Button "Start" => "Start" [INFO] RetroPad, Port 1, Button "D-Pad Up" => "D-Pad Up" [INFO] RetroPad, Port 1, Button "D-Pad Down" => "D-Pad Down" [INFO] RetroPad, Port 1, Button "D-Pad Left" => "D-Pad Left" [INFO] RetroPad, Port 1, Button "D-Pad Right" => "D-Pad Right" [INFO] RetroPad, Port 1, Button "A (right)" => "B" [INFO] RetroPad, Port 1, Button "X (up)" => "Y" [INFO] RetroPad, Port 1, Button "L2" => "L Trigger" [INFO] RetroPad, Port 1, Button "R2" => "R Trigger" [INFO] RetroPad, Port 2, Button "B (bottom)" => "A" [INFO] RetroPad, Port 2, Button "Y (left)" => "X" [INFO] RetroPad, Port 2, Button "Start" => "Start" [INFO] RetroPad, Port 2, Button "D-Pad Up" => "D-Pad Up" [INFO] RetroPad, Port 2, Button "D-Pad Down" => "D-Pad Down" [INFO] RetroPad, Port 2, Button "D-Pad Left" => "D-Pad Left" [INFO] RetroPad, Port 2, Button "D-Pad Right" => "D-Pad Right" [INFO] RetroPad, Port 2, Button "A (right)" => "B" [INFO] RetroPad, Port 2, Button "X (up)" => "Y" [INFO] RetroPad, Port 2, Button "L2" => "L Trigger" [INFO] RetroPad, Port 2, Button "R2" => "R Trigger" [INFO] RetroPad, Port 3, Button "B (bottom)" => "A" [INFO] RetroPad, Port 3, Button "Y (left)" => "X" [INFO] RetroPad, Port 3, Button "Start" => "Start" [INFO] RetroPad, Port 3, Button "D-Pad Up" => "D-Pad Up" [INFO] RetroPad, Port 3, Button "D-Pad Down" => "D-Pad Down" [INFO] RetroPad, Port 3, Button "D-Pad Left" => "D-Pad Left" [INFO] RetroPad, Port 3, Button "D-Pad Right" => "D-Pad Right" [INFO] RetroPad, Port 3, Button "A (right)" => "B" [INFO] RetroPad, Port 3, Button "X (up)" => "Y" [INFO] RetroPad, Port 3, Button "L2" => "L Trigger" [INFO] RetroPad, Port 3, Button "R2" => "R Trigger" [INFO] RetroPad, Port 4, Button "B (bottom)" => "A" [INFO] RetroPad, Port 4, Button "Y (left)" => "X" [INFO] RetroPad, Port 4, Button "Start" => "Start" [INFO] RetroPad, Port 4, Button "D-Pad Up" => "D-Pad Up" [INFO] RetroPad, Port 4, Button "D-Pad Down" => "D-Pad Down" [INFO] RetroPad, Port 4, Button "D-Pad Left" => "D-Pad Left" [INFO] RetroPad, Port 4, Button "D-Pad Right" => "D-Pad Right" [INFO] RetroPad, Port 4, Button "A (right)" => "B" [INFO] RetroPad, Port 4, Button "X (up)" => "Y" [INFO] RetroPad, Port 4, Button "L2" => "L Trigger" [INFO] RetroPad, Port 4, Button "R2" => "R Trigger" [INFO] [Environ]: GET_VARIABLE: reicast_threaded_rendering = "enabled" [INFO] [Environ]: GET_VARIABLE: reicast_texupscale = "1" [INFO] [Environ]: GET_VARIABLE: reicast_region = "Default" [INFO] [Environ]: GET_VARIABLE: reicast_broadcast = "NTSC" [INFO] [Environ]: GET_VARIABLE: reicast_language = "Default" [INFO] [Environ]: GET_VARIABLE: reicast_force_wince = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_enable_dsp = "disabled" [INFO] [Environ]: GET_VARIABLE: pvr.rend = "N/A" [INFO] [Environ]: GET_VARIABLE: reicast_mipmapping = "enabled" [INFO] [Environ]: GET_VARIABLE: reicast_widescreen_hack = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_enable_rttb = "enabled" [INFO] [Environ]: GET_VARIABLE: reicast_volume_modifier_enable = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_texupscale = "1" [INFO] [Environ]: GET_VARIABLE: reicast_texupscale_max_filtered_texture_size = "256" [INFO] [Environ]: GET_VARIABLE: reicast_custom_textures = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_dump_textures = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_fog = "disabled" [INFO] [Environ]: GET_VARIABLE: rend.PerStripSorting = "N/A" [INFO] [Environ]: GET_VARIABLE: reicast_delay_frame_swapping = "enabled" [INFO] [Environ]: GET_VARIABLE: reicast_widescreen_cheats = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_frame_skipping = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_auto_skip_frame = "some" [INFO] [Environ]: GET_VARIABLE: reicast_threaded_rendering = "enabled" [INFO] [Environ]: GET_VARIABLE: reicast_anisotropic_filtering = "off" [INFO] [Environ]: GET_VARIABLE: reicast_pvr2_filtering = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_hle_bios = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_gdrom_fast_loading = "enabled" [INFO] [Environ]: GET_VARIABLE: reicast_per_content_vmus = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_screen_rotation = "horizontal" [INFO] [Environ]: GET_VARIABLE: reicast_internal_resolution = "640x480" [INFO] [Environ]: GET_VARIABLE: reicast_boot_to_bios = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_alpha_sorting = "per-strip (fast, least accurate)" [INFO] [Environ]: GET_VARIABLE: reicast_enable_purupuru = "enabled" [INFO] [Environ]: GET_VARIABLE: reicast_analog_stick_deadzone = "15%" [INFO] [Environ]: GET_VARIABLE: reicast_trigger_deadzone = "0%" [INFO] [Environ]: GET_VARIABLE: reicast_digital_triggers = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_allow_service_buttons = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_lightgun1_crosshair = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_vmu1_screen_display = "enabled" [INFO] [Environ]: GET_VARIABLE: reicast_vmu1_screen_position = "Upper Left" [INFO] [Environ]: GET_VARIABLE: reicast_vmu1_screen_size_mult = "1x" [INFO] [Environ]: GET_VARIABLE: reicast_vmu1_screen_opacity = "100%" [INFO] [Environ]: GET_VARIABLE: reicast_vmu1_pixel_on_color = "DEFAULT_ON 00" [INFO] [Environ]: GET_VARIABLE: reicast_vmu1_pixel_off_color = "DEFAULT_OFF 01" [INFO] [Environ]: GET_VARIABLE: reicast_lightgun2_crosshair = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_vmu2_screen_display = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_vmu2_screen_position = "Upper Left" [INFO] [Environ]: GET_VARIABLE: reicast_vmu2_screen_size_mult = "1x" [INFO] [Environ]: GET_VARIABLE: reicast_vmu2_screen_opacity = "100%" [INFO] [Environ]: GET_VARIABLE: reicast_vmu2_pixel_on_color = "DEFAULT_ON 00" [INFO] [Environ]: GET_VARIABLE: reicast_vmu2_pixel_off_color = "DEFAULT_OFF 01" [INFO] [Environ]: GET_VARIABLE: reicast_lightgun3_crosshair = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_vmu3_screen_display = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_vmu3_screen_position = "Upper Left" [INFO] [Environ]: GET_VARIABLE: reicast_vmu3_screen_size_mult = "1x" [INFO] [Environ]: GET_VARIABLE: reicast_vmu3_screen_opacity = "100%" [INFO] [Environ]: GET_VARIABLE: reicast_vmu3_pixel_on_color = "DEFAULT_ON 00" [INFO] [Environ]: GET_VARIABLE: reicast_vmu3_pixel_off_color = "DEFAULT_OFF 01" [INFO] [Environ]: GET_VARIABLE: reicast_lightgun4_crosshair = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_vmu4_screen_display = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_vmu4_screen_position = "Upper Left" [INFO] [Environ]: GET_VARIABLE: reicast_vmu4_screen_size_mult = "1x" [INFO] [Environ]: GET_VARIABLE: reicast_vmu4_screen_opacity = "100%" [INFO] [Environ]: GET_VARIABLE: reicast_vmu4_pixel_on_color = "DEFAULT_ON 00" [INFO] [Environ]: GET_VARIABLE: reicast_vmu4_pixel_off_color = "DEFAULT_OFF 01" [INFO] [Environ]: GET_VARIABLE: reicast_threaded_rendering = "enabled" [INFO] [Environ]: GET_VARIABLE: reicast_texupscale = "1" [INFO] [Core]: Content ran for a total of: 00 hours, 00 minutes, 51 seconds. [INFO] [Core]: Unloading game.. [INFO] [Environ]: GET_VARIABLE: reicast_region = "Default" [INFO] [Environ]: GET_VARIABLE: reicast_broadcast = "NTSC" [INFO] [Environ]: GET_VARIABLE: reicast_language = "Default" [INFO] [Environ]: GET_VARIABLE: reicast_force_wince = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_enable_dsp = "disabled" [INFO] [Environ]: GET_VARIABLE: pvr.rend = "N/A" [INFO] [Environ]: GET_VARIABLE: reicast_mipmapping = "enabled" [INFO] [Environ]: GET_VARIABLE: reicast_widescreen_hack = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_enable_rttb = "enabled" [INFO] [Environ]: GET_VARIABLE: reicast_volume_modifier_enable = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_texupscale = "1" [INFO] [Environ]: GET_VARIABLE: reicast_texupscale_max_filtered_texture_size = "256" [INFO] [Environ]: GET_VARIABLE: reicast_custom_textures = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_dump_textures = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_fog = "disabled" [INFO] [Environ]: GET_VARIABLE: rend.PerStripSorting = "N/A" [INFO] [Environ]: GET_VARIABLE: reicast_delay_frame_swapping = "enabled" [INFO] [Environ]: GET_VARIABLE: reicast_widescreen_cheats = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_frame_skipping = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_auto_skip_frame = "some" [INFO] [Environ]: GET_VARIABLE: reicast_threaded_rendering = "enabled" [INFO] [Environ]: GET_VARIABLE: reicast_anisotropic_filtering = "off" [INFO] [Environ]: GET_VARIABLE: reicast_pvr2_filtering = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_hle_bios = "disabled" [INFO] [Environ]: GET_VARIABLE: reicast_gdrom_fast_loading = "enabled" [INFO] [Core]: Unloading core.. [INFO] [Core]: Unloading core symbols.. [INFO] [Core]: Saved core options file to "/opt/retropie/configs/all/retroarch-core-options.cfg". ````

Screenshots

SF3 intro SF3 fight
Street Fighter 3 3rd Strike-220306-162849 Street Fighter 3 3rd Strike-220306-163042
flyinghead commented 2 years ago

This looks like an issue with palettes handled on the gpu side. No idea why standalone would act differently from the LR core but it's not the first time it happens.

Enabling Dump Textures should fix the problem and confirm it's indeed the case.

cmitu commented 2 years ago

Yes, with rend.DumpTextures = yes the artifacts are not longer present, thank you.

Re-tested using the standalone version (latest commit) and indeed the issue is present there also - I may have been erroneously testing with the older Libretro core. I'll see if I can narrow this down, otherwise will test with the MESA GLES driver (which is the default on the latest RaspiOS) and see if it has the same issue.

flyinghead commented 2 years ago

So it confirms that this is the infamous palette issue. This is the corresponding GLSL code (in rend/gles/gles.cpp):

highp int color_idx = int(floor(texture(tex, coords.xy).FOG_CHANNEL * 255.0 + 0.5)) + palette_index;
highp vec2 c = vec2((mod(float(color_idx), 32.0) * 2.0 + 1.0) / 64.0, (float(color_idx / 32) * 2.0 + 1.0) / 64.0);
return texture(palette, c);

Everything is using high precision, except palette_index.

cmitu commented 2 years ago

Thanks for the pointer. Looks similar to https://github.com/flyinghead/flycast/issues/117 indeed.

I tried declaring palette_index as highp and, going further, changing the return type of palettePixel to highp vec4, but there's no change in behavior.