Skip to content

Non-Adreno support (Xclipse/Mali): asset-transcode fallback for BCn textures #9

Description

@fadi-labib

Summary

The Android renderer currently targets Adreno GPUs only. The working path bundles Mesa Turnip (via libadrenotools) to get Vulkan 1.3 + BCn texture support. Turnip is a Qualcomm/Adreno-only driver (Mesa freedreno), so it does nothing on non-Adreno devices — notably Samsung Exynos (Xclipse) and ARM Mali. On those GPUs the stock driver does not expose BC/DXT texture compression, and the game's textures are BCn-compressed DDS, so they cannot be sampled → the game can't render correctly.

This issue tracks adding a non-Adreno fallback so Exynos/Mali devices can run the port.

Why the current path doesn't cover non-Adreno

  • Turnip is Adreno-only. It cannot load on Xclipse (AMD RDNA-based) or Mali.
  • Stock non-Adreno drivers lack textureCompressionBC. The game ships thousands of BC1/BC2/BC3 (DXT1/3/5) DDS textures (~2.7 GB of assets); without BCn support the GPU can't sample them.
  • DXVK has no software BCn decode (established in the Phase 0 research), so the translation layer can't paper over it.

Evidence (on-device profiling)

  • Galaxy S22 (Exynos, SM-S908B) = Samsung Xclipse 920 (AMD RDNA2): reports Vulkan 1.3 but textureCompressionBC = FALSE. Not Adreno → no Turnip. Renderer path unusable as-is.
  • For contrast, the working device is a Tab S7+ (Snapdragon 865, Adreno 650) where the stock driver also lacks BCn, but Turnip provides it — an option not available on Xclipse/Mali.

Approach (from Phase 0 research)

The renderer chain (D3D8→DXVK→Vulkan) is fixed by determinism, so the fix is asset-side: transcode the BCn textures into a format the target GPU supports, at extract/push time (offline, on the PC), not at runtime. Two options:

  1. DXT → uncompressed RGBA8 — universally supported, simplest, but 4–8× larger on disk/VRAM (BC1 is 4 bpp, BC2/3 are 8 bpp vs 32 bpp RGBA8). Memory pressure is already a concern on mobile.
  2. DXT → ASTC or ETC2 — Xclipse and Mali support these natively; keeps textures compressed (reasonable size), but requires transcoding to a mobile format and the engine/DXVK accepting non-DXT textures for these assets.

Both require:

  • A transcode step in the asset pipeline (extend scripts/build/android/push-assets-android.sh or an offline pre-pass) that rewrites the .big/DDS textures.
  • Possibly engine texture-loader changes to accept the transcoded format on non-Adreno devices, and a device-capability check to pick Turnip (Adreno) vs. transcoded assets (non-Adreno) at boot.

Scope / effort

Large. New asset-transcode pipeline + device-capability branching + on-device validation on an Xclipse (and ideally a Mali) device. Does not touch the working Adreno/Turnip path.

References

Impact

Unlocks the large non-Adreno Android market (Samsung Exynos/Xclipse, MediaTek/Mali). Not required for Adreno devices, which work today. Best tackled as its own project once the Adreno path is polished.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requesthelp wantedExtra attention is needed

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions