One of the strengths of ARM is the resources we invest in nurturing the developer ecosystem using the ARM architecture. Mobile graphics developers are really important to us and the Game Developer Conference (#GDC17) is the place where graphics developers gather to learn about the latest rendering techniques, developer tools and platform device features, so that they can build their next generation game apps.
The resources released this GDC week are:
Vulkan SDK updated
This Vulkan SDK update has been released in github, under MIT license and you can download it here. The SDK update includes two new key sample code and tutorials:
Multipass sample code and tutorial: Multipass feature in Vulkan enables developers to implement intense bandwidth requests without the need to access external memory. In the sample code of the SDK, it shows how to implement deferred shading efficiently on mobile GPUs.
Traditionally, deferred shading on mobile was not feasible due to the very intense bandwidth requirements on writing out a full G-Buffer to memory and then being read back as textures in the lighting pass. Extensions like GL_EXT_shader_pixel_local_storage in GLES enabled developers to keep the G-Buffer on-tile to avoid this extra bandwidth requirement, but now, this is a standard feature in Vulkan, which means that no vendor-specific code paths to enable on-tile rendering are needed anymore
ASTC sample code and tutorial: texture compression is vital in order to reduce the size of games and other applications which rely heavily on textures. Furthermore, texture compression reduces bandwidth on the GPU which can improve performance and significantly reduce power consumption.
Adaptive Scalable Texture Compression (ASTC) is the leading edge texture compression standard for GPUs. ASTC supports:
To know more about ASTC visit the ASTC page on developer.arm.com.
MGD integration in Unity v5.6
Unity v5.6 is being launched at GDC’17 and one of the new features of the release is the integration of the ARM Mali Graphics Debugger (MGD) in the engine. MGD is an API tracer for OpenGL ES, Vulkan and OpenCL and it enables developers to debug and improve performance at a frame level. The Unity engine in v5.6 detects the presence of the libMGD.so library in the project and loads it automatically when the application is built with Development Build mode enabled.
MGD, advanced API debugger
The MGD integration in Unity explains the steps to build an OpenGL ES and/or Vulkan Unity application with MGD support.
MGD integration in Unreal Engine 4.15
MGD has also been integrated into Unreal Engine, in their latest version v4.15 just released. UE 4.15 enables profiling on mobile devices from the editor. To activate the ARM Mali Graphics Debugger (MGD) you simply select the option in the project settings. The Building an Unreal Engine application with Mali support pictures step by step how to enable MGD in UE4.15.
New Developer Guide: ARM Mali appplication developer best practices
The “ARM Mali application developer best practices" targets an expert developer audience, familiar with Vulkan and OpenGL ES API programming.
The guide covers the whole graphics system, going through the different pipeline subsystems which form the whole graphics system. In each subsystem, the guide outlines the topics which may be of interest to developers. Each topic is explained and a list of actionable “dos” and “don’ts” are given for application development. Also, the guide explains the impact of failing to follow that topic’s best practise, as well as debugging advice which can be used to troubleshoot each performance issue.
Yes - in general it's always worth specializing shaders. Remember that every shader is executed thousands or millions of times in a frame, so even saving a single cycle can be a huge gain.
The cost of glBindProgram is purely a CPU-side cost, so the direct cost of a single call is not that high. Indirectly however you still need to find a balance between specialization and the ability to batch objects into a single draw call; batching to reduce draw call count can hugely reduce CPU load.
Very interesting guide !
I'd like to ask a few questions from time to time about it. I don't know if there's a specific thread or website section for that, so I'll ask the questions here for the moment :
Concerning JUST15 - Generic code is harder to optimize :
> GPUs are good at very specific things. Do not write highly generic code and expect the GPU and compiler to figure everything out for you.
Does that mean that small specialized shaders are better than trying to shoe-horn everything into a big generic shader ?
I always wondered what's the real cost of a program change (glUseProgram) ? Is it 'mostly' free ?