An Open Letter to ARM / Mali: Please stop doing this


Dear ARM, in charge of the Mali GPU:

DO NOT REUSE THE SAME DEVICE ID FOR TWO DIFFERENT GPU MODELS.
STOP DOING THAT.

In case you don’t understand what I’m talking about, here’s an example:

in 3DMark for Android Wild Life, the MC4 model has a score 1483, the MP12 model has a score of 3394.

I’m going to be straight: THIS IS BULLSHIT.

If NVIDIA couldn’t get away with branding their GeForce 4080 12GB model as a 4080 which was considerably inferior to the 4080 16GB model (and had to be rebranded as GeForce 4070, and their VBIOS reflashed), neither can you.

Why this is important

A good video game experience means that “everything works great out of the box”.

In order to do that, we need to know how fast the phone is.

In other words, query the GPU & CPU model, look up our database and prepare the best settings for that particular model (i.e. low/mid/high settings for low/mid/high tier end phones respectively)

We can’t do that if “Mali-G76” has a performance gap of 2.3x or more between models.

“It’s up to the OEM”

No. It’s not.

Qualcomm doesn’t have this problem. ImgTec doesn’t have this problem. Only Mali has it.

Adreno in terms of speed 630 > 620 > 610 > 605 and this is reflected in their vendor IDs. In fact, adreno device IDs often correspond to their marketing names, which is a plus.

I hate Qualcomm Adrenos for many reasons, but they got this right.

What we need from ARM

For the future

So for the future: Stop doing this. Lay clear, ground rules on how the device IDs are assigned.

You can’t have a >= 1.2x perf gap between models carrying the same device ID and marketing name. Once you cross that threshold it’s a different GPU model.

Yes, I know it’s the same chip with the same capabilities but with more cores. Reflect this on the device id. Reserve N bits for the number of cores if you wish.

In the meantime

So, the problem is out in the wild. It can’t be corrected. As gamedevs, what we need is a thin library on Github that takes a VkPhysicalDeviceProperties and whatever else is necessary to parse the model and returns an enum with the exact model (e.g. ARM_MALI_G76_MP12) and a score with a (rough) relative performance score.

Something like this:

enum ArmGpuArch
{
    ARM_MIDGARD,
    ARM_BIFROST,
    // ...
}
enum ArmMaliModels
{
   ARM_MALI_G76,
   ARM_MALI_G76_MC4,
   ARM_MALI_G76_MP12,
   // ...
};

struct ArmModelInfo
{
    ArmGpuArch arch;
    ArmMaliModels model;
    uint32_t relativeScore;
};

static bool ArmAnalyzeModel(
    const VkPhysicalDeviceProperties &deviceProps,
    ArmModelInfo &outModelInfo );

ArmModelInfo model;
if( ArmAnalyzeModel( deviceProps, model, relativeScore ) )
{
    // could be determined
    if( model.relativeScore == 0u )
    {
        // GPU is ARM, but we can't estimate its performance
    }
    else
    {
        // GPU is ARM and we know its estimated performance
    }
}
else
{
    // Model could not be determined (i.e. library database is too old?)
    // Model is not ARM
    // model and relativeScore are left uninitialized
}

Until ARM doesn’t fix this and/or provide us with means to identify the models, the experience for those with ARM Mali GPUs is going to suck.