Pixel 10 (PowerVR DXT-48-1536): GLES skeletal mesh explosion on newer Android 16/17; Vulkan renders correctly but crashes in PowerVR pipeline destruction path

TLDR

On Pixel 10 Pro (PowerVR DXT-48-1536), GLES now renders some skeletal characters with exploded/corrupted meshes. Vulkan renders those characters correctly, but Vulkan is not shippable due to reproducible crashes in vulkan.powervr.so pipeline destruction paths. Current only workaround is forcing CPU skinning at runtime, which is temporary and not viable long-term.

Environment

  • UE 5.6.1 (5.6.1-5132498)
  • Device under issue: Pixel 10 Pro (PowerVR D-Series DXT-48-1536)
  • Comparison devices: Pixel 8/9
    • Android versions:Pixel 8/9: looks correct on older and newer Android tested
    • Pixel 10: looked correct on older Android 16 (months ago), now broken on newer Android 16 and Android 17

How it started

We were running with Vulkan disabled. On Pixel 10, characters that used to look correct on GLES now show exploded skeletal meshes. We then enabled Vulkan: visuals are correct, but app crashes.

GLES observations

  • Confirmed OpenGL ES path (OPENGL_ES3_1_ANDROID)
  • Pixel 10-specific skeletal corruption (not seen on Pixel 8/9)
  • Not all characters are affected: two characters remain correct. Those have lower vertex counts, but not by much compared to broken characters, so this does not look like a simple vertex-count threshold.

Vulkan observations

  • Characters render correctly
    • Reproducible crashes, often on RHIThread, with signatures including:DestroyShader
    • GraphicsPipelineDestroy
  • IMG_vkDestroyPipeline
    • (all in vulkan.powervr.so)
  • Signals observed: SIGABRT, SIGTRAP
  • One variant also showed UE fatal around MallocBinnedCommon.h unrecognized pointer prior to trap.

What we tried

Vulkan/PSO tests:

  • r.PSOPrecaching=0/1
  • r.ShaderPipelineCache.Enabled=0/1
  • r.PSOPrecache.Mode=1
  • -deleteuserpsocache
  • Result: reduced/delayed in some runs, but did not eliminate Vulkan crashes.

GLES tests:

  • r.SkinCache.Mode=0 (no change)
  • r.Mobile.FloatPrecisionMode=2 (no change)
  • r.ShaderPipelineCache.Enabled=0 + r.PSOPrecaching=0 (no change)
    • r.Mobile.SupportGPUScene=0 caused immediate fatal when character content loads:OpenGLShaders.cpp line 3334
    • CommitPackedUniformBuffers null UB stage 0...

Temporary workaround:

  • Forcing CPU skinning on skeletal meshes fixes visuals, but is not practical as a long-term production solution.

Request / Questions

  1. Is this a known UE 5.6 issue on Pixel 10 PowerVR + newer Android 16/17 drivers?
  • Any known fixes in 5.7/5.8 or specific CLs for:GLES skeletal corruption on PowerVR
  • Vulkan pipeline destruction crashes on PowerVR
  1. Recommended device-profile mitigations or driver-version gating for Pixel 10?
  2. Any guidance on the OpenGL null UB failure when disabling mobile GPUScene on this device path?

[Attachment Removed]

Steps to Reproduce
Not sure how reproducible it is as it may be a combination of things.

[Attachment Removed]

This doesn’t actually fix the issue, but I worked around the same problem by surgically disabling WPO only for GLES + skinned mesh factory.

In each of these shaders:

DepthOnlyVertexShader.usf

MobileBasePassVertexShader.usf

ShadowDepthVertexShader.usf

VelocityShader.usf

Nullify the contribution from GetMaterialWorldPositionOffset/GetMaterialPreviousWorldPositionOffset based on #if (COMPILER_GLSL_ES3_1 && GPU_SKINNED_MESH_FACTORY)

Not sure what’s going on, but even for materials that don’t actually output WPO, that particular combination of features goes haywire. Hard disabling the offset did it for me.

[Attachment Removed]

Hi Calin,

This appears to likely be a PowerVR specific driver bug / incompatibility with UE. 5.6.1 predates the release of the Pixel 10 and the release of Imagination Technologies new GPUs in flagship devices. Most of known issues with this GPU family have been worked through in 5.7 to a lesser extent in 5.8. Does forcing the ANSI allocator alleviate the issue? To what extent are you tied to this version of UE?

Best regards.

[Attachment Removed]

Hi Calin,

Don’t hesitate to reach out again should the problem persist post upgrade.

Best regards.

[Attachment Removed]

Thanks, I tried reverting my workaround of forcing cpu skinning and trying this. Got pretty similar results perf-wise so for now enforcing cpu skinning only on pixel 10 is “working”. But it’s definitely not a long-term solution. I think we’ll want WPO on some characters too so disabling it outright likely isn’t going to be viable either :frowning:

Realistically we need a long term solution. I’m really hoping that later versions of Unreal have addressed the issue, we’re about to update to 5.8 so fingers crossed.

[Attachment Removed]

That’s very good to hear. We do have an update to 5.8 on our near-term roadmap.

[Attachment Removed]