Setup. UE 5.7.4 source build, mobile renderer, GPU Scene on (default). Device: Honor WDY-LX1, Android 14, Helio G36, PowerVR Rogue GE8320, OpenGL ES 3.2 build 1.15[Content removed] Mali and iOS.
Problem. Instanced geometry (ISMs and auto-instanced static meshes) is drawn stretched or at the wrong positions, and the corruption changes as the camera moves. It gets worse the more objects are in view: at the map edges the scene looks correct. Forcing Vulkan on the same device shows the same corruption.
To get this far on GLES we first had to work around a fatal link failure of BuildInstanceIdBufferAndCommandsFromPrimitiveIdsCS: it needs 11 SSBOs and the driver allows 8. We set r.InstanceCulling.AllowBatchedBuildRenderingCommands=0 and r.CullInstances=0, and added a small cvar to disable bAllowWPODisable.
What we verified:
- A PVRCarbon capture replays correctly on a desktop GPU and corrupted on the device.
- A GPU readback of the per-instance data written by the instance ID build pass on the device (InstanceIdsBufferOutMobile / BatchedPrimitive) shows valid transforms.
- Vulkan validation with sync validation: no hazards around GPU Scene or instance culling.
No effect from:
- forcing direct instead of indirect draws;
- one instance per uniform buffer window;
- r.MeshDrawCommands.DynamicInstancing 0;
- disabling the program binary cache;
- a barrier-free rewrite of the load balancer’s PrefixMax.
The vertex shader reads the instance data from a 16 KB std140 UBO (BatchedPrimitive_Datavb2[1024]), indexed with gl_InstanceID and bound with glBindBufferRange at per-draw offsets. We suspect the Rogue driver mishandles this read.
Questions:
1. Is this a known issue with mobile GPU Scene on PowerVR Rogue GE8xxx, and is there a workaround (cvars, a smaller uniform buffer range, a different binding)?
2. r.Mobile.SupportGPUScene 0 is not an option for us: it is global and read-only, and disabling it project-wide caused regressions on iOS and other Android devices. Is there a supported way to cook GPU Scene off for GLSL_ES3_1_ANDROID only? Or is the recommendation to not support GE8xxx?
[Attachment Removed]