From a605306bb5f61dfb1f7fd5d03f9291772b2bfc31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 12 Aug 2014 19:24:35 +0200 Subject: [PATCH] Added DebugMessage::setEnabled(). --- doc/opengl-mapping.dox | 2 +- doc/opengl-support.dox | 2 +- src/Magnum/DebugMessage.cpp | 21 ++++++++++ src/Magnum/DebugMessage.h | 53 ++++++++++++++++++++++++ src/Magnum/Implementation/DebugState.cpp | 2 + src/Magnum/Implementation/DebugState.h | 1 + src/Magnum/Renderer.h | 3 +- src/Magnum/Test/DebugGLTest.cpp | 16 +++++++ 8 files changed, 97 insertions(+), 3 deletions(-) diff --git a/doc/opengl-mapping.dox b/doc/opengl-mapping.dox index 294a547e2..06608e7f0 100644 --- a/doc/opengl-mapping.dox +++ b/doc/opengl-mapping.dox @@ -93,7 +93,7 @@ OpenGL function | Matching API @fn_gl{CreateShaderProgram} | | @fn_gl{CullFace} | @ref Renderer::setFaceCullingMode() @fn_gl{DebugMessageCallback} | @ref DebugMessage::setCallback() -@fn_gl{DebugMessageControl} | | +@fn_gl{DebugMessageControl} | @ref DebugMessage::setEnabled() @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() diff --git a/doc/opengl-support.dox b/doc/opengl-support.dox index 78f4e3d4c..1dbe88f94 100644 --- a/doc/opengl-support.dox +++ b/doc/opengl-support.dox @@ -173,7 +173,7 @@ following: @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{KHR,debug} (also in ES) | missing log 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} | | diff --git a/src/Magnum/DebugMessage.cpp b/src/Magnum/DebugMessage.cpp index 64438422e..ef9f0685f 100644 --- a/src/Magnum/DebugMessage.cpp +++ b/src/Magnum/DebugMessage.cpp @@ -143,6 +143,27 @@ void DebugMessage::insertImplementationGremedy(Source, Type, UnsignedInt, Severi } #endif +void DebugMessage::setEnabledInternal(const GLenum source, const GLenum type, const GLenum severity, const std::initializer_list ids, const bool enabled) { + Context::current()->state().debug->messageControlImplementation(source, type, severity, ids, enabled); +} + +void DebugMessage::controlImplementationNoOp(GLenum, GLenum, GLenum, std::initializer_list, bool) {} + +void DebugMessage::controlImplementationKhr(const GLenum source, const GLenum type, const GLenum severity, const std::initializer_list ids, const bool enabled) { + /** @todo Re-enable when extension wrangler is available for ES */ + #ifndef MAGNUM_TARGET_GLES + glDebugMessageControl(source, type, severity, ids.size(), ids.begin(), enabled); + #else + static_cast(source); + static_cast(type); + static_cast(severity); + static_cast(ids); + static_cast(enabled); + CORRADE_INTERNAL_ASSERT(false); + //glDebugMessageControlKHR(source, type, severity, ids.size(), ids.begin(), enabled); + #endif +} + void DebugMessage::callbackImplementationNoOp(Callback, const void*) {} void DebugMessage::callbackImplementationKhr(const Callback callback, const void* userParam) { diff --git a/src/Magnum/DebugMessage.h b/src/Magnum/DebugMessage.h index 9fe752911..041a2cb07 100644 --- a/src/Magnum/DebugMessage.h +++ b/src/Magnum/DebugMessage.h @@ -282,6 +282,55 @@ class MAGNUM_EXPORT DebugMessage { insertInternal(source, type, id, severity, {string, size - 1}); } + /** + * @brief Enable or disable particular message type + * + * @see @ref Renderer::Feature::DebugOutput, @fn_gl{DebugMessageControl} + */ + static void setEnabled(Source source, Type type, std::initializer_list ids, bool enabled) { + setEnabledInternal(GLenum(source), GLenum(type), GL_DONT_CARE, ids, enabled); + } + + /** @overload */ + static void setEnabled(Source source, Type type, Severity severity, bool enabled) { + setEnabledInternal(GLenum(source), GLenum(type), GLenum(severity), {}, enabled); + } + + /** @overload */ + static void setEnabled(Source source, Type type, bool enabled) { + setEnabledInternal(GLenum(source), GLenum(type), GL_DONT_CARE, {}, enabled); + } + + /** @overload */ + static void setEnabled(Source source, Severity severity, bool enabled) { + setEnabledInternal(GLenum(source), GL_DONT_CARE, GLenum(severity), {}, enabled); + } + + /** @overload */ + static void setEnabled(Source source, bool enabled) { + setEnabledInternal(GLenum(source), GL_DONT_CARE, GL_DONT_CARE, {}, enabled); + } + + /** @overload */ + static void setEnabled(Type type, Severity severity, bool enabled) { + setEnabledInternal(GL_DONT_CARE, GLenum(type), GLenum(severity), {}, enabled); + } + + /** @overload */ + static void setEnabled(Type type, bool enabled) { + setEnabledInternal(GL_DONT_CARE, GLenum(type), GL_DONT_CARE, {}, enabled); + } + + /** @overload */ + static void setEnabled(Severity severity, bool enabled) { + setEnabledInternal(GL_DONT_CARE, GL_DONT_CARE, GLenum(severity), {}, enabled); + } + + /** @overload */ + static void setEnabled(bool enabled) { + setEnabledInternal(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, {}, enabled); + } + /** * @brief Set debug message callback * @@ -322,6 +371,10 @@ class MAGNUM_EXPORT DebugMessage { static MAGNUM_LOCAL void insertImplementationGremedy(Source, Type, UnsignedInt, Severity, Containers::ArrayReference string); #endif + static void setEnabledInternal(GLenum source, GLenum type, GLenum severity, std::initializer_list ids, bool enabled); + static MAGNUM_LOCAL void controlImplementationNoOp(GLenum, GLenum, GLenum, std::initializer_list, bool); + static MAGNUM_LOCAL void controlImplementationKhr(GLenum source, GLenum type, GLenum severity, std::initializer_list ids, bool enabled); + static MAGNUM_LOCAL void callbackImplementationNoOp(Callback, const void*); static MAGNUM_LOCAL void callbackImplementationKhr(Callback callback, const void* userParam); }; diff --git a/src/Magnum/Implementation/DebugState.cpp b/src/Magnum/Implementation/DebugState.cpp index f030a8689..25764ae95 100644 --- a/src/Magnum/Implementation/DebugState.cpp +++ b/src/Magnum/Implementation/DebugState.cpp @@ -38,6 +38,7 @@ DebugState::DebugState(Context& context, std::vector& extensions): getLabelImplementation = &AbstractObject::getLabelImplementationKhr; labelImplementation = &AbstractObject::labelImplementationKhr; messageInsertImplementation = &DebugMessage::insertImplementationKhr; + messageControlImplementation = &DebugMessage::controlImplementationKhr; messageCallbackImplementation = &DebugMessage::callbackImplementationKhr; } else { @@ -63,6 +64,7 @@ DebugState::DebugState(Context& context, std::vector& extensions): #endif } else messageInsertImplementation = &DebugMessage::insertImplementationNoOp; + messageControlImplementation = &DebugMessage::controlImplementationNoOp; messageCallbackImplementation = &DebugMessage::callbackImplementationNoOp; } } diff --git a/src/Magnum/Implementation/DebugState.h b/src/Magnum/Implementation/DebugState.h index 2db42423c..c080a2c3f 100644 --- a/src/Magnum/Implementation/DebugState.h +++ b/src/Magnum/Implementation/DebugState.h @@ -39,6 +39,7 @@ struct DebugState { void(*labelImplementation)(GLenum, GLuint, Containers::ArrayReference); void(*messageInsertImplementation)(DebugMessage::Source, DebugMessage::Type, UnsignedInt, DebugMessage::Severity, Containers::ArrayReference); + void(*messageControlImplementation)(GLenum, GLenum, GLenum, std::initializer_list, bool); void(*messageCallbackImplementation)(DebugMessage::Callback, const void*); GLint maxLabelLength, maxLoggedMessages, maxMessageLength; diff --git a/src/Magnum/Renderer.h b/src/Magnum/Renderer.h index 6df8f9513..e69e8f3c4 100644 --- a/src/Magnum/Renderer.h +++ b/src/Magnum/Renderer.h @@ -86,7 +86,8 @@ class MAGNUM_EXPORT Renderer { /** * Debug output - * @see @ref DebugMessage, @ref Feature::DebugOutputSynchronous + * @see @ref DebugMessage, @ref DebugMessage::setEnabled(), + * @ref Feature::DebugOutputSynchronous * @requires_gl43 %Extension @extension{KHR,debug} * @requires_es_extension %Extension @es_extension{KHR,debug} */ diff --git a/src/Magnum/Test/DebugGLTest.cpp b/src/Magnum/Test/DebugGLTest.cpp index 459c6b57a..2cc81a587 100644 --- a/src/Magnum/Test/DebugGLTest.cpp +++ b/src/Magnum/Test/DebugGLTest.cpp @@ -44,6 +44,8 @@ class DebugGLTest: public AbstractOpenGLTester { void insertMessage(); void insertMessageFallback(); + void setMessageEnabled(); + void deprecated(); }; @@ -52,6 +54,8 @@ DebugGLTest::DebugGLTest() { &DebugGLTest::insertMessage, &DebugGLTest::insertMessageFallback, + &DebugGLTest::setMessageEnabled, + #ifdef MAGNUM_BUILD_DEPRECATED &DebugGLTest::deprecated #endif @@ -109,6 +113,18 @@ void DebugGLTest::insertMessageFallback() { MAGNUM_VERIFY_NO_ERROR(); } +void DebugGLTest::setMessageEnabled() { + if(!Context::current()->isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::KHR::debug::string() + std::string(" is not supported")); + + /* Try at least some combinations */ + DebugMessage::setEnabled(DebugMessage::Source::Application, true); + DebugMessage::setEnabled(DebugMessage::Source::Application, DebugMessage::Type::UndefinedBehavior, {3168, 35487, 234487}, false); + DebugMessage::setEnabled(true); + + MAGNUM_VERIFY_NO_ERROR(); +} + #ifdef MAGNUM_BUILD_DEPRECATED void DebugGLTest::deprecated() { #ifdef __GNUC__