Browse Source

GL: implemented ARB_sample_shading.

pull/268/merge
Vladimír Vondruš 8 years ago
parent
commit
641589ed7e
  1. 3
      doc/changelog.dox
  2. 2
      doc/opengl-mapping.dox
  3. 4
      doc/opengl-support.dox
  4. 11
      src/Magnum/GL/Implementation/RendererState.cpp
  5. 3
      src/Magnum/GL/Implementation/RendererState.h
  6. 16
      src/Magnum/GL/Renderer.cpp
  7. 40
      src/Magnum/GL/Renderer.h

3
doc/changelog.dox

@ -59,6 +59,9 @@ See also:
can be over @cpp 1.0f @ce only in non-forward-compatible contexts, a new
@cpp "mesa-forward-compatible-line-width-range" @ce workaround fixes that
for Mesa. See @ref opengl-workarounds for more information.
- Implemented the @gl_extension{ARB,sample_shading} desktop extension and the
equivalent functionality in OpenGL ES 3.2 / @gl_extension{OES,sample_shading}
ES3 extension
@subsubsection changelog-latest-new-math Math library

2
doc/opengl-mapping.dox

@ -294,7 +294,7 @@ OpenGL function | Matching API
@fn_gl_extension{MakeTextureHandleNonResident,ARB,bindless_texture} | |
@fn_gl{MapBuffer}, \n `glMapNamedBuffer()`, \n @fn_gl_extension{MapNamedBuffer,EXT,direct_state_access}, \n @fn_gl{MapBufferRange}, \n `glMapNamedBufferRange()`, \n @fn_gl_extension{MapNamedBufferRange,EXT,direct_state_access}, \n @fn_gl{UnmapBuffer}, \n `glUnmapNamedBuffer()`, \n @fn_gl_extension{UnmapNamedBuffer,EXT,direct_state_access} | @ref GL::Buffer::map(), @ref GL::Buffer::unmap()
@fn_gl{MemoryBarrier}, \n `glMemoryBarrierByRegion()` | @ref GL::Renderer::setMemoryBarrier(), \n @ref GL::Renderer::setMemoryBarrierByRegion()
@fn_gl{MinSampleShading} | |
@fn_gl{MinSampleShading} | @ref GL::Renderer::setMinSampleShading()
@fn_gl{MultiDrawArrays}, \n @fn_gl{MultiDrawElements}, \n @fn_gl{MultiDrawElementsBaseVertex} | @ref GL::MeshView::draw(AbstractShaderProgram&, std::initializer_list<std::reference_wrapper<MeshView>>)
@fn_gl{MultiDrawArraysIndirectCount}, \n @fn_gl{MultiDrawElementsIndirectCount} | |

4
doc/opengl-support.dox

@ -135,7 +135,7 @@ Extension | Status
------------------------------------------- | ------
GLSL 4.00 | done
@gl_extension{ARB,draw_buffers_blend} | |
@gl_extension{ARB,sample_shading} | |
@gl_extension{ARB,sample_shading} | done
@gl_extension{ARB,texture_cube_map_array} | done
@gl_extension{ARB,texture_gather} | missing limit queries
@gl_extension{ARB,texture_query_lod} | done (shading language only)
@ -353,7 +353,7 @@ Extension | Status
@gl_extension2{KHR,blend_equation_advanced,blend_equation_advanced} | done
@gl_extension{KHR,robustness} | |
@gl_extension{KHR,robust_buffer_access_behavior} | done (nothing to do)
@gl_extension{OES,sample_shading} | |
@gl_extension{OES,sample_shading} | done
@gl_extension{OES,sample_variables} | done (shading language only)
@gl_extension{OES,shader_image_atomic} | done (shading language only)
@gl_extension{OES,shader_multisample_interpolation} | |

11
src/Magnum/GL/Implementation/RendererState.cpp

@ -95,6 +95,17 @@ RendererState::RendererState(Context& context, std::vector<std::string>& extensi
{
lineWidthRangeImplementation = &Renderer::lineWidthRangeImplementationDefault;
}
#ifndef MAGNUM_TARGET_GLES
minSampleShadingImplementation = &Renderer::minSampleShadingImplementationDefault;
#elif !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL)
if(context.isVersionSupported(Version::GLES320))
minSampleShadingImplementation = &Renderer::minSampleShadingImplementationDefault;
else if(context.isExtensionSupported<Extensions::OES::sample_shading>())
minSampleShadingImplementation = &Renderer::minSampleShadingImplementationOES;
else
minSampleShadingImplementation = nullptr;
#endif
}
RendererState::PixelStorage::PixelStorage():

3
src/Magnum/GL/Implementation/RendererState.h

@ -38,6 +38,9 @@ struct RendererState {
Range1D(*lineWidthRangeImplementation)();
void(*clearDepthfImplementation)(GLfloat);
#if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL)
void(*minSampleShadingImplementation)(GLfloat);
#endif
#ifndef MAGNUM_TARGET_WEBGL
Renderer::GraphicsResetStatus(*graphicsResetStatusImplementation)();

16
src/Magnum/GL/Renderer.cpp

@ -133,6 +133,22 @@ void Renderer::setPointSize(const Float size) {
}
#endif
#if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL)
void Renderer::setMinSampleShading(const Float value) {
(Context::current().state().renderer->minSampleShadingImplementation)(value);
}
void Renderer::minSampleShadingImplementationDefault(const GLfloat value) {
glMinSampleShading(value);
}
#ifdef MAGNUM_TARGET_GLES
void Renderer::minSampleShadingImplementationOES(const GLfloat value) {
glMinSampleShadingOES(value);
}
#endif
#endif
void Renderer::setScissor(const Range2Di& rectangle) {
glScissor(rectangle.left(), rectangle.bottom(), rectangle.sizeX(), rectangle.sizeY());
}

40
src/Magnum/GL/Renderer.h

@ -262,11 +262,18 @@ class MAGNUM_GL_EXPORT Renderer {
RasterizerDiscard = GL_RASTERIZER_DISCARD,
#endif
#if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL)
/**
* Scissor test
* @see @ref setScissor()
* Sample shading.
* @see @ref setMinSampleShading()
* @requires_gl40 Extension @gl_extension{ARB,sample_shading}
* @requires_gles32 Extension @gl_extension{ANDROID,extension_pack_es31a}
* / @gl_extension{OES,sample_shading}
* @requires_gles30 Sample shading is not defined in OpenGL ES 2.0.
* @requires_gles Sample shading is not available in WebGL.
*/
ScissorTest = GL_SCISSOR_TEST,
SampleShading = GL_SAMPLE_SHADING,
#endif
#ifndef MAGNUM_TARGET_GLES
/**
@ -279,6 +286,12 @@ class MAGNUM_GL_EXPORT Renderer {
SeamlessCubeMapTexture = GL_TEXTURE_CUBE_MAP_SEAMLESS,
#endif
/**
* Scissor test
* @see @ref setScissor()
*/
ScissorTest = GL_SCISSOR_TEST,
/**
* Stencil test
* @see @ref setClearStencil(), @ref setStencilFunction(),
@ -599,6 +612,20 @@ class MAGNUM_GL_EXPORT Renderer {
static void setPointSize(Float size);
#endif
#if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL)
/**
* @brief Set min sample shading value
*
* @see @ref Feature::SampleShading, @fn_gl_keyword{MinSampleShading}
* @requires_gl40 Extension @gl_extension{ARB,sample_shading}
* @requires_gles32 Extension @gl_extension{ANDROID,extension_pack_es31a} /
* @gl_extension{OES,sample_shading}
* @requires_gles30 Sample shading is not defined in OpenGL ES 2.0.
* @requires_gles Sample shading is not available in WebGL.
*/
static void setMinSampleShading(Float value);
#endif
/*@}*/
/** @{ @name Scissor operations */
@ -1653,6 +1680,13 @@ class MAGNUM_GL_EXPORT Renderer {
#endif
static void MAGNUM_GL_LOCAL clearDepthfImplementationES(GLfloat depth);
#if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL)
static MAGNUM_GL_LOCAL void minSampleShadingImplementationDefault(GLfloat value);
#ifdef MAGNUM_TARGET_GLES
static MAGNUM_GL_LOCAL void minSampleShadingImplementationOES(GLfloat value);
#endif
#endif
#ifndef MAGNUM_TARGET_WEBGL
static GraphicsResetStatus MAGNUM_GL_LOCAL graphicsResetStatusImplementationDefault();
static GraphicsResetStatus MAGNUM_GL_LOCAL graphicsResetStatusImplementationRobustness();

Loading…
Cancel
Save