Skip to content

Goemon64Recomp Android v1.0.4

Choose a tag to compare

@github-actions github-actions released this 26 Jul 02:34

Before you update: download and install size

This release packages its native libraries differently, because the new GPU driver
feature cannot work any other way — the libraries have to be unpacked at install time
rather than read straight out of the APK.

That pulls the two sizes in opposite directions:

  • The download is smaller: 25.4 MB, down from 38.6 MB in 1.0.3, because the
    libraries are now compressed inside the APK rather than stored uncompressed.
  • The installed size is larger, by roughly 8 MB, because those same libraries then
    exist both inside the APK and unpacked alongside it.

This applies to every device, including hardware that cannot use the driver feature at
all. Nothing else about the install changes: it updates over 1.0.3 normally, and your
saves, settings and ROM are untouched.

The Adreno launch crash

Fixed the crash a few seconds after starting the game on some Adreno devices. On
affected hardware the app closed itself before the title screen appeared, every time.
It was first reported on a Motorola G60 and reproduced here on an Adreno 630.

This is a bug in the Qualcomm Vulkan driver on those devices, not in the game. That is
not a guess: the same build, on the same device, minutes apart, crashes within three
seconds under the system driver and runs under a third-party one. The crash lands inside
the driver on a call the renderer makes to copy the rendered image back into emulated
console memory.

Since the fault is in the driver, this release adds two independent ways around it.
Either is enough on its own.

Graphics -> Framebuffer Effects (On/Off), default On. Turning it off stops the
renderer making the call that crashes. It works on any device and needs nothing
installed. The cost is that visual effects which read back or draw directly into the
rendered image stop working, which is why it ships on: the fidelity is only ever given
up by someone who deliberately turns it off, and the reason to do that is that the game
otherwise will not launch at all.

Settings -> GPU Driver. Run the game on a Vulkan driver you supply instead of your
device's own. Described below.

Both are reachable on an affected device. The crash happens once the game itself starts
rendering, while the app's own menu screen comes up before that and is unaffected.

GPU Driver

New: the game can run on a Vulkan driver you provide, instead of the one your device
ships. This is aimed squarely at the case above, where the system driver is the broken
part.

It is a per-app choice. Nothing about your device is modified, no root is required, and
no other app on the device is affected.

Import a driver .adpkg package or a bare .so through the Android file picker, select
it, and restart the app when prompted. The Mesa Turnip builds by Mr. Purple
(https://github.com/MrPurple666/purple-turnip/releases) are the ones commonly used on
Adreno handhelds, and are what this was developed and tested against; other Turnip
builds packaged the same way should work too. Import rejects anything that is not a
64-bit Arm shared library, and any package missing the library its meta.json names,
and tells you which. Whether a file is genuinely a Vulkan driver is only known when it
loads; if it is not, the game says so and carries on with the system driver.

Which build to start with. Mr. Purple's Turnip builds, as tested on the Adreno 630
device this was developed on, running Android 12:

Build Driver version Result
T21 25.2.0-devel-Unified-1.4.318 Works
T24 26.0.0-T24-1.4.335 Works, and is the build the game was actually played on
T29 26.2.0-T29-1.4.354 Does not load on Android 12; needs a C library function that Android 12 does not provide, so expect it to want Android 13 or newer

The package's own minApi field will not warn you about the T29 case, since all three
declare the same value. If a driver will not load, the game tells you and falls back to
the system driver, so trying another costs nothing but a restart.

That is one GPU on one Android version, so treat it as a starting point rather than a
compatibility list. Newer builds generally want newer Android.

A driver you select has to be confirmed before it is kept. Once the game is running
on it, it asks "Keep this graphics driver?". A driver that black-screens or hangs never
reaches that question, so it is switched back to the system driver on the next launch
and the launcher tells you it did. A driver that does not work therefore costs you one
restart, not your ability to get back into the settings menu. Confirmed drivers are not
asked about again.

The system driver remains the default, and nothing changes unless you import something.

Two limits, both deliberate. A driver that works at first and breaks later while
still producing frames is not detected automatically; switch back by hand. And if
Android kills the app very early in a session, for example by swiping it away from
recents almost immediately, a driver you had already confirmed may ask again on the next
launch. That case is indistinguishable from fleeing a hung driver, and being asked twice
is a much smaller cost than a driver that cannot be reverted.

The tab is not gated on your GPU. It appears on Mali and other hardware too, but the
replacement drivers that exist are Adreno/Qualcomm builds, so there is nothing useful to
import on those devices.

Controllers

Fixed the DualSense Edge on Android 12 and earlier, where Circle, R1, Create and
Options did nothing and could not be reached by remapping.

The pad is newer than those Android releases, so Android has no layout for it and hands
it over as a generic HID device. Four buttons land in slots that carry no meaning, and
are dropped before the game ever sees them. The fix is a controller-database entry that
names the layout explicitly.

It is self-scoping: the entry matches only pads that enumerate in this broken way, so a
DualSense Edge on Android 13 or newer, which Android already handles correctly, is
untouched.

The four buttons above were confirmed on hardware. The triggers, stick clicks, PS button
and touchpad click follow the same sequential pattern and are expected to work, but were
not individually verified.

Also

The Mali fix shipped in 1.0.3 has now been confirmed by the original reporter on a
Retroid Pocket 4 Pro (Mali-G77), which was the device it was reported from and the one
piece of hardware it had never been tested on. No change was needed.

What this was tested on

The Adreno crash workaround was verified as a closed loop on an Adreno 630: the game
crashes with Framebuffer Effects on, plays with it off, and crashes again when it is
switched back on. It was separately checked on a Mali-G57 to confirm the default path is
unchanged on hardware that was already working.

The driver feature was verified end to end on that same Adreno 630: importing a real
driver package and a bare library, rejecting invalid files, playing the game on the
imported driver, both answers to the confirmation prompt, removing a driver, and
reverting correctly after the app was killed mid-session, which is the path a driver
that hangs or black-screens takes. It has not been tested on any other device, and this
is the first release built with the loader compiled in.