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.
ES 2.0 extensions to match ES3/desktop functionality. The enums from
NV_pack_subimage are not available in gl.xml from Khronos, I would need
to use hardcoded value.
Just added them to the list, nothing integrated or implemented yet. Also
added some more stuff into OpenGL mapping table, as I apparently forgot
some entries.
It is superseded by core functionality. The only annoyance is that you
need to use TextureFormat::SRGB in ES2 and TextureFormat::SRGB8 in ES3,
but that's with many other formats anyway. Also apparently the unsized
format is still allowed in core desktop GL, which is a shame.
The actual WebGL 2 distinction was done as a part of previous WebGL
cleanup. It compiles, but is completely broken, as Emscripten has some
missing bits to go through at least Context class creation.
This was the actual problem. Most of ES extensions are not available in
WebGL, thus the GL headers and the code was far more bloated than it
needed to be. The GL header is now reduced and the previous 13 commits
were disabling features that aren't actually available in WebGL.
The final executable size is reduced by ~50 kB, which actually isn't
much, but still something.
Some ES extensions (ANGLE_depth_texture and ANGLE_instanced_arrays) have
now WEBGL_* prefix. I'm still using the original prefix in the
implementation because there are headers for these, but in public docs
and elsewhere they are exposed with WEBGL_*.
In OpenGL ES 2.0 there is EXT_draw_buffers, which I overlooked somehow,
so I added it to extension list and included in the implementation. It
combines NV_draw_buffers and NV_fbo_color_attachments, so the
implementation now selects one of the two based on which extension is
supported, preferring the EXT one. Updated the documentation to be
less confusing, fixed extension links. Also the single-output
mapForDraw() is not handled separately on ES anymore and just calls
DrawBuffers implementation with single parameter, resulting in less
generated code.
EXT_draw_buffers can also be called on default framebuffer and
apparently in ES there is no way to map front framebuffer for drawing,
so I removed it from the DefaultFramebuffer::DrawAttachment enum.
New in 2.8.9, much cleaner than the previous "solution". Also cleaned up
the surroundings a bit. Fixed cases where PIC was forced independently
of the settings, for plugins the PIC is now also set only when
needed/requested.
Using GLES extension functions in the code won't cause linker failures
anymore, but their addresses aren't being loaded yet. As said before,
NaCl and Emscripten is still a special case.
Currently just regenerated the stock headers using flextGL, reducing
line count a bit. No dynamic extension loading or function pointers yet,
trying to make as little changes as possible.
The function pointer loading is now moved to Application classes to make
it possible to decide about platform-specific API at usage time, not at
library compilation time.
Currently it's not possible to create the Magnum context any other way
than through Application classes, will solve that in next commits.
Added new root CMakeLists.txt file, the old include paths are used only
if MAGNUM_BUILD_DEPRECATED is set, thus it can now compile and install
only if deprecated build is enabled.
Everything what was in src/ is now in src/Corrade, everything from
src/Plugins is now in src/MagnumPlugins, everything from external/ is in
src/MagnumExternal. Added new CMakeLists.txt file and updated the other
ones for the moves, no other change was made. If MAGNUM_BUILD_DEPRECATED
is set, everything compiles and installs like previously except for the
plugins, which are now in MagnumPlugins and not in Magnum/Plugins.