Browse Source

Class for putting marks into OpenGL command stream for use in debuggers.

pull/7/head
Vladimír Vondruš 14 years ago
parent
commit
def1d7b3c6
  1. 2
      src/CMakeLists.txt
  2. 5
      src/Context.cpp
  3. 48
      src/DebugMarker.cpp
  4. 60
      src/DebugMarker.h
  5. 2
      src/Extensions.h

2
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

5
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>& 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<Extension> 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);
}

48
src/DebugMarker.cpp

@ -0,0 +1,48 @@
/*
Copyright © 2010, 2011, 2012 Vladimír Vondruš <mosra@centrum.cz>
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 <Utility/Debug.h>
#include "Context.h"
#include "Extensions.h"
namespace Magnum {
DebugMarker::MarkImplementation DebugMarker::markImplementation = &DebugMarker::markImplementationDefault;
void DebugMarker::initializeContextBasedFunctionality(Context* context) {
if(context->isExtensionSupported<Extensions::GL::GREMEDY::string_marker>()) {
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
}
}

60
src/DebugMarker.h

@ -0,0 +1,60 @@
#ifndef Magnum_DebugMarker_h
#define Magnum_DebugMarker_h
/*
Copyright © 2010, 2011, 2012 Vladimír Vondruš <mosra@centrum.cz>
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 <string>
#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

2
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 {

Loading…
Cancel
Save