UE 5.7.4 mobile GPU Scene: corrupted instance transforms on PowerVR Rogue GE8320 (GLES and Vulkan)

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]

Steps to Reproduce[Attachment Removed]

Hi Alexandr,

The GLES drivers for that line of GPUs are notoriously buggy.. However, if you have a repro project we can look at, could you provide one?

Best regards.

[Attachment Removed]

Hi,

Thanks for the quick reply. We fully agree: the GLES drivers on this GPU line are very buggy, and we’ve run into quite a few driver-side issues on them already.

Unfortunately we can’t share our project, even privately. Some context: we just moved from a customized UE 4.27 to 5.7.4. On 4.27 the same content ran fine on these devices, because it had no mobile GPU Scene. GE8xxx devices are still a noticeable share of our Android audience, so dropping them right away isn’t a good option for us.

Since a repro project is hard for us, we’d really appreciate your recommendations:

  1. Supported path for GE8xxx. Is there a configuration you’d recommend for these GPUs in 5.7? For example, a known set of cvars or device profile settings, or a way to make the mobile renderer avoid the instanced UBO path (BatchedPrimitive / gl_InstanceID indexing) on specific devices.
  2. GPU Scene per platform or shader format. Is there a supported way to cook GLSL_ES3_1_ANDROID (or a separate Android cook flavor) with r.Mobile.SupportGPUScene=0, while keeping it on for Vulkan Android and iOS? If this needs engine changes, could you point us to where GPU Scene is baked into the shader permutations and runtime paths, so we can judge how big a local change it would be?
  3. Vulkan on GE8xxx. Vulkan shows the same corruption on this device. Does Epic consider Vulkan on PowerVR Rogue a supported target in 5.7, or is it better to keep these devices on GLES?
  4. Official stance. If the answer is basically “Rogue GE8xxx is not supported with GPU Scene,” that’s still useful for us to know. Is there any guidance on the minimum PowerVR generation you target for mobile in 5.x?

Any pointers would help a lot, even partial ones such as which area of the code to look at or which cvars to try.

[Attachment Removed]

Hi Alexandr,

Unfortunately there are no known workaround to the driver issues with the GE8xxx. We internally do not support that GPU family with GPUScene. It is my understanding that this issue is address in PowerVR GMxxxx series drivers.

Best regards.

[Attachment Removed]

Hi,

Thanks, that’s clear.

We’d still like to support these devices by disabling GPU Scene only for them. As far as we can see, r.Mobile.SupportGPUScene is a read-only global setting that is baked in at cook time. What would you recommend?

  1. Making it per shader platform: GLSL_ES3_1_ANDROID without GPU Scene, Vulkan and iOS with it. PowerVR Rogue would be forced to GLES via device profiles. Does the engine support GPU Scene differing between shader platforms in one cook, and where should we look?
  2. A separate Android build with GPU Scene off, targeted to these devices via Google Play.
  3. Any other way we may have missed.

Best regards,

Alexander

[Attachment Removed]

Hi Alexandr,

Unfortunately there is no mechanism to achieve your first idea. The second is most viable, but would require manual whitelisting of devices which could be a challenge. To build the GLES onlu GPUScene-less build, you can add the following to the cook command line:

-ini:Engine:[SystemSettings]:r.Mobile.SupportGPUScene=0
-ini:Engine:[/Script/AndroidRuntimeSettings.AndroidRuntimeSettings]:bSupportsVulkan=False,[/Script/AndroidRuntimeSettings.AndroidRuntimeSettings]:bSupportsVulkanSM5=False

Best regards.

[Attachment Removed]