Rendering differently on different devices

#1

Rendering looks fine on my PC (GeForce GTX 1050) and my phone (Android Galaxy Note 9). Tried it on my wife’s phone (Galaxy S8) and that’s where the differences can be seen.

This is how it should render…

…but this is how it renders on my wife’s phone.

One obvious difference you’ll see is the menu is messed up. The other difference which is not so obvious is the test cube is only rendering with one texture.

I suspect the garbled menu might have something to do with clamping. The menu interface and the fonts are sprite sheets (rendering selective parts from one texture). The test cube is a completely different issue. Normally you would wrap one texture around a mesh but for flexibility, I allow for multiple textures to be used on a mesh. So for the test cube, each side is a separate texture.

Validation layers is not complaining about anything. Did a bunch of tests but nothing is conclusive. Any thoughts?

#2

It is hard to have any useful opinion just based on symptoms\rendering artifacts. Any and all misuse of the API leads to undefined behavior. And undefined behavior is… well… undefined.

My go to explanation is bad sync, as it is easiest to get wrong, as well as least covered by the validation layers. Although Android ecosystem is not exactly big on updating drivers, so I could be concerned about driver bugs too. Or your app might be doing something wrong depending on limits and caps of the other device.

It should be possible to use RenderDoc to help debugging Android app.

#3

Thanks for your reply. I do have a thought. I use “push descriptors” and in the previous Android platform (Oreo, Vulkan 1.0), this feature was broken. No matter how many textures you were trying to render, it would only render one of the textures in all places. Now that we have Pie 9 and Vulkan 1.1 on Android, everything seems to be working except for the Galaxy S8. The cube rendering only one texture in all places seems very similar to the original “push descriptors” problem.

#4

@GameCodingNinja, do you have any message from validation layers?
Which GPU does use in Galaxy S8(i know about two version of SoCs (Snapdragon with Adreno and Exynos with Mali). ?
Try to ask in ARM forum https://community.arm.com/developer/tools-software/graphics/f/discussions
or Qualcomm https://developer.qualcomm.com/forums/software/adreno-gpu-sdk

#5

It’s the Adreno 520 I believe. After doing more tests I’ve confirmed it’s the “push descriptor” problem. This is a known issue that I thought was related to Vulkan 1.0. It’s most likely a driver related. Recording multiple renders to a command buffer, it only acts on the first push descriptor and ignores the rest. It’s a great feature but broken on too many Android phones. Will need to setup the normal descriptors.

Example…
start command buffer
cmdPushDescriptorSet -> Only acts on this one.
vkCmdDrawIndexed
cmdPushDescriptorSet
vkCmdDrawIndexed
cmdPushDescriptorSet
vkCmdDrawIndexed
cmdPushDescriptorSet
vkCmdDrawIndexed
end command buffer