It seems that there is no such thing as eglGetProcAddress() and thus we
are able to use only functions that are defined in the ES[23]/glext.h
header and no others. So, currently, the function loader internally
undefs all function name macros that were defined in our flextgl.h
header, then includes the Apple's glext.h header and assigns function
pointers of those extensions that are defined in the header. Apple also
has some minor differences in function signatures (different constness
of pointer-to-pointer variables) so I had to reinterpret_cast
everything.
Might seem to be uglier than including glext.h directly in our code,
but I made bad experience when doing so -- I want to depend on my
header bugs that are consistent across all platforms instead of
depending on whatever changes Apple makes in its headers. I also want to
have all functions defined and not only those that are supported on
iOS.
Phew. Thank you, flextGL, for making it way easier than it appeared to
be at first.
103% of use cases use the returned value directly without checking, so
we might as well do the check ourselves. Added new function hasCurrent()
and added deprecated backward-compatibility conversion and -> operators.
Wow, that creeped to a lot of places.
Last dinosaur from the pointer age.
That was unprofessional from me, sorry, because it didn't even compile.
When I got it to compile, it crashed right away, because I was querying
GLX function instead of WGL function. But even after that it was still
crashing BECAUSE APPARENTLY YOU HAVE TO CREATE CONTEXT TO BE ABLE TO
CREATE CONTEXT, YO DAWG.
Fuck all this GL shit. Gimme something sane already. Ugh.
Binary AMD drivers require the user to explicitly request the debug
context on context initialization, otherwise all debug functions are
no-op. This allows us to use debug functionality in command-line utils
and, mainly, GL functionality tests.
The Windows versions are coded without testing, so I hope I did not break
something :)
The parameterless Platform::Context::Context() constructor and
Platform::Context::tryCreate() function are deprecated in favor
functions that take argc/argv pair. The Context class now accepts
arguments starting with --magnum-* prefix. Currently there are none
except for the implicit --magnum-help, but that will change with the
following commits.
AMD is behaving the same as NVidia (at least on Windows) -- when
creating core context with minimum specified version set to 3.1, it
forces that version instead of going with the largest available version,
which, again, is pretty useless behavior.
Enabling that on both Linux and Windows, the behavior is confirmed on
Windows but I bet it's doing the same on Linux.
In some cases the GL context creation might success without error, but
the created version is one that we don't want (e.g. software GDI
rasterizer on Windows). Previously the Context class constructor just
exited the application and it was impossible to react on that from the
application side (for example reducing some context feature
requirements).
Now there is Platform::Context::tryCreate(), which returns either
created instance or `nullptr` if the instance creation failed with some
error. That is now used in all Platform::*Application implementations.
Mesa needs at least GL 3.1 to create core contexts and it creates
context with highest possible version. Great. Requesting that on binary
NV drivers will force the version to 3.1, which is, to say it mildly,
useless.
Thus, when binary NV drivers are detected, the core context is destroyed
and we're starting over, requesting compatibility 2.1 context, which
properly returns GL 4.5. Uhh.