From def1d7b3c6853eb9cf6bdcdde71a754528a22fe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 22 Nov 2012 00:21:03 +0100 Subject: [PATCH] Class for putting marks into OpenGL command stream for use in debuggers. --- src/CMakeLists.txt | 2 ++ src/Context.cpp | 5 +++- src/DebugMarker.cpp | 48 ++++++++++++++++++++++++++++++++++++ src/DebugMarker.h | 60 +++++++++++++++++++++++++++++++++++++++++++++ src/Extensions.h | 2 ++ 5 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 src/DebugMarker.cpp create mode 100644 src/DebugMarker.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d073f76f1..3ac3038d5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -16,6 +16,7 @@ set(Magnum_SRCS AbstractShaderProgram.cpp Buffer.cpp Context.cpp + DebugMarker.cpp Framebuffer.cpp Image.cpp IndexedMesh.cpp @@ -55,6 +56,7 @@ set(Magnum_HEADERS Color.h Context.h CubeMapTexture.h + DebugMarker.h DimensionTraits.h Extensions.h Framebuffer.h diff --git a/src/Context.cpp b/src/Context.cpp index 48cf17e56..df6b751af 100644 --- a/src/Context.cpp +++ b/src/Context.cpp @@ -27,6 +27,7 @@ #include "IndexedMesh.h" #include "Mesh.h" #include "Implementation/State.h" +#include "DebugMarker.h" using namespace std; @@ -41,7 +42,8 @@ const std::vector& Extension::extensions(Version version) { _extension(GL,AMD,vertex_shader_layer), _extension(GL,AMD,shader_trinary_minmax), _extension(GL,EXT,texture_filter_anisotropic), - _extension(GL,EXT,direct_state_access)}; + _extension(GL,EXT,direct_state_access), + _extension(GL,GREMEDY,string_marker)}; static const std::vector extensions300{ _extension(GL,APPLE,flush_buffer_range), _extension(GL,APPLE,vertex_array_object), @@ -249,6 +251,7 @@ Context::Context() { #ifndef MAGNUM_TARGET_GLES BufferedTexture::initializeContextBasedFunctionality(this); #endif + DebugMarker::initializeContextBasedFunctionality(this); IndexedMesh::initializeContextBasedFunctionality(this); Mesh::initializeContextBasedFunctionality(this); } diff --git a/src/DebugMarker.cpp b/src/DebugMarker.cpp new file mode 100644 index 000000000..490128344 --- /dev/null +++ b/src/DebugMarker.cpp @@ -0,0 +1,48 @@ +/* + Copyright © 2010, 2011, 2012 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +#include "DebugMarker.h" + +#include + +#include "Context.h" +#include "Extensions.h" + +namespace Magnum { + +DebugMarker::MarkImplementation DebugMarker::markImplementation = &DebugMarker::markImplementationDefault; + +void DebugMarker::initializeContextBasedFunctionality(Context* context) { + if(context->isExtensionSupported()) { + Debug() << "DebugMarker: using" << Extensions::GL::GREMEDY::string_marker::string() << "features"; + + markImplementation = &DebugMarker::markImplementationDebugger; + } +} + +void DebugMarker::markImplementationDefault(const std::string&) {} + +void DebugMarker::markImplementationDebugger(const std::string& string) { + /** @todo Re-enable when extension wrangler is available for ES */ + #ifndef MAGNUM_TARGET_GLES + glStringMarkerGREMEDY(string.length(), string.c_str()); + #else + #if 0 + glInsertEventMarkerEXT(string.length(), string.c_str()); + #endif + #endif +} + +} diff --git a/src/DebugMarker.h b/src/DebugMarker.h new file mode 100644 index 000000000..942c38dad --- /dev/null +++ b/src/DebugMarker.h @@ -0,0 +1,60 @@ +#ifndef Magnum_DebugMarker_h +#define Magnum_DebugMarker_h +/* + Copyright © 2010, 2011, 2012 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +/** @file + * @brief Class Magnum::DebugMarker + */ + +#include + +#include "Magnum.h" + +#include "magnumVisibility.h" + +namespace Magnum { + +/** +@brief Debug marker + +Allows putting debug marker into OpenGL command stream for use with various +debuggers, such as ApiTrace or gDEBugger. +@requires_extension %Extension @extension{GREMEDY,string_marker}. If not + available, this class does nothing. +@requires_es_extension %Extension @es_extension{EXT,debug_marker}. If not + available, this class does nothing. +*/ +class MAGNUM_EXPORT DebugMarker { + friend class Context; + + public: + /** @brief Put string mark into OpenGL command stream */ + inline static void mark(const std::string& string) { + markImplementation(string); + } + + private: + static void MAGNUM_LOCAL initializeContextBasedFunctionality(Context* context); + + typedef void(*MarkImplementation)(const std::string&); + static MAGNUM_LOCAL void markImplementationDefault(const std::string& string); + static MAGNUM_LOCAL void markImplementationDebugger(const std::string& string); + static MarkImplementation markImplementation; +}; + +} + +#endif diff --git a/src/Extensions.h b/src/Extensions.h index 7551d8946..6d3fb27a6 100644 --- a/src/Extensions.h +++ b/src/Extensions.h @@ -136,6 +136,8 @@ namespace GL { _extension(GL,EXT,transform_feedback, GL210, GL300) // #352 _extension(GL,EXT,direct_state_access, GL210, None) // #353 _extension(GL,EXT,texture_snorm, GL300, GL310) // #365 + } namespace GREMEDY { + _extension(GL,GREMEDY,string_marker, GL210, None) // #311 } namespace INTEL { /* INTEL_map_texture not supported */ // #429 } namespace NV {