During a lecture held by Nvidia at the Steam Dev Days conference, the graphics manufacturer noted that OpenGL already supported some extensions and optimisations for processors that could bring about the same performance benefits as AMD’s Mantle API. The lecture’s theme was “Beyond Porting” and talked about the number of ways in which developers can take advantage of the features and optimisations in OpenGL that not only make it a better API in some scenarios compared to DirectX, but that it will allow developers to optimise the same game on other platforms.
Nvidia says that in Modern OpenGL there’s a command called ‘ARB_multi_draw_indirect’ that was introduced into Modern OpenGL some time ago, but wasn’t widely used. It allows for developers to unlimit the number of draw calls made to the CPU and have the GPU address them instead. This lessens the load on the CPU when it has to work with the GPU driver and it means that the benefits to Mantle get replicated in OpenGL as well – Nvidia’s Cass Everitt says that there’s a boost in the region of 5-30x the number of discernable on-screen objects.
Nvidia says that this isn’t the only optimisation that developers can do for increasing draw call count, but it is one of the few that can be enabled at this point in time. ARB_multi_draw_indirect is already supported in Nvidia’s OpenGL drivers and can be enabled on Intel and AMD hardware. However, there is a slight catch.
There does seem to be a limitation in how useful this option is. Everitt clarified that ARB_multi_draw_indirect can, sometimes, negatively affect the performance of the graphics card and the system as a whole. Because OpenGL isn’t an architecture-tailored approach to the problem, when there’s a lower load imposed on the system the code won’t offload the work to the GPU. Feeding a GPU is easier when there’s work to be done but when there’s not enough to make it really necessary, OpenGL may trick it into thinking it needs to be in an idle state.
In addition, unlike Mantle, the ARB_multi_draw_indirect command is not a one-size-fits-all approach to increasing performance and the number of draw calls the system can do at once. The command will have to be used in certain scenarios because it is effective for some workloads, but not for all.
On the NeoGAF forums, game fixer Durante (who brought you the majority of fixes to Dark Souls on PC) noted that the extension had been in place long before AMD announced their Mantle API and that combining the extension with Nvidia’s bindless texture ability in Kepler GPUs would effectively give developers 0% CPU overhead, well within the range of what Mantle promises. However, having the ability doesn’t mean that everyone will suddenly adopt OpenGL instead of DirectX.
“The hard part would be getting people to re-adopt OpenGL for high-end games. At least its greatly helped out by mobile,” wrote Durante. “The major reason OpenGL lost ground on PC is tool support. There was a time around [the release of] DirectX9 where MS was really pushing hard and improving the API at a rapid pace, while the OpenGL ARB (Architecture Review Board) was sleeping, or at least napping, at the wheel.”
“Between Valve’s support and the massive market force in mobile and multiplatform development I hope to see OpenGL regaining ground on PC,” he added.
This is why Valve chose to partner with Nvidia initially while testing out their SteamOS and games running natively on the platform. Nvidia’s open-source and closed-source drivers are usually very good, resulting in a generally acceptable experience on Linux and there’s even support for Kepler and switchable graphics. Nvidia is now one of the bigger contributors to OpenGL and Linux development.
Interestingly, if you browse to the specifications registry on OpenGL.org, the ARB_multi_draw_indirect command is credited to Graham Sellers, an OpenGL engineer working at AMD. It was added to the OpenGL 4.1 specification in June 2012 and is technically comparable to the pre-existing AMD_multi_draw_indirect extension which was added to OpenGL in 2011.
Discuss this in the forums: Linky