diff --git a/Doxyfile b/Doxyfile
index 4654c9f5f..c57a9fdc0 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -214,7 +214,7 @@ ALIASES = \
"fn_gl_extension2{3}=gl\1\2()" \
"fn_gles_extension{3}=gl\1\2()" \
"def_gl{1}=`GL_\1`" \
- "deprecated_gl=@xrefitem deprecated-gl \"Deprecated OpenGL API\" \"Deprecated OpenGL API list\"" \
+ "deprecated_gl=@xrefitem opengl-deprecated \"Deprecated OpenGL API\" \"Deprecated OpenGL API list\"" \
"requires_gl30=@xrefitem requires-gl30 \"Requires OpenGL 3.0\" \"Functionality requiring OpenGL 3.0\"" \
"requires_gl31=@xrefitem requires-gl31 \"Requires OpenGL 3.1\" \"Functionality requiring OpenGL 3.1\"" \
"requires_gl32=@xrefitem requires-gl32 \"Requires OpenGL 3.2\" \"Functionality requiring OpenGL 3.2\"" \
diff --git a/doc/coding-style.dox b/doc/coding-style.dox
index b20bab75d..ceffb19b1 100644
--- a/doc/coding-style.dox
+++ b/doc/coding-style.dox
@@ -187,7 +187,7 @@ and OpenGL ES version/extension, first come desktop requirements, then ES
requirements.
All classes and functions using those commands are cross-referenced in page
-@ref required-extensions.
+@ref opengl-required-extensions.
@section unit-tests Unit tests
diff --git a/doc/opengl-mapping.dox b/doc/opengl-mapping.dox
new file mode 100644
index 000000000..0b6c9183f
--- /dev/null
+++ b/doc/opengl-mapping.dox
@@ -0,0 +1,275 @@
+/*
+ This file is part of Magnum.
+
+ Copyright © 2010, 2011, 2012, 2013 Vladimír Vondruš
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the "Software"),
+ to deal in the Software without restriction, including without limitation
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ and/or sell copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+*/
+
+namespace Magnum {
+
+/** @page opengl-mapping OpenGL command mapping
+@brief List of OpenGL commands corresponding to particular %Magnum API.
+
+@tableofcontents
+
+@section opengl-mapping-functions Functions
+
+Features mentioned in @ref opengl-unsupported are marked as *not supported*,
+empty value means that the feature is not implemented yet.
+
+OpenGL function | Matching API
+-------------------------------------- | ------------
+@fn_gl{ActiveShaderProgram} | |
+@fn_gl{ActiveTexture} | @ref AbstractTexture::bind()
+@fn_gl{AttachShader} | @ref AbstractShaderProgram::attachShader()
+@fn_gl{BeginConditionalRender}, `glEndConditionalRender()` | @ref SampleQuery::beginConditionalRender(), \n @ref SampleQuery::endConditionalRender()
+@fn_gl{BeginQuery}, `glEndQuery()` | @ref PrimitiveQuery::begin(), \n @ref SampleQuery::begin(), \n @ref TimeQuery::begin(), \n @ref AbstractQuery::end()
+@fn_gl{BeginQueryIndexed}, `glEndQueryIndexed()` | |
+@fn_gl{BeginTransformFeedback}, `glEndTransformFeedback()` | |
+@fn_gl{BindAttribLocation} | @ref AbstractShaderProgram::bindAttributeLocation()
+@fn_gl{BindBuffer} | not needed, handhled internally in @ref Buffer and elsewhere
+@fn_gl{BindBufferBase} | |
+@fn_gl{BindBufferRange} | |
+@fn_gl{BindBuffersBase} | |
+@fn_gl{BindBuffersRange} | |
+@fn_gl{BindFragDataLocation} | @ref AbstractShaderProgram::bindFragmentDataLocation()
+@fn_gl{BindFragDataLocationIndexed} | @ref AbstractShaderProgram::bindFragmentDataLocationIndexed()
+@fn_gl{BindFramebuffer} | @ref Framebuffer::bind()
+@fn_gl{BindImageTexture} | |
+@fn_gl{BindImageTextures} | |
+@fn_gl{BindProgramPipeline} | |
+@fn_gl{BindRenderbuffer} | not needed, handhled internally in @ref Renderbuffer
+@fn_gl{BindSampler} | |
+@fn_gl{BindSamplers} | |
+@fn_gl{BindTexture}, \n @fn_gl_extension{BindMultiTexture,EXT,direct_state_access} | @ref AbstractTexture::bind()
+@fn_gl{BindTextures} | |
+@fn_gl{BindTransformFeedback} | |
+@fn_gl{BindVertexArray} | not needed, handhled internally in @ref Mesh
+@fn_gl{BindVertexBuffer} | |
+@fn_gl{BindVertexBuffers} | |
+@fn_gl{BlendColor} | @ref Renderer::setBlendColor()
+@fn_gl{BlendEquation}, \n @fn_gl{BlendEquationSeparate} | @ref Renderer::setBlendEquation()
+@fn_gl{BlendFunc}, \n @fn_gl{BlendFuncSeparate} | @ref Renderer::setBlendFunction()
+@fn_gl{BlitFramebuffer} | @ref AbstractFramebuffer::blit()
+@fn_gl{BufferData}, \n @fn_gl_extension{NamedBufferData,EXT,direct_state_access} | @ref Buffer::setData()
+@fn_gl{BufferStorage} | |
+@fn_gl{BufferSubData}, \n @fn_gl_extension{NamedBufferSubData,EXT,direct_state_access} | @ref Buffer::setSubData()
+@fn_gl{CheckFramebufferStatus}, \n @fn_gl_extension{CheckNamedFramebufferStatus,EXT,direct_state_access} | @ref DefaultFramebuffer::checkStatus(), \n @ref Framebuffer::checkStatus()
+@fn_gl{ClampColor} | |
+@fn_gl{Clear} | @ref AbstractFramebuffer::clear()
+@fn_gl{ClearBuffer} | |
+@fn_gl{ClearBufferData} | |
+@fn_gl{ClearBufferSubData} | |
+@fn_gl{ClearColor} | @ref Renderer::setClearColor()
+@fn_gl{ClearDepth} | @ref Renderer::setClearDepth()
+@fn_gl{ClearStencil} | @ref Renderer::setClearStencil()
+@fn_gl{ClearTexImage} | |
+@fn_gl{ClearTexSubImage} | |
+@fn_gl{ClientWaitSync} | |
+@fn_gl{ColorMask} | @ref Renderer::setColorMask()
+@fn_gl{CompileShader} | @ref Shader::compile()
+@fn_gl{CompressedTexImage1D}, \n @fn_gl{CompressedTexImage2D}, \n @fn_gl{CompressedTexImage3D} | |
+@fn_gl{CompressedTexSubImage1D}, \n @fn_gl{CompressedTexSubImage2D}, \n @fn_gl{CompressedTexSubImage3D} | |
+@fn_gl{CopyBufferSubData}, \n @fn_gl_extension{NamedCopyBufferSubData,EXT,direct_state_access} | @ref Buffer::copy()
+@fn_gl{CopyImageSubData} | |
+@fn_gl{CopyTexImage1D}, \n @fn_gl{CopyTexImage2D} | |
+@fn_gl{CopyTexSubImage1D}, \n @fn_gl{CopyTexSubImage2D}, \n @fn_gl{CopyTexSubImage3D} | |
+@fn_gl{CreateProgram}, @fn_gl{DeleteProgram} | @ref AbstractShaderProgram constructor and destructor
+@fn_gl{CreateShader}, @fn_gl{DeleteShader} | @ref Shader constructor and destructor
+@fn_gl{CreateShaderProgram} | |
+@fn_gl{CullFace} | @ref Renderer::setFaceCullingMode()
+@fn_gl{DebugMessageCallback} | @ref DebugMessage::setCallback()
+@fn_gl{DebugMessageControl} | |
+@fn_gl{DebugMessageInsert}, \n @fn_gl_extension2{InsertEventMarker,EXT,debug_marker}, \n @fn_gl_extension{StringMarker,GREMEDY,string_marker} | @ref DebugMessage::insert()
+@fn_gl{DepthFunc} | @ref Renderer::setDepthFunction()
+@fn_gl{DepthMask} | @ref Renderer::setDepthMask()
+@fn_gl{DepthRange} | |
+@fn_gl{DepthRangeArray} | |
+@fn_gl{DepthRangeIndexed} | |
+@fn_gl{DetachShader} | |
+@fn_gl{DispatchCompute} | |
+@fn_gl{DispatchComputeIndirect} | |
+@fn_gl{DrawArrays}, \n @fn_gl{DrawElements}, \n @fn_gl{DrawRangeElements} | @ref Mesh::draw()
+@fn_gl{DrawArraysIndirect}, \n @fn_gl{DrawArraysInstanced}, \n @fn_gl{DrawArraysInstancedBaseInstance}, \n @fn_gl{DrawElementsBaseVertex}, \n @fn_gl{DrawElementsIndirect}, \n @fn_gl{DrawElementsInstanced}, \n @fn_gl{DrawElementsInstancedBaseInstance}, \n @fn_gl{DrawElementsInstancedBaseVertex}, \n @fn_gl{DrawElementsInstancedBaseVertexBaseInstance}, \n @fn_gl{DrawRangeElementsBaseVertex} | |
+@fn_gl{DrawBuffer}, \n @fn_gl_extension{FramebufferDrawBuffers,EXT,direct_state_access}, \n @fn_gl{DrawBuffers}, \n @fn_gl_extension{FramebufferDrawBuffers,EXT,direct_state_access} | @ref DefaultFramebuffer::mapForDraw(), \n @ref Framebuffer::mapForDraw()
+@fn_gl{DrawTransformFeedback}, \n @fn_gl{DrawTransformFeedbackInstanced}, \n @fn_gl{DrawTransformFeedbackStream}, \n @fn_gl{DrawTransformFeedbackStreamInstanced} | |
+@fn_gl{Enable}, `glDisable()` | @ref Renderer::setFeature()
+@fn_gl{EnableVertexAttribArray}, \n @fn_gl_extension{EnableVertexArrayAttrib,EXT,direct_state_access} \n @fn_gl2{DisableVertexAttribArray,EnableVertexAttribArray}, \n @fn_gl_extension{DisableVertexArrayAttrib,EXT,direct_state_access} | @ref Mesh::addVertexBuffer()
+@fn_gl{FenceSync}, @fn_gl{DeleteSync} | |
+@fn_gl{Finish} | @ref Renderer::finish()
+@fn_gl{Flush} | @ref Renderer::flush()
+@fn_gl{FlushMappedBufferRange}, \n @fn_gl_extension{FlushMappedNamedBufferRange,EXT,direct_state_access} | @ref Buffer::flushMappedRange()
+@fn_gl2{FramebufferParameter,FramebufferParameteri} | |
+@fn_gl{FramebufferRenderbuffer}, \n @fn_gl_extension{NamedFramebufferRenderbuffer,EXT,direct_state_access} | @ref Framebuffer::attachRenderbuffer()
+@fn_gl{FramebufferTexture} | |
+@fn_gl2{FramebufferTexture1D,FramebufferTexture}, \n @fn_gl_extension{NamedFramebufferTexture1D,EXT,direct_state_access} | @ref Framebuffer::attachTexture1D()
+@fn_gl2{FramebufferTexture2D,FramebufferTexture}, \n @fn_gl_extension{NamedFramebufferTexture2D,EXT,direct_state_access} | @ref Framebuffer::attachTexture2D()
+@fn_gl2{FramebufferTexture3D,FramebufferTexture}, \n @fn_gl_extension{NamedFramebufferTexture3D,EXT,direct_state_access} | @ref Framebuffer::attachTexture3D()
+@fn_gl{FramebufferTextureLayer} | |
+@fn_gl{FrontFace} | @ref Renderer::setFrontFace()
+@fn_gl{GenBuffers}, @fn_gl{DeleteBuffers} | @ref Buffer constructor and destructor
+@fn_gl{GenFramebuffers}, @fn_gl{DeleteFramebuffers} | @ref Framebuffer constructor and destructor
+@fn_gl{GenProgramPipelines}, @fn_gl{DeleteProgramPipelines} | |
+@fn_gl{GenQueries}, @fn_gl{DeleteQueries} | @ref AbstractQuery constructor and destructor
+@fn_gl{GenRenderbuffers}, @fn_gl{DeleteRenderbuffers} | @ref Renderbuffer constructor and destructor
+@fn_gl{GenSamplers}, @fn_gl{DeleteSamplers} | |
+@fn_gl{GenTextures}, @fn_gl{DeleteTextures} | @ref AbstractTexture constructor and destructor
+@fn_gl{GenTransformFeedbacks}, @fn_gl{DeleteTransformFeedbacks} | |
+@fn_gl{GenVertexArrays}, @fn_gl{DeleteVertexArrays} | @ref Mesh constructor and destructor
+@fn_gl{GenerateMipmap}, \n @fn_gl_extension{GenerateTextureMipmap,EXT,direct_state_access} | @ref AbstractTexture::generateMipmap()
+@fn_gl{Get} | see table below
+@fn_gl2{GetActiveAtomicCounterBuffer,GetActiveAtomicCounterBufferiv} | not supported
+@fn_gl{GetActiveAttrib} | not supported
+@fn_gl{GetActiveSubroutineName} | not supported
+@fn_gl{GetActiveSubroutineUniform} | not supported
+@fn_gl{GetActiveSubroutineUniformName} | not supported
+@fn_gl{GetActiveUniform} | not supported
+@fn_gl{GetActiveUniformBlock} | not supported
+@fn_gl{GetActiveUniformBlockName} | not supported
+@fn_gl{GetActiveUniformName} | not supported
+@fn_gl{GetActiveUniforms} | not supported
+@fn_gl{GetAttachedShaders} | not supported
+@fn_gl{GetAttribLocation} | not supported
+@fn_gl{GetBufferParameter}, \n @fn_gl_extension{GetNamedBufferParameter,EXT,direct_state_access} | @ref Buffer::size()
+@fn_gl2{GetBufferPointer,GetBufferPointerv} | not supported
+@fn_gl{GetBufferSubData}, \n @fn_gl_extension{GetNamedBufferSubData,EXT,direct_state_access} | @ref Buffer::data(), \n @ref Buffer::subData()
+@fn_gl{GetCompressedTexImage} | |
+@fn_gl{GetDebugMessageLog} | |
+@fn_gl{GetError} | @ref Renderer::error()
+@fn_gl{GetFragDataIndex}, @fn_gl{GetFragDataLocation} | not supported
+@fn_gl{GetFramebufferAttachmentParameter} | not suppported
+@fn_gl{GetFramebufferParameter} | not supported
+@fn_gl_extension{GetGraphicsResetStatus,ARB,robustness} | @ref Renderer::graphicsResetStatus()
+@fn_gl{GetInternalformat} | |
+@fn_gl{GetMultisample} | |
+@fn_gl{GetObjectLabel}, \n @fn_gl{GetObjectPtrLabel} | not supported
+@fn_gl{GetProgram}, \n @fn_gl{GetProgramInfoLog} | @ref AbstractShaderProgram::link(), \n @ref AbstractShaderProgram::validate()
+@fn_gl{GetProgramBinary} | |
+@fn_gl{GetProgramInterface} | |
+@fn_gl{GetProgramPipeline} | |
+@fn_gl{GetProgramPipelineInfoLog} | |
+@fn_gl{GetProgramResource} | |
+@fn_gl{GetProgramResourceIndex} | |
+@fn_gl{GetProgramResourceLocation} | |
+@fn_gl{GetProgramResourceLocationIndex}| |
+@fn_gl{GetProgramResourceName} | |
+@fn_gl{GetProgramStage} | |
+@fn_gl{GetQueryIndexed} | |
+@fn_gl{GetQueryObject} | @ref AbstractQuery::result()
+@fn_gl2{GetQuery,GetQueryiv} | |
+@fn_gl{GetRenderbufferParameter} | not supported
+@fn_gl{GetSamplerParameter} | |
+@fn_gl{GetShader}, \n @fn_gl{GetShaderInfoLog} | @ref Shader::compile()
+@fn_gl{GetShaderPrecisionFormat} | |
+@fn_gl{GetShaderSource} | not supported
+@fn_gl{GetSubroutineIndex} | |
+@fn_gl{GetSubroutineUniformLocation} | |
+@fn_gl{GetSync} | |
+@fn_gl{GetTexImage}, \n @fn_gl_extension{GetTextureImage,EXT,direct_state_access}, \n @fn_gl_extension{GetnTexImage,ARB,robustness} | @ref Texture::image(), \n @ref CubeMapTexture::image(), \n @ref CubeMapTextureArray::image()
+@fn_gl{GetTexLevelParameter}, \n @fn_gl_extension{GetTextureLevelParameter,EXT,direct_state_access} | @ref Texture::imageSize(), \n @ref CubeMapTexture::imageSize(), \n @ref CubeMapTextureArray::imageSize()
+@fn_gl{GetTexParameter} | |
+@fn_gl{GetTransformFeedbackVarying} | |
+@fn_gl{GetUniform} | not supported
+@fn_gl{GetUniformBlockIndex} | |
+@fn_gl{GetUniformIndices} | |
+@fn_gl{GetUniformLocation} | @ref AbstractShaderProgram::uniformLocation()
+@fn_gl{GetUniformSubroutine} | |
+@fn_gl{GetVertexAttrib} | not supported
+@fn_gl{InvalidateBufferData} | @ref Buffer::invalidateData()
+@fn_gl{InvalidateBufferSubData} | @ref Buffer::invalidateSubData()
+@fn_gl{InvalidateFramebuffer}, \n @fn_gles_extension{DiscardFramebuffer,EXT,discard_framebuffer} | @ref DefaultFramebuffer::invalidate(), \n @ref Framebuffer::invalidate()
+@fn_gl{InvalidateSubFramebuffer}, \n @fn_gles_extension{DiscardSubFramebuffer,EXT,discard_framebuffer} | @ref DefaultFramebuffer::invalidate(), \n @ref Framebuffer::invalidate()
+@fn_gl{InvalidateTexImage} | @ref AbstractTexture::invalidateImage()
+@fn_gl{InvalidateTexSubImage} | @ref Texture::invalidateSubImage(),\n @ref CubeMapTexture::invalidateSubImage(), \n @ref CubeMapTextureArray::invalidateSubImage()
+`glIs*()` | not needed (objects are strongly typed)
+@fn_gl{IsEnabled} | not supported
+@fn_gl{LineWidth} | @ref Renderer::setLineWidth()
+@fn_gl{LinkProgram} | @ref AbstractShaderProgram::link()
+@fn_gl{LogicOp} | @ref Renderer::setLogicOperation()
+@fn_gl{MapBuffer}, `glUnmapBuffer()`, \n @fn_gl_extension{MapNamedBuffer,EXT,direct_state_access}, @fn_gl_extension{UnmapNamedBuffer,EXT,direct_state_access}, \n @fn_gl{MapBufferRange}, \n @fn_gl_extension{MapNamedBufferRange,EXT,direct_state_access} | @ref Buffer::map(), @ref Buffer::unmap()
+@fn_gl_extension{MapBufferSubData,CHROMIUM,map_sub}, @fn_gl_extension{UnmapBufferSubData,CHROMIUM,map_sub} | @ref Buffer::mapSub(), @ref Buffer::unmapSub()
+@fn_gl{MemoryBarrier} | |
+@fn_gl{MinSampleShading} | |
+@fn_gl{MultiDrawArrays}, \n @fn_gl{MultiDrawArraysIndirect}, \n @fn_gl{MultiDrawElements}, \n @fn_gl{MultiDrawElementsBaseVertex}, \n @fn_gl{MultiDrawElementsIndirect} | |
+@fn_gl{ObjectLabel}, \n @fn_gl{ObjectPtrLabel}, \n @fn_gl_extension2{LabelObject,EXT,debug_label} | @ref AbstractShaderProgram::setLabel(), \n @ref AbstractQuery::setLabel(), \n @ref AbstractTexture::setLabel(), \n @ref Buffer::setLabel(), \n @ref Framebuffer::setLabel(), \n @ref Mesh::setLabel(), \n @ref Renderbuffer::setLabel(), \n @ref Shader::setLabel()
+@fn_gl{PatchParameter} | |
+@fn_gl{PauseTransformFeedback}, @fn_gl{ResumeTransformFeedback} | |
+@fn_gl{PixelStore} | |
+@fn_gl{PointParameter} | |
+@fn_gl{PointSize} | @ref Renderer::setPointSize()
+@fn_gl{PolygonMode} | @ref Renderer::setPolygonMode()
+@fn_gl{PolygonOffset} | @ref Renderer::setPolygonOffset()
+@fn_gl{PrimitiveRestartIndex} | |
+@fn_gl{ProgramBinary} | |
+@fn_gl{ProgramParameter} | @ref AbstractShaderProgram::setRetrievableBinary(), \n @ref AbstractShaderProgram::setSeparable()
+@fn_gl{ProvokingVertex} | @ref Renderer::setProvokingVertex()
+@fn_gl{PushDebugGroup}, @fn_gl{PopDebugGroup} | |
+@fn_gl{QueryCounter} | @ref TimeQuery::timestamp()
+@fn_gl{ReadBuffer}, \n @fn_gl_extension{FramebufferReadBuffer,EXT,direct_state_access} | @ref DefaultFramebuffer::mapForRead(), \n @ref Framebuffer::mapForRead()
+@fn_gl{ReadPixels}, \n @fn_gl_extension{ReadnPixels,ARB,robustness} | @ref DefaultFramebuffer::read(), \n @ref Framebuffer::read()
+@fn_gl{ReleaseShaderCompiler} | |
+@fn_gl{RenderbufferStorage}, \n @fn_gl_extension{NamedRenderbufferStorage,EXT,direct_state_access} | @ref Renderbuffer::setStorage()
+@fn_gl{RenderbufferStorageMultisample}, \n @fn_gl_extension{NamedRenderbufferStorageMultisample,EXT,direct_state_access} | @ref Renderbuffer::setStorageMultisample()
+@fn_gl{SampleCoverage} | |
+@fn_gl{SampleMaski} | |
+@fn_gl{SamplerParameter} | |
+@fn_gl{Scissor} | @ref Renderer::setScissor()
+@fn_gl{ScissorArray} | |
+@fn_gl{ScissorIndexed} | |
+@fn_gl{ShaderBinary} | |
+@fn_gl{ShaderSource} | @ref Shader::addFile(), \n @ref Shader::addSource()
+@fn_gl{ShaderStorageBlockBinding} | |
+@fn_gl{StencilFunc}, \n @fn_gl{StencilFuncSeparate} | @ref Renderer::setStencilFunction()
+@fn_gl{StencilMask}, \n @fn_gl{StencilMaskSeparate} | @ref Renderer::setStencilMask()
+@fn_gl{StencilOp}, \n @fn_gl{StencilOpSeparate} | @ref Renderer::setStencilOperation()
+@fn_gl{TexBuffer}, \n @fn_gl_extension{TextureBuffer,EXT,direct_state_access}, \n @fn_gl{TexBufferRange}, \n @fn_gl_extension{TextureBufferRange,EXT,direct_state_access} | @ref BufferTexture::setBuffer()
+@fn_gl{TexImage1D}, \n @fn_gl_extension{TextureImage1D,EXT,direct_state_access} \n @fn_gl{TexImage2D}, \n @fn_gl_extension{TextureImage2D,EXT,direct_state_access}, \n @fn_gl{TexImage3D}, \n @fn_gl_extension{TextureImage3D,EXT,direct_state_access} | @ref Texture::setImage(), \n @ref CubeMapTexture::setImage(), \n @ref CubeMapTextureArray::setImage()
+@fn_gl{TexImage2DMultisample}, \n @fn_gl{TexImage3DMultisample} | |
+@fn_gl{TexParameter}, \n @fn_gl_extension{TextureParameter,EXT,direct_state_access} | @ref AbstractTexture::setMinificationFilter(), \n @ref AbstractTexture::setMagnificationFilter(), \n @ref AbstractTexture::setBorderColor(), \n @ref AbstractTexture::setMaxAnisotropy(), \n @ref Texture::setWrapping(), \n @ref CubeMapTexture::setWrapping(), \n @ref CubeMapTextureArray::setWrapping()
+@fn_gl{TexStorage1D}, \n @fn_gl_extension{TextureStorage1D,EXT,direct_state_access}, \n @fn_gl{TexStorage2D}, \n @fn_gl_extension{TextureStorage2D,EXT,direct_state_access}, \n @fn_gl{TexStorage3D}, \n @fn_gl_extension{TextureStorage3D,EXT,direct_state_access} | @ref Texture::setStorage(), \n @ref CubeMapTexture::setStorage(), \n @ref CubeMapTextureArray::setStorage()
+@fn_gl{TexStorage2DMultisample}, \n @fn_gl{TexStorage3DMultisample} | |
+@fn_gl{TexSubImage1D}, \n @fn_gl_extension{TextureSubImage1D,EXT,direct_state_access}, \n @fn_gl{TexSubImage2D}, \n @fn_gl_extension{TextureSubImage2D,EXT,direct_state_access}, \n @fn_gl{TexSubImage3D}, \n @fn_gl_extension{TextureSubImage3D,EXT,direct_state_access} | @ref Texture::setSubImage(), \n @ref CubeMapTexture::setSubImage(), \n @ref CubeMapTextureArray::setSubImage()
+@fn_gl{TextureView} | |
+@fn_gl{TransformFeedbackVaryings} | |
+@fn_gl{Uniform}, \n @fn_gl{ProgramUniform}, \n @fn_gl_extension{ProgramUniform,EXT,direct_state_access} | @ref AbstractShaderProgram::setUniform()
+@fn_gl{UniformBlockBinding} | |
+@fn_gl{UniformSubroutines} | |
+@fn_gl{UseProgram} | @ref AbstractShaderProgram::use()
+@fn_gl{UseProgramStages} | |
+@fn_gl{ValidateProgram} | @ref AbstractShaderProgram::validate()
+@fn_gl{ValidateProgramPipeline} | |
+`glVertexAttrib*()` | not supported
+@fn_gl{VertexAttribBinding} | |
+@fn_gl{VertexAttribDivisor} | |
+@fn_gl{VertexAttribFormat} | |
+@fn_gl{VertexAttribPointer}, \n @fn_gl_extension{VertexArrayVertexAttribOffset,EXT,direct_state_access} | @ref Mesh::addVertexBuffer()
+@fn_gl{VertexBindingDivisor} | |
+@fn_gl{Viewport} | @ref DefaultFramebuffer::setViewport(), \n @ref Framebuffer::setViewport()
+@fn_gl{ViewportArray} | |
+@fn_gl{ViewportIndexed} | |
+@fn_gl{WaitSync} | |
+
+@section opengl-mapping-limits Limit queries
+
+@todoc Do this also.
+
+*/
+
+}
diff --git a/doc/opengl-support.dox b/doc/opengl-support.dox
new file mode 100644
index 000000000..6bee4c53e
--- /dev/null
+++ b/doc/opengl-support.dox
@@ -0,0 +1,337 @@
+/*
+ This file is part of Magnum.
+
+ Copyright © 2010, 2011, 2012, 2013 Vladimír Vondruš
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the "Software"),
+ to deal in the Software without restriction, including without limitation
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ and/or sell copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+*/
+
+/** @page opengl-support OpenGL support state
+@brief List of (un)supported OpenGL features and extensions.
+
+@tableofcontents
+
+@section opengl-support-state OpenGL implementation state
+
+The extension implementation is considered complete if all its defined types,
+functions and enum values are exposed through the API, except for features
+listed below in @ref opengl-unsupported-features.
+
+@subsection opengl-support-21 OpenGL 2.1
+
+The core subset of OpenGL 2.1 should be fully implemented, except for the
+following:
+
+- Pixel store state (@fn_gl{PixelStore} function)
+- Compressed texture upload
+- Proxy textures
+- Copying framebuffer to texture (@fn_gl{CopyTexImage2D} etc.)
+- Some forgotten limit queries
+
+@subsection opengl-support-30 OpenGL 3.0
+
+@todo @extension{APPLE,flush_buffer_range} doesn't add anything to @extension{ARB,map_buffer_range}
+@todo @extension{EXT,texture_array} overlaps with @extension{ARB,framebuffer_object}
+
+%Extension | Status
+-------------------------------------------- | ------
+@extension{APPLE,flush_buffer_range} | done (GL 3.0 subset)
+@extension{APPLE,vertex_array_object} | done (GL 3.0 subset)
+@extension{ARB,map_buffer_range} | done
+@extension{ARB,color_buffer_float} | |
+@extension{ARB,half_float_pixel} | done
+@extension{ARB,texture_float} | done
+@extension{ARB,depth_buffer_float} | done
+@extension{ARB,texture_rg} | done
+@extension{ARB,framebuffer_object} | missing texture layer attachments
+@extension{EXT,gpu_shader4} | done
+@extension{EXT,packed_float} | done
+@extension{EXT,texture_array} | missing texture layer attachments
+@extension{EXT,texture_compression_rgtc} | done
+@extension{EXT,texture_shared_exponent} | done
+@extension{EXT,framebuffer_sRGB} | |
+@extension{EXT,draw_buffers2} | |
+@extension{EXT,texture_integer} | missing integer color specification functions
+@extension{EXT,transform_feedback} | |
+@extension{NV,half_float} | done (GL 3.0 subset)
+@extension{NV,depth_buffer_float} | |
+@extension{NV,conditional_render} | done
+
+@subsection opengl-support-31 OpenGL 3.1
+
+%Extension | Status
+-------------------------------------------- | ------
+@extension{ARB,texture_rectangle} | missing limit query
+@extension{ARB,draw_instanced} | |
+@extension{ARB,texture_buffer_object} | missing limit query
+@extension{ARB,uniform_buffer_object} | |
+@extension{ARB,copy_buffer} | done
+@extension{EXT,texture_snorm} | done
+@extension{NV,primitive_restart} | |
+
+@subsection opengl-support-32 OpenGL 3.2
+
+%Extension | Status
+-------------------------------------------- | ------
+@extension{ARB,geometry_shader4} | done (GL 3.2 subset)
+@extension{ARB,depth_clamp} | done
+@extension{ARB,draw_elements_base_vertex} | |
+@extension{ARB,fragment_coord_conventions} | done (shading language only)
+@extension{ARB,provoking_vertex} | done
+@extension{ARB,seamless_cube_map} | done
+@extension{ARB,sync} | |
+@extension{ARB,texture_multisample} | |
+@extension{ARB,vertex_array_bgra} | done
+
+@subsection opengl-support-33 OpenGL 3.3
+
+%Extension | Status
+-------------------------------------------- | ------
+@extension{ARB,instanced_arrays} | |
+@extension{ARB,blend_func_extended} | missing limit query
+@extension{ARB,explicit_attrib_location} | done (shading language only)
+@extension{ARB,occlusion_query2} | done
+@extension{ARB,sampler_objects} | |
+@extension{ARB,shader_bit_encoding} | done (shading language only)
+@extension{ARB,texture_rgb10_a2ui} | done
+@extension{ARB,texture_swizzle} | |
+@extension{ARB,timer_query} | missing direct query
+@extension{ARB,vertex_type_2_10_10_10_rev} | done
+
+@subsection opengl-support-40 OpenGL 4.0
+
+%Extension | Status
+-------------------------------------------- | ------
+@extension{ARB,draw_buffers_blend} | |
+@extension{ARB,sample_shading} | |
+@extension{ARB,texture_cube_map_array} | done
+@extension{ARB,texture_gather} | missing limit queries
+@extension{ARB,texture_query_lod} | done (shading language only)
+@extension{ARB,draw_indirect} | |
+@extension{ARB,gpu_shader5} | missing limit queries
+@extension{ARB,gpu_shader_fp64} | done
+@extension{ARB,shader_subroutine} | |
+@extension{ARB,tessellation_shader} | missing some limit queries and patch parameter specification function
+@extension{ARB,texture_buffer_object_rgb32} | done
+@extension{ARB,transform_feedback2} | |
+@extension{ARB,transform_feedback3} | |
+
+@subsection opengl-support-41 OpenGL 4.1
+
+%Extension | Status
+-------------------------------------------- | ------
+@extension{ARB,ES2_compatibility} | only float depth clear
+@extension{ARB,get_program_binary} | |
+@extension{ARB,separate_shader_objects} | |
+@extension{ARB,shader_precision} | done (shading language only)
+@extension{ARB,vertex_attrib_64bit} | done
+@extension{ARB,viewport_array} | |
+
+@subsection opengl-support-42 OpenGL 4.2
+
+%Extension | Status
+-------------------------------------------- | ------
+@extension{ARB,texture_compression_bptc} | done
+@extension{ARB,base_instance} | |
+@extension{ARB,shading_language_420pack} | done (shading language only)
+@extension{ARB,transform_feedback_instanced} | |
+@extension{ARB,compressed_texture_pixel_storage} | |
+@extension{ARB,conservative_depth} | done (shading language only)
+@extension{ARB,internalformat_query} | |
+@extension{ARB,map_buffer_alignment} | done
+@extension{ARB,shader_atomic_counters} | |
+@extension{ARB,shader_image_load_store} | |
+@extension{ARB,shading_language_packing} | done (shading language only)
+@extension{ARB,texture_storage} | done
+
+@subsection opengl-support-43 OpenGL 4.3
+
+%Extension | Status
+-------------------------------------------- | ------
+@extension{ARB,arrays_of_arrays} | done (shading language only)
+@extension{ARB,ES3_compatibility} | only conservative sample query
+@extension{ARB,clear_buffer_object} | |
+@extension{ARB,compute_shader} | |
+@extension{ARB,copy_image} | |
+@extension{KHR,debug} (also in ES) | missing log control and retrieval, sync, pipeline, transform feedback and sampler label and debug groups
+@extension{ARB,explicit_uniform_location} | done
+@extension{ARB,fragment_layer_viewport} | done (shading language only)
+@extension{ARB,framebuffer_no_attachments} | |
+@extension{ARB,internalformat_query2} | |
+@extension{ARB,invalidate_subdata} | done
+@extension{ARB,multi_draw_indirect} | |
+@extension{ARB,program_interface_query} | |
+@extension{ARB,robust_buffer_access_behavior} | done (nothing to do)
+@extension{ARB,shader_image_size} | done (shading language only)
+@extension{ARB,shader_storage_buffer_object} | only limit queries
+@extension{ARB,stencil_texturing} | |
+@extension{ARB,texture_buffer_range} | done
+@extension{ARB,texture_query_levels} | done (shading language only)
+@extension{ARB,texture_storage_multisample} | |
+@extension{ARB,texture_view} | |
+@extension{ARB,vertex_attrib_binding} | |
+
+@subsection opengl-support-44 OpenGL 4.4
+
+%Extension | Status
+-------------------------------------------- | ------
+@extension{ARB,buffer_storage} | |
+@extension{ARB,clear_texture} | |
+@extension{ARB,enhanced_layouts} | done (shading language only)
+@extension{ARB,multi_bind} | |
+@extension{ARB,query_buffer_object} | |
+@extension{ARB,texture_mirror_clamp_to_edge} | done
+@extension{ARB,texture_stencil8} | done
+@extension{ARB,vertex_type_10f_11f_11f_rev} | |
+
+@subsection opengl-support-extensions OpenGL extensions
+
+%Extension | Status
+-------------------------------------------- | ------
+@extension{AMD,vertex_shader_layer} | done (shading language only)
+@extension{AMD,shader_trinary_minmax} | done (shading language only)
+@extension{ARB,robustness} | done
+@extension{ATI,texture_mirror_once} | done (GL 4.4 subset)
+@extension{EXT,texture_filter_anisotropic} (also in ES) | done
+@extension{EXT,texture_mirror_clamp} | only GL 4.4 subset
+@extension{EXT,direct_state_access} | done for implemented functionality
+@extension2{EXT,debug_label} (also in ES) | missing pipeline, transform feedback and sampler label
+@extension2{EXT,debug_marker} (also in ES) | missing marker groups
+@extension{GREMEDY,string_marker} | done
+
+@subsection opengl-support-es20 OpenGL ES 2.0
+
+Features that have their equivalents implemented in desktop version are
+supported.
+
+@subsection opengl-support-es30 OpenGL ES 3.0
+
+Features that have their equivalents implemented in desktop version are
+supported.
+
+@subsection opengl-support-es30-extensions OpenGL ES 2.0 extensions to match ES 3.0 functionality
+
+%Extension | Status
+-------------------------------------------- | ------
+@es_extension{ANGLE,framebuffer_blit} | done
+@es_extension{ANGLE,framebuffer_multisample} | done
+@es_extension{ANGLE,depth_texture} | done
+@es_extension{APPLE,framebuffer_multisample} | done (ES 3.0 subset)
+@es_extension{ARM,rgba8} | done
+@es_extension{EXT,texture_type_2_10_10_10_REV} | done
+@es_extension{EXT,discard_framebuffer} | done
+@es_extension2{EXT,blend_minmax,blend_minmax} | done
+@es_extension{EXT,occlusion_query_boolean} | done
+@es_extension{EXT,texture_rg} | done
+@es_extension{EXT,texture_storage} | done
+@es_extension{EXT,map_buffer_range} | done
+@es_extension{NV,draw_buffers} | done
+@es_extension{NV,fbo_color_attachments} | done
+@es_extension{NV,read_buffer} | done
+@es_extension{NV,framebuffer_blit} | done
+@es_extension{NV,framebuffer_multisample} | done
+@es_extension{OES,depth24} | done
+@es_extension{OES,element_index_uint} | done
+@es_extension{OES,rgb8_rgba8} | done (desktop-compatible subset)
+@es_extension2{OES,texture_half_float_linear,OES_texture_float_linear} | done
+@es_extension{OES,texture_float_linear} | done
+@es_extension2{OES,texture_half_float,OES_texture_float} | done
+@es_extension{OES,texture_float} | done
+@es_extension{OES,vertex_half_float} | done
+@es_extension{OES,packed_depth_stencil} | done
+@es_extension{OES,depth_texture} | done
+@es_extension{OES,standard_derivatives} | done
+@es_extension{OES,vertex_array_object} | done
+@es_extension{OES,required_internalformat} | done (desktop-compatible subset)
+@es_extension{OES,surfaceless_context} | done
+
+@subsection opengl-support-es-extensions OpenGL ES extensions to match desktop functionality
+
+Only extensions not already listed in above tables are included here.
+
+%Extension | Status
+-------------------------------------------- | ------
+@es_extension{APPLE,texture_format_BGRA8888} | done
+@es_extension{CHROMIUM,map_sub} | only buffer mapping
+@es_extension{EXT,texture_format_BGRA8888} | done
+@es_extension{EXT,read_format_bgra} | done
+@es_extension{EXT,disjoint_timer_query} | only time elapsed query
+@es_extension{EXT,separate_shader_objects} | |
+@es_extension{EXT,sRGB} | done
+@es_extension{EXT,multisampled_render_to_texture} | only renderbuffer storage
+@es_extension{EXT,robustness} | done
+@es_extension2{NV,read_buffer_front,NV_read_buffer} | done
+@es_extension2{NV,read_depth,NV_read_depth_stencil} | done
+@es_extension2{NV,read_stencil,NV_read_depth_stencil} | done
+@es_extension{NV,read_depth_stencil} | done
+@es_extension{NV,texture_border_clamp} | done
+@es_extension{OES,depth32} | done
+@es_extension{OES,mapbuffer} | done
+@es_extension{OES,stencil1} | done
+@es_extension{OES,stencil4} | done
+@es_extension{OES,texture_3D} | missing limit query
+
+@section opengl-unsupported Unsupported OpenGL features
+
+Some functionality, which is either soon-to-be deprecated or isn't proven to
+add any performance gains, is not supported in %Magnum. See also
+@ref opengl-deprecated.
+
+@subsection opengl-unsupported-features Unsupported features
+
+- State queries (various `glIs*()`, `glGet*()` functions) are not supported.
+ %Magnum API is designed to prevent the need for most of them. On the other
+ hand queries of implementation-defined values (various limits etc.) and
+ queries of generated values (buffer data, texture data) are supported.
+- Line and polygon smoothing (`GL_LINE_SMOOTH`, `GL_POLYGON_SMOOTH`) and
+ related functions are not supported, as the driver might do it in software
+ with serious performance drops. Multisampling is far superior solution.
+- Fixed precision data types (`GL_FIXED` in OpenGL ES) are not supported, as
+ they occupy the same memory as floats and they aren't faster than floats on
+ current hardware anymore.
+- Shader compiler is assumed to be present (`GL_SHADER_COMPILER` returning
+ true), as all desktop GL implementations and also ES3 are required to
+ support it.
+- Querying shader attribute locations (as opposed to setting them) is not
+ supported, as newer GL versions encourage setting them explicitly in shader
+ code.
+- Direct vertex data specification (as opposed to using buffers) is not
+ supported, as it encourages bad practices.
+
+@subsection opengl-unsupported-extensions Unsupported extensions
+
+- @extension{INTEL,map_texture} negatively affects texture access performance.
+ Combination of buffer mapping and pixel buffers might be of the same or
+ better performance, without affecting texture access speed.
+- @extension{NV,draw_texture} can be done with framebuffer blitting and
+ doesn't make any full-screen postprocessing easier, as shaders are excluded.
+
+*/
+
+/** @page opengl-deprecated Deprecated OpenGL API list
+
+See also @ref opengl-unsupported and @ref deprecated.
+
+*/
+
+/** @page deprecated Deprecated list
+
+See also @ref opengl-deprecated.
+
+*/
diff --git a/doc/required-extensions.dox b/doc/opengl.dox
similarity index 71%
rename from doc/required-extensions.dox
rename to doc/opengl.dox
index 8761f2254..8f6b5e392 100644
--- a/doc/required-extensions.dox
+++ b/doc/opengl.dox
@@ -22,21 +22,28 @@
DEALINGS IN THE SOFTWARE.
*/
-/** @page required-extensions Functionality requiring specific OpenGL version or extensions
-@brief List of functions not available on OpenGL 2.1 / OpenGL ES 2.
+/** @page opengl OpenGL
+@brief State of OpenGL support, version and extension requirements.
-The engine is meant to be run on OpenGL 3 capable hardware, but most of the
-functionality is working in OpenGL 2.1 hardware too (i.e. integrated Intel
-GPUs), unless stated otherwise. OpenGL ES is also supported.
+The following table maps OpenGL function names to %Magnum API, useful for
+developers with existing OpenGL background. Note that, as reverse mapping, each
+function documentation also contains list of OpenGL functions used.
-@see @ref building, @ref cmake, @ref MAGNUM_TARGET_GLES,
- @ref MAGNUM_TARGET_GLES2
+- @subpage opengl-mapping
+
+State of implementation of particular OpenGL versions and extensions is in the
+following table.
+
+- @subpage opengl-support
-Following are lists of functionality requiring specific OpenGL version. In
-most cases it is also specified which extension is required for given
-functionality, so if given hardware supports required extension, it doesn't
-need to have required OpenGL version too (e.g. `APPLE_vertex_array_object` is
-supported on Intel GPUs even if they are capable of OpenGL 2.1 only).
+@section opengl-required-extensions Version and extension requirements
+
+The engine requires at least OpenGL 2.1 or OpenGL ES 2.0, but some specific
+functionality has greater requirements. Following are lists of features
+requiring specific OpenGL version. In most cases it is also specified which
+extension is required, so if given hardware supports required extension, it
+doesn't need to have required OpenGL version too (e.g. `APPLE_vertex_array_object`
+is supported on older Intel GPUs even if they are capable of OpenGL 2.1 only).
- @subpage requires-gl30
- @subpage requires-gl31
@@ -52,7 +59,9 @@ supported on Intel GPUs even if they are capable of OpenGL 2.1 only).
- @subpage requires-gles20
- @subpage requires-gles30
- @subpage requires-es-extension
-- @subpage unsupported
+
+@see @ref building, @ref cmake, @ref MAGNUM_TARGET_GLES,
+ @ref MAGNUM_TARGET_GLES2
@page requires-gl30 Functionality requiring OpenGL 3.0
@page requires-gl31 Functionality requiring OpenGL 3.1
@@ -69,7 +78,7 @@ supported on Intel GPUs even if they are capable of OpenGL 2.1 only).
@page requires-gl Functionality requiring desktop OpenGL (not available on OpenGL ES)
@see @ref MAGNUM_TARGET_GLES
-@page requires-gles20 Functionality requiring OpenGL ES 2.0 (not available in ES 3.0 and desktop OpenGL)
+@page requires-gles20 Functionality requiring OpenGL ES 2.0 (not available on desktop or ES 3.0)
@see @ref MAGNUM_TARGET_GLES2
@page requires-gles30 Functionality requiring OpenGL ES 3.0
diff --git a/doc/portability.dox b/doc/portability.dox
index 6114973a1..c697221fe 100644
--- a/doc/portability.dox
+++ b/doc/portability.dox
@@ -107,7 +107,7 @@ advantage of some extensions and enable faster code paths if given extension is
available, but also have proper fallback when it's not, see for example
@ref AbstractShaderProgram-performance-optimization "AbstractShaderProgram",
@ref AbstractTexture-performance-optimization "AbstractTexture" or
-@ref Mesh-performance-optimization "Mesh". See also @ref required-extensions.
+@ref Mesh-performance-optimization "Mesh". See also @ref opengl-required-extensions.
@section portability-shaders Writing portable shaders
diff --git a/doc/unsupported.dox b/doc/unsupported.dox
deleted file mode 100644
index e4e371880..000000000
--- a/doc/unsupported.dox
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- This file is part of Magnum.
-
- Copyright © 2010, 2011, 2012, 2013 Vladimír Vondruš
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included
- in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-*/
-
-/** @page unsupported Unsupported OpenGL features
-
-Some functionality, which is either soon-to-be deprecated or isn't proven to
-add any performance gains, is not supported in %Magnum. See also @ref deprecated-gl.
-
-@section unsupported-features Unsupported features
-
-- Line and polygon smoothing (`GL_LINE_SMOOTH`, `GL_POLYGON_SMOOTH`) and
- related functions are not supported, as the driver might do it in software
- with serious performance drops. Multisampling is far superior solution.
-- Fixed precision data types (`GL_FIXED` in OpenGL ES) are not supported, as
- they occupy the same memory as floats and they aren't faster than floats on
- current hardware anymore.
-- Shader compiler is assumed to be present (`GL_SHADER_COMPILER` returning
- true), as all desktop GL implementations and also ES3 are required to
- support it.
-
-@section unsupported-extensions Unsupported extensions
-
-- @extension{INTEL,map_texture} negatively affects texture access performance.
- Combination of buffer mapping and pixel buffers might be of the same or
- better performance, without affecting texture access speed.
-- @extension{NV,draw_texture} can be done with framebuffer blitting and
- doesn't make any full-screen postprocessing easier, as shaders are excluded.
-
-*/
-
-/** @page deprecated-gl Deprecated OpenGL API list
-
-See also @ref unsupported and @ref deprecated.
-
-*/
-
-/** @page deprecated Deprecated list
-
-See also @ref deprecated-gl.
-
-*/