this is precisely why we made an effort to factor out pieces of functionality into ARB extensions which can be delivered on pre GL 3.0 hardware. For example, MapBufferRange.
The problem is that the deprecation system that makes it possible to have APIs replace other APIs is not compatible with older hardware. And without that deprecation mechanism, a driver that supports GL 2.1-class hardware must deal with all of the problems of the GL 2.1 API.
I just want to make sure that this does not happen again. My biggest concern is this situation.
3.1 comes around. It has some API improvements. Let’s say that direct state access is promoted to core, with an appropriate extension to 3.0. And as one would expect, all non-direct access methods are made deprecated in 3.1. That is all to the good, until 3.2 rolls around.
Now, let’s say that 3.2 comes out with the removal of deprecated features from 3.1. This is all in tune with the general, slow cleanup of the API. But 3.2 also needs to support DX11 or even higher levels of features.
Now, the removal of all non-DSA state access changes how drivers are written. They can now operate on the basic assumption that if you bind an object to the context, you intend to render with it. This is a perfectly valid and reasonable assumption, and it allows drivers to optimize better. But this only works once the non-DSA functions are removed, not just deprecated.
However, 3.2 also got bound up with new DX11-class features. And since you can’t provide an extension that says, “deprecated features are removed,” you have now tied an optimization with hardware. Even with the “cored” version of the DSA as an extension, the driver implementing that extension still must allow non-DSA access. Which means that the previously mentioned optimizations cannot happen unless you’re using a real 3.2 context.
The ARB needs to find some way to deprecate APIs through extensions or something. Or all hardware features need to come through a different path other than core promotion. We have a way to add hardware features and API features as extensions. But the benefits of new APIs usually only matter once the driver knows that the old APIs are actually unavailable.