Skip to content

Android: 120 Hz + Vulkan + VSync Swap Interval Auto/2 + color correction shader causes crashes on fast forward #18841

@oksklok

Description

@oksklok

Is there an existing issue for this?

  • This is a bug in RetroArch frontend
  • I have searched the existing issues

Description

I'm trying to dial in RetroArch on an AYN Odin 3 with its 120 Hz screen, using the Vulkan video driver.

Issue:

  • VSync Swap Interval = Auto or 2: normal gameplay seems fine, but toggling fast forward on will randomly crash RetroArch.
  • VSync Swap Interval = 1: no crash, but I get very obvious frame pacing stutter during gameplay.
  • It happens across multiple cores, including mGBA and gambatte, so it does not seem tied to one specific core or hardware-rendered emulator. My other cores mesen, bsnes, melonDS DS, and SwanStaion seem fine.
  • My AYN Thor does not have this issue, even though it also has a 120 Hz screen (probably the exact same panel).
  • I already tried the Odin screen calibration tool and RetroArch now reports around 119.962 Hz, so refresh calibration should be reasonably close now.

At this point I suspect some kind of Vulkan + high refresh + Odin 3 / Snapdragon 8 Elite driver issue, but I'm not sure.

Update:

  • The crashes only happen when a handheld color correction shader is applied (e.g. lcd-grid-v2-gba-color.slangp) or even handheld/color-mod/gba-color.slangp.
  • Tested gbc-color and nds-color. They crash as well.
  • Base LCD shaders like lcd-grid-v2 itself doesn't trigger crashes.

Expected behavior

No response

Steps to reproduce the bug

  1. On AYN Odin 3
  2. Set video driver to Vulkan
  3. Set VSync Swap Interval to Auto/2
  4. Play a GBA game on mGBA
  5. Rapidly toggle fast forward on/off multiple times and RetroArch will crash

Version/Commit

1.22.2

Bisect Results

No response

Present in the nightly version

I don't know

Platform & operating system

AYN Odin 3, Android 15

Affected Cores

mGBA, gambatte

Environment information

No response

Relevant log output

[Video] Set video size to: 960x720.
[Vulkan] Vulkan dynamic library loaded.
[Vulkan] Setting swap interval: 1.
[Vulkan] Created Android surface: 502889576368.
[Vulkan] Found GPU at index 0: "Adreno (TM) 830".
[Vulkan] Using GPU index 0.
[Vulkan] Using semaphores for WSI acquire.
[Vulkan] Using GPU: "Adreno (TM) 830".
[Vulkan] Queue family 0 supports 3 sub-queues.
[Vulkan] Got 4 swapchain images.
[Vulkan] Native window size: 1920x1080.
[Vulkan] Using resolution 1920x1080.
[Vulkan] Using RGB565 format.
[Vulkan] Loading stock shader.
[Input] Found joypad driver: "android".
[Audio] Set audio input rate to: 48000.00 Hz.
[OpenSL] Requested audio latency: 32 ms.
[OpenSL] Setting audio latency: Block size = 576, Blocks = 11, Total = 6336...
[Audio] Started synchronous audio driver.
[Display] Found display driver: "vulkan".
[Vulkan] Native window size: 1920x1080.
[Core] Using content: "/storage/D2D8-3B0B/Roms/GBA/Castlevania - Aria of Sorrow (USA).zip#Castlevania - Aria of Sorrow (USA).gba".
[Core] Unloading core...
[Core] Unloading core symbols...
RetroArch 1.22.2 (Git 69a4f0e)
=== Build =======================================
Capabilities: ASIMD
[INFO] Version: 1.22.2
[INFO] Git: 69a4f0e
[INFO] Built: Nov 20 2025
[INFO] =================================================
[Input] Found input driver: "android".
[Core] Loading dynamic libretro core from: "/data/user/0/com.retroarch.aarch64/cores/mgba_libretro_android.so".
[Override] Redirecting save file to "/storage/emulated/0/RetroArch/saves/mGBA/Castlevania - Aria of Sorrow (USA).srm".
[Override] Redirecting save state to "/storage/emulated/0/RetroArch/states/mGBA/Castlevania - Aria of Sorrow (USA).state".
[Environ] GET_CORE_OPTIONS_VERSION.
[Environ] GET_LANGUAGE: "0".
[Environ] SET_CORE_OPTIONS_V2_INTL.
[Remap] Core-specific remap found at "/storage/emulated/0/RetroArch/config/remaps/mGBA/mGBA.rmp".
[Environ] SET_PIXEL_FORMAT: RGB565.
[Environ] SET_INPUT_DESCRIPTORS.
[Environ] GET_LOG_INTERFACE.
[Content] Loading content file: "/storage/D2D8-3B0B/Roms/GBA/Castlevania - Aria of Sorrow (USA).zip#Castlevania - Aria of Sorrow (USA).gba".
[Content] CRC32: 0x47a42f0e.
[Environ] SET_AUDIO_BUFFER_STATUS_CALLBACK.
[Environ] GET_SYSTEM_DIRECTORY: "/storage/emulated/0/RetroArch/system".
[Core] Version of libretro API: 1, Compiled against API: 1
[Core] Geometry: 240x160, Aspect: 1.500, FPS: 59.73, Sample rate: 48000.00 Hz.
[Video] Set video size to: 720x480.
[Vulkan] Vulkan dynamic library loaded.
[Vulkan] Setting swap interval: 2.
[Vulkan] Created Android surface: 502889407888.
[Vulkan] Found GPU at index 0: "Adreno (TM) 830".
[Vulkan] Using GPU index 0.
[Vulkan] Using semaphores for WSI acquire.
[Vulkan] Using GPU: "Adreno (TM) 830".
[Vulkan] Queue family 0 supports 3 sub-queues.
[Vulkan] Got 4 swapchain images.
[Vulkan] Native window size: 1920x1080.
[Vulkan] Using resolution 1920x1080.
[Vulkan] Using RGB565 format.
[Shaders] Specific shader preset found at "/storage/emulated/0/RetroArch/config/mGBA/mGBA.slangp".
[Slang] Compiling shader: "/data/user/0/com.retroarch.aarch64/shaders/shaders_slang/handheld/shaders/color/lut/GBA-LUT.slang".
[Vulkan] Using render target format R8G8B8A8_UNORM for pass output #0.
[Slang] Compiling shader: "/data/user/0/com.retroarch.aarch64/shaders/shaders_slang/handheld/shaders/lcd-cgwg/lcd-grid-v2.slang".
[Vulkan] Using render target format R8G8B8A8_UNORM for pass output #1.
[Slang] Compiling shader: "/data/user/0/com.retroarch.aarch64/shaders/shaders_slang/handheld/shaders/color/gba-color.slang".
[Vulkan] Using render target format R8G8B8A8_UNORM for pass output #2.
[Vulkan] Creating framebuffer 256x256 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Input] Found joypad driver: "android".
[Video] Found display server: "android".
[Audio] Set audio input rate to: 48203.57 Hz.
[Vulkan] Creating framebuffer 256x256 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[OpenSL] Requested audio latency: 32 ms.
[OpenSL] Setting audio latency: Block size = 576, Blocks = 11, Total = 6336...
[Audio] Started synchronous audio driver.
[Display] Found display driver: "vulkan".
[Playlist] Loading favorites file: "/storage/emulated/0/RetroArch/playlists/builtin/content_favorites.lpl".
[Playlist] Loading history file: "/storage/emulated/0/RetroArch/playlists/builtin/content_history.lpl".
[Playlist] Loading history file: "/storage/emulated/0/RetroArch/playlists/builtin/content_image_history.lpl".
[Playlist] Loading history file: "/storage/emulated/0/RetroArch/playlists/builtin/content_music_history.lpl".
[Environ] SET_MEMORY_MAPS.
[Environ] SET_SUPPORT_ACHIEVEMENTS: yes.
[Environ] SET_MINIMUM_AUDIO_LATENCY.
[Environ] GET_RUMBLE_INTERFACE.
[Vulkan] Updating framebuffer size 240x160 (format: 37).
[Vulkan] Native window size: 1920x1080.
[Vulkan] Creating framebuffer 256x256 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Vulkan] Updating framebuffer size 240x160 (format: 37).
GBA Memory: Detected SRAM savegame
[Vulkan] Setting swap interval: 0.
[Vulkan] Native window size: 1920x1080.
[Vulkan] Creating framebuffer 256x256 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Vulkan] Updating framebuffer size 240x160 (format: 37).
[Vulkan] Setting swap interval: 2.
[Vulkan] Native window size: 1920x1080.
[Vulkan] Creating framebuffer 256x256 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Vulkan] Updating framebuffer size 240x160 (format: 37).
[Vulkan] Setting swap interval: 0.
[Vulkan] Native window size: 1920x1080.
[Vulkan] Creating framebuffer 256x256 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Vulkan] Updating framebuffer size 240x160 (format: 37).
[Vulkan] Setting swap interval: 2.
[Vulkan] Native window size: 1920x1080.
[Vulkan] Creating framebuffer 256x256 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Vulkan] Updating framebuffer size 240x160 (format: 37).
[Vulkan] Setting swap interval: 0.
[Vulkan] Native window size: 1920x1080.
[Vulkan] Creating framebuffer 256x256 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Vulkan] Updating framebuffer size 240x160 (format: 37).
[Vulkan] Setting swap interval: 2.
[Vulkan] Native window size: 1920x1080.
[Vulkan] Creating framebuffer 256x256 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Vulkan] Updating framebuffer size 240x160 (format: 37).
[Vulkan] Setting swap interval: 0.
[Vulkan] Native window size: 1920x1080.
[Vulkan] Creating framebuffer 256x256 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Vulkan] Updating framebuffer size 240x160 (format: 37).
[Vulkan] Setting swap interval: 2.
[Vulkan] Native window size: 1920x1080.
[Vulkan] Creating framebuffer 256x256 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Vulkan] Updating framebuffer size 240x160 (format: 37).
[Vulkan] Setting swap interval: 0.
[Vulkan] Native window size: 1920x1080.
[Vulkan] Creating framebuffer 256x256 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Vulkan] Updating framebuffer size 240x160 (format: 37).
[Vulkan] Setting swap interval: 2.
[Vulkan] Native window size: 1920x1080.
[Vulkan] Creating framebuffer 256x256 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Vulkan] Creating framebuffer 1620x1080 (max 1 level(s)).
[Vulkan] Updating framebuffer size 0x0 (format: 37).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions