Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/pojavlauncherteam/pojavlauncher/llms.txt

Use this file to discover all available pages before exploring further.

PojavLauncher cannot use OpenGL directly on Android the way a desktop JVM can. Instead it ships several rendering backends that translate Minecraft’s OpenGL calls into something an Android GPU can execute. Choosing the right backend for your hardware and Minecraft version is one of the most impactful performance decisions you can make. This page explains every available renderer, when to use each one, and how to configure them.

How renderer selection works internally

When PojavLauncher starts the JVM, JREUtils.loadGraphicsLibrary() maps the active renderer name to a shared library:
Renderer nameNative library loaded
opengles2libgl4es_114.so
vulkan_zinklibOSMesa.so
opengles3_ltwlibltw.so (ANGLE EGL)
The renderer name is stored in the renderer shared preference key (LauncherPreferences.PREF_RENDERER, default "opengles2") and can also be overridden per-launch via the environment variable POJAV_RENDERER.

Available renderers

opengles2 — GL4ES on OpenGL ES 2.0

The default renderer and the most compatible option. GL4ES 1.1.4 (shipped as libgl4es_114.so) translates OpenGL 1.x/2.x calls from Minecraft into OpenGL ES 2.0 calls that any modern Android GPU can execute. Shown in the UI as “Holy GL4ES — (all versions, fast)”. Best for:
  • All Minecraft versions, especially 1.0 through 1.16.5
  • Devices with older or budget GPUs that may not support GLES 3.0 reliably
  • Troubleshooting — if another renderer crashes, fall back here first
Environment variables set automatically:
LIBGL_ES=2
LIBGL_MIPMAP=3
LIBGL_NOERROR=1
LIBGL_NOINTOVLHACK=1
LIBGL_NORMALIZE=1

vulkan_zink — Mesa Zink (OpenGL over Vulkan)

The highest-performance renderer for supported hardware. Mesa’s Zink driver implements OpenGL on top of Vulkan. PojavLauncher ships this as libOSMesa.so. On Adreno and Mali GPUs that have mature Vulkan 1.1+ drivers, Zink bypasses many of GL4ES’s translation overhead layers entirely. Shown in the UI as “Zink (Vulkan) — (all versions, mid)”. Best for:
  • Flagship Adreno 600-series and newer (Snapdragon 845+)
  • Flagship Mali GPUs (Exynos / MediaTek with good Vulkan drivers)
  • Minecraft 1.17+ where you want maximum draw call throughput
Minimum requirement: Vulkan 1.1 support on the device.

Zink-specific settings

Setting keyPreference constantDescription
zinkPreferSystemDriverPREF_ZINK_PREFER_SYSTEM_DRIVERWhen true, PojavLauncher uses the device’s system Vulkan driver instead of loading the bundled Mesa Turnip driver. On non-Adreno GPUs, leave this enabled. On Adreno GPUs, the bundled Turnip driver is usually superior — this preference is false by default.
vsync_in_zinkPREF_VSYNC_IN_ZINKControls VSync specifically for the Zink backend. Sets POJAV_VSYNC_IN_ZINK=1 in the JVM environment. Defaults to true.
When PREF_ZINK_PREFER_SYSTEM_DRIVER is false on an Adreno GPU, PojavLauncher sets POJAV_LOAD_TURNIP=1, which loads the bundled Mesa Turnip Vulkan driver in place of the system driver. The Vulkan library path is passed via -Dorg.lwjgl.vulkan.libname=libvulkan.so.

opengles3_ltw — LTW (ANGLE / OpenGL ES 3)

An alternative renderer that uses the ANGLE EGL library (libltw.so), exposing OpenGL ES 3.0. Shown in the UI as “LTW (OpenGL ES 3) — 1.17+ only”. When this renderer is selected, PojavLauncher sets LIBGL_ES=3 and POJAVEXEC_EGL=libltw.so in the JVM environment. Best for:
  • Minecraft 1.17 and newer on devices where vulkan_zink is unavailable or unstable
  • Devices with solid GLES 3.0 driver support that do not have Vulkan
Minimum requirement: OpenGL ES 3.0 support on the device. The renderer is hidden in the UI if the device does not report GLES 3.0 or the LTW library is not bundled in the installed APK.

How to change the renderer

Global setting

1

Open Settings

From the main launcher screen, tap the Settings (gear) icon.
2

Go to Video

Tap Video in the settings menu.
3

Select a renderer

Tap Renderer and choose from the list. The choice is saved immediately as the renderer preference.

Per-profile override

Open the Profile Editor for a specific profile and set the pojavRendererName field to one of the renderer name strings listed in the table above. A per-profile renderer overrides the global setting only for that profile.

Surface mode: TextureView vs SurfaceView

PojavLauncher can render into either a TextureView or a SurfaceView. The setting is controlled by alternate_surface (PREF_USE_ALTERNATE_SURFACE).
ModeSettingNotes
TextureViewalternate_surface = falseDefault on lower-end devices. More flexible compositing.
SurfaceViewalternate_surface = trueDefault on powerful devices. Lower latency; fixes rendering glitches on some GPU/driver combinations.
If you see flickering, a black game area, or visual corruption, try toggling Alternate Surface in Settings → Video.

VSync and performance options

Setting keyPreference constantEffect
force_vsyncPREF_FORCE_VSYNCSets FORCE_VSYNC=true in the JVM environment. Eliminates screen tearing at the cost of locking the frame rate to the display refresh rate. Defaults to true on powerful devices.
vsync_in_zinkPREF_VSYNC_IN_ZINKVSync specifically inside the Zink pipeline (see above).
dump_shadersPREF_DUMP_SHADERSSets LIBGL_VGPU_DUMP=1. Dumps compiled shaders to disk for debugging GL4ES issues.
bigCoreAffinityPREF_BIG_CORE_AFFINITYSets POJAV_BIG_CORE_AFFINITY=1. Pins the JVM to big cores on asymmetric (big.LITTLE) CPUs for more consistent frame times.
sustainedPerformancePREF_SUSTAINED_PERFORMANCEEnables Android’s sustained performance mode to prevent thermal throttling over long play sessions.

Renderer selection guide

Is your device running Minecraft 1.16.5 or older?
  └── Yes → use opengles2

Does your device have Vulkan 1.1+ (Adreno 600+ or Mali G76+)?
  └── Yes → try vulkan_zink first
      └── Crashes or broken graphics? → fall back to opengles2

Running Minecraft 1.17+, no Vulkan or unstable Vulkan?
  └── try opengles3_ltw (requires GLES 3.0)
      └── Not available or crashes? → use opengles2

Seeing graphical glitches with any renderer?
  └── Toggle Alternate Surface in Settings → Video
  └── Disable force_vsync and try again
On 32-bit devices (ARMv7 / x86), Vulkan is rarely available and GL4ES has tighter memory constraints. Stick to opengles2 and keep RAM allocation at or below 696 MB.

Build docs developers (and LLMs) love