Commit 796e8fbe authored by Robert Menzel's avatar Robert Menzel

Merge branch 'khrdebug'

parents dd9188b9 d25b9f6a
......@@ -72,8 +72,15 @@
# define CORRECT_PTR_INCLUDES_FOUND
#endif
#if (defined (__clang__))
// newer llvms on MacOS need this version:
# include <memory>
namespace ptr = std;
# define ACGL_UNIQUE_POINTER_SUPPORTED 1
# define CORRECT_PTR_INCLUDES_FOUND
#endif
#if (!defined(CORRECT_PTR_INCLUDES_FOUND) && ((__GNUC_VERSION__ >= 40400) || defined (__clang__)))
#if (!defined(CORRECT_PTR_INCLUDES_FOUND) && ((__GNUC_VERSION__ >= 40400) ))
// gcc 4.4 or newer without -std=c++0x or clang++
# include <tr1/memory>
namespace ptr = std::tr1;
......@@ -130,14 +137,18 @@ namespace ACGL
/*
* This should get called as soon as a valid OpenGL context exists,
* it will init glew (if used).
* it will init glew (if used) or the internal GL function loader.
* Call this before calling any OpenGL functions or OpenGL related
* ACGL stuff.
*
* Returns false if a critical error occured, in that case the ACGL behavior is
* not defined.
*
* parameter forDebugging: if true, register a debug callback for OpenGL and simulate
* a debug context (slow) in case the application is not running in a native debug
* context.
*/
bool init();
bool init( bool forceDebuggingContext = true );
}
......
......@@ -28,7 +28,7 @@ namespace OpenGL{
*/
class ShaderParser
{
ACGL_NOT_COPYABLE(ShaderParser)
//ACGL_NOT_COPYABLE(ShaderParser)
public:
ShaderParser( const std::string &_filename );
......
/***********************************************************************
* Copyright 2013 Computer Graphics Group RWTH Aachen University. *
* All rights reserved. *
* Distributed under the terms of the MIT License (see LICENSE.TXT). *
**********************************************************************/
#pragma once
#include <ACGL/ACGL.hh>
#include <ACGL/OpenGL/GL.hh>
namespace ACGL{
namespace OpenGL{
//! converts a KHR debug source enum to a human readable string
const char *debugSourceName( GLenum _source );
//! converts a KHR debug type enum to a human readable string
const char *debugTypeName( GLenum _type );
//! converts a KHR debug severity enum to a human readable string
const char *debugSeverityName( GLenum _type );
//! tries to register the default debug callback:
//! applications can register alternative callbacks with glDebugMessageCallback !
void ACGLRegisterDefaultDebugCallback();
//! default debug callback
void ACGL_KHR_default_debug_callback( GLenum _source, GLenum _type, GLuint _id, GLenum _severity, GLsizei _length, const GLchar *_message, const void *_userParam);
} // OpenGL
} // ACGL
......@@ -60,11 +60,6 @@
// To compare the OpenGL version number we define a new ACGL_OPENGL_VERSION XY define here
// analog to ACGL_OPENGL_VERSION_XY
//
// used internally only:
#define ACGL_LATEST_SUPPORTED_OPENGL_VERSION ACGL_OPENGL_VERSION_44
// OpenGL ES 2.0 is the default for embedded:
#ifdef ACGL_OPENGL_ES
# if defined (ACGL_OPENGLES_VERSION_30)
......@@ -130,6 +125,8 @@
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CHECKGLERROR();
#ifdef ACGL_OPENGL_ES
// ES does not know 64bit ints but we need them for the Buffer class:
#include <stdint.h>
......@@ -190,9 +187,7 @@
// The selection could also be done with some preprocessor magic but it confuses most IDEs.
//
#ifdef ACGL_OPENGL_PROFILE_CORE
#if defined (ACGL_OPENGL_INCLUDE_LATEST_GL) || defined (ACGL_LATEST_SUPPORTED_OPENGL_VERSION)
#include <ACGL/OpenGL/glloaders/gl_core_43.hh>
#elif defined (ACGL_OPENGL_VERSION_32)
#if defined (ACGL_OPENGL_VERSION_32)
#include <ACGL/OpenGL/glloaders/gl_core_32.hh>
#elif defined (ACGL_OPENGL_VERSION_33)
#include <ACGL/OpenGL/glloaders/gl_core_33.hh>
......@@ -209,14 +204,12 @@
#endif
#else
// compatibility profile:
#if defined (ACGL_OPENGL_INCLUDE_LATEST_GL) || defined (ACGL_LATEST_SUPPORTED_OPENGL_VERSION)
#include <ACGL/OpenGL/glloaders/gl_compatibility_43.hh>
#elif defined (ACGL_OPENGL_VERSION_21)
#include <ACGL/OpenGL/glloaders/gl_21.hh>
#if defined (ACGL_OPENGL_VERSION_21)
#include <ACGL/OpenGL/glloaders/gl_compatibility_21.hh>
#elif defined (ACGL_OPENGL_VERSION_30)
#include <ACGL/OpenGL/glloaders/gl_30.hh>
#include <ACGL/OpenGL/glloaders/gl_compatibility_30.hh>
#elif defined (ACGL_OPENGL_VERSION_31)
#include <ACGL/OpenGL/glloaders/gl_31.hh>
#include <ACGL/OpenGL/glloaders/gl_compatibility_31.hh>
#elif defined (ACGL_OPENGL_VERSION_32)
#include <ACGL/OpenGL/glloaders/gl_compatibility_32.hh>
#elif defined (ACGL_OPENGL_VERSION_33)
......
......@@ -127,7 +127,6 @@ public:
} else if (mpFrameBufferObject) {
glm::uvec3 size = mpFrameBufferObject->getSize();
glViewport( 0, 0, size.x, size.y );
openGLRareError();
}
}
......
......@@ -54,7 +54,7 @@ public:
public:
inline void use (void) const
{
glViewport(mOffsetX, mOffsetY, mWidth, mHeight); openGLRareError();
glViewport(mOffsetX, mOffsetY, mWidth, mHeight);
}
inline void setOffset (GLint _offsetX, GLint _offsetY)
......
......@@ -44,12 +44,8 @@ class BufferObject {
public:
BufferObject()
{
mObjectName = 0;
glGenBuffers(1, &mObjectName);
if (openGLCriticalErrorOccured() ) {
ACGL::Utils::error() << "could not generate buffer!" << std::endl;
mObjectName = 0;
return;
}
}
~BufferObject(void)
......@@ -106,7 +102,7 @@ public:
: mBuffer( _pBuffer ),
mTarget(_target)
{
mSize = (mBuffer == NULL)?0:mBuffer->getSize( mTarget );
mSize = (!mBuffer)?0:mBuffer->getSize( mTarget );
}
virtual ~Buffer(){}
......@@ -124,7 +120,7 @@ public:
// ==================================================================================================== \/
//! the GL buffer can get changed at any time
void setBufferObject( SharedBufferObject _pBuffer ) { mBuffer = _pBuffer; mSize = (mBuffer == NULL)?0:mBuffer->getSize( mTarget ); }
void setBufferObject( SharedBufferObject _pBuffer ) { mBuffer = _pBuffer; mSize = (!mBuffer)?0:mBuffer->getSize( mTarget ); }
// ===================================================================================================== \/
// ============================================================================================ WRAPPERS \/
......@@ -178,14 +174,12 @@ public:
inline void bind( GLenum _target ) const
{
glBindBuffer( _target, mBuffer->mObjectName );
openGLRareError();
}
//! Bind this buffer to its target
inline void bind() const
{
glBindBuffer( mTarget, mBuffer->mObjectName );
openGLRareError();
}
//! Set data for this buffer. Use only to init the buffer!
......@@ -194,7 +188,6 @@ public:
mSize = _sizeInBytes;
bind( _target );
glBufferData( _target, _sizeInBytes, _pData, _usage );
openGLRareError();
}
//! Set data for this buffer at the last used target. Use only to init the buffer!
......@@ -207,7 +200,6 @@ public:
GLsizeiptr _sizeInBytes, const GLvoid *_pData ) {
bind( _target );
glBufferSubData( _target, _offset, _sizeInBytes, _pData );
openGLRareError();
}
//! Use this to modify the buffer
......@@ -228,7 +220,6 @@ public:
GLvoid *mapRange( GLenum _target, GLintptr _offset, GLsizeiptr _length, GLbitfield _access ) {
bind( _target );
GLvoid *ret = glMapBufferRange( _target, _offset, _length, _access );
openGLRareError();
return ret;
}
......@@ -248,7 +239,6 @@ public:
void flushMappedRange( GLenum _target, GLsizeiptr _offset, GLsizeiptr _length ) {
bind( _target );
glFlushMappedBufferRange( _target, _offset, _length );
openGLRareError();
}
inline void flushMappedRange( GLintptr _offset, GLsizeiptr _length ) {
......@@ -286,7 +276,6 @@ public:
GLvoid *map( GLenum _target, GLenum _access ) {
bind( _target );
GLvoid *ret = glMapBuffer( _target, _access );
openGLRareError();
return ret;
}
inline GLvoid *map( GLenum _access ) {
......@@ -296,7 +285,6 @@ public:
GLboolean unmap( GLenum _target ) {
bind( _target );
GLboolean ret = glUnmapBuffer( _target );
openGLRareError();
return ret;
}
......
......@@ -89,12 +89,8 @@ public:
mColorAttachments(),
mDepthAttachment()
{
mObjectName = 0;
glGenFramebuffers(1, &mObjectName);
if (openGLCriticalErrorOccured() )
{
ACGL::Utils::error() << "could not generate FrameBufferObject!" << std::endl;
return;
}
mDepthAttachment.texture = ConstSharedTextureBase();
mDepthAttachment.renderBuffer = ConstSharedRenderBuffer();
mDepthAttachment.name = ""; // not useful here
......@@ -130,7 +126,6 @@ public:
inline void bind(GLenum _type = GL_FRAMEBUFFER) const
{
glBindFramebuffer(_type, mObjectName);
openGLRareError(); // glBindFramebuffer can only fail if the object name is no valid FBO which shouldn't happen using this framework
}
//! let OpenGL validate the completeness
......
......@@ -51,7 +51,6 @@ public:
inline void bind() const
{
glBindProgramPipeline( mObjectName );
openGLRareError();
}
//! unbinds the ProgramPipeline (if there is one bound), after that, ShaderPrograms can be used again directly
......
......@@ -40,11 +40,8 @@ public:
mWidth(0),
mHeight(0)
{
mObjectName = 0;
glGenRenderbuffers(1, &mObjectName);
if (openGLCriticalErrorOccured() ) {
ACGL::Utils::error() << "could not generate renderbuffer!" << std::endl;
return;
}
}
virtual ~RenderBuffer(void)
......
......@@ -56,7 +56,6 @@ public:
inline void bind(GLuint _textureUnit) const
{
glBindSampler( _textureUnit, mObjectName ); // yes, no adding of GL_TEXTURE0 !
openGLRareError();
}
//! unbinds the texture sampler (if there is one bound) from _textureUnit
......
......@@ -45,7 +45,6 @@ public:
{
mObjectName = glCreateShader(mType);
if (mObjectName == 0) {
openGLRareError();
ACGL::Utils::error() << "couldn't create Shader object! Requested type = " << (unsigned int) mType << std::endl;
}
}
......
......@@ -130,7 +130,6 @@ public:
inline void setUniformBlockBinding( const std::string& _blockName, GLuint _bindingPoint ) const {
GLuint blockIndex = getUniformBlockIndex(_blockName);
if (blockIndex != GL_INVALID_INDEX) glUniformBlockBinding( mObjectName, blockIndex, _bindingPoint );
openGLCommonError();
}
GLint getUniformBlockBinding( const std::string& _blockName ) const { return getUniformBlockBinding( getUniformBlockIndex(_blockName)); }
......
......@@ -73,9 +73,6 @@ public:
mInternalFormat(GL_RGBA)
{
glGenTextures(1, &mObjectName);
if (openGLCriticalErrorOccured() ) {
ACGL::Utils::error() << "could not generate texture!" << std::endl;
}
}
TextureBase(GLenum _target, GLenum _internalFormat)
......@@ -87,9 +84,6 @@ public:
mInternalFormat(_internalFormat)
{
glGenTextures(1, &mObjectName);
if (openGLCriticalErrorOccured() ) {
ACGL::Utils::error() << "could not generate texture!" << std::endl;
}
}
virtual ~TextureBase(void)
......@@ -134,14 +128,12 @@ public:
{
glActiveTexture(GL_TEXTURE0 + _textureUnit);
glBindTexture(mTarget, mObjectName);
openGLRareError();
}
//! Bind this texture to the currently active texture unit.
inline void bind(void) const
{
glBindTexture(mTarget, mObjectName);
openGLRareError();
}
//! sets the minification filter
......
......@@ -36,10 +36,8 @@ class TextureBuffer : public Buffer
public:
// create a new BufferObject with _reservedMemory space (in bytes!)
TextureBuffer( GLenum _dataType, size_t _reservedMemory = 1 ) : Buffer(GL_TEXTURE_BUFFER) {
mTextureObjectName = 0;
glGenTextures(1, &mTextureObjectName);
if (openGLCriticalErrorOccured() ) {
ACGL::Utils::error() << "could not generate texture object for texture buffer!" << std::endl;
}
mDataType = _dataType;
Buffer::setData( _reservedMemory );
attachBufferToTexture();
......@@ -47,10 +45,8 @@ public:
// use an existing BufferObject
TextureBuffer( GLenum _dataType, SharedBufferObject _pBuffer ) : Buffer(_pBuffer, GL_TEXTURE_BUFFER) {
mTextureObjectName = 0;
glGenTextures(1, &mTextureObjectName);
if (openGLCriticalErrorOccured() ) {
ACGL::Utils::error() << "could not generate texture object for texture buffer!" << std::endl;
}
mDataType = _dataType;
attachBufferToTexture();
}
......@@ -75,7 +71,6 @@ public:
void bindTexture(GLuint _textureUnit = 0) const {
glActiveTexture(GL_TEXTURE0 + _textureUnit);
glBindTexture(GL_TEXTURE_BUFFER, mTextureObjectName);
openGLRareError();
}
//! Bind the buffer part to change the data
......@@ -101,7 +96,6 @@ private:
bindTexture();
glTexBuffer( GL_TEXTURE_BUFFER, mDataType, Buffer::getObjectName() );
}
openGLCriticalErrorOccured();
}
GLenum mDataType;
......
......@@ -198,15 +198,8 @@ private:
// ===================================================================================================== \/
public:
//! Bind this VAO
//! If error checking is set to common or higher, some consistancy checks are made
#ifdef ACGL_CHECK_COMMON_GL_ERRORS
//! some consistancy checks are made
void bind() const;
#else
inline void bind() const
{
glBindVertexArray( mObjectName );
}
#endif
//! Nothing has to be prepared for a render call
inline void render (void)
......@@ -219,12 +212,11 @@ public:
//! Will select the matching draw call. Remember to bind() first!
void draw( GLsizei _primcount = 1 ) const
{
if(mpElementArrayBuffer)
if (mpElementArrayBuffer) {
drawElements( _primcount );
else
} else {
drawArrays( _primcount );
openGLRareError();
}
}
// ===================================================================================================== \/
......
......@@ -14,6 +14,7 @@
#include <ACGL/ACGL.hh>
#include <ACGL/OpenGL/GL.hh>
#include <ACGL/OpenGL/Debug.hh>
namespace ACGL{
namespace OpenGL{
......@@ -161,6 +162,11 @@ const GLubyte* acglErrorString( GLenum _errorCode );
GLenum openGLError_( const char *_fileName, const unsigned long _lineNumber );
/*
* NOTE: Explicit error checks are not needed anymore on desktop systems! Use KHR_debug
* callback instead (ACGL registers a default callback automatically).
*
*
*
* Inside of ACGL we distinguish between rare, common and critical errors. Each kind can be
* switched off which turns the function into nothing after compiler optimization. If an
* error check is turned off it will always behave as if there was no error, even if there
......@@ -223,6 +229,8 @@ inline bool openGLErrorOccuredDummy() { return false; }
# define openGLRareErrorOccured() ACGL::OpenGL::openGLErrorOccuredDummy()
#endif
} // OpenGL
} // ACGL
......
......@@ -98,6 +98,17 @@ inline bool ACGL_ARB_debug_output() {
#endif
}
// KHR debug (core in OpenGL 4.3) this tests only the extension!
inline bool ACGL_KHR_debug() {
#ifdef ACGL_EXTENSION_LOADER_GLLOADGEN
return (ogl_ext_KHR_debug != ogl_LOAD_FAILED);
#elif ACGL_EXTENSION_LOADER_GLEW
return GLEW_KHR_debug;
#else
return false;
#endif
}
} // OpenGL
} // ACGL
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -7,32 +7,18 @@
#include <ACGL/ACGL.hh>
#include <ACGL/OpenGL/GL.hh>
#include <ACGL/OpenGL/Tools.hh>
#include <ACGL/OpenGL/Debug.hh>
#include <ACGL/OpenGL/Objects/VertexArrayObject.hh>
namespace ACGL
{
bool init()
bool init( bool forceDebuggingContext )
{
Utils::debug() << "ACGL was compiled for "
#ifdef ACGL_DEBUG
<< "debug" << std::endl;
#else
<< "release" << std::endl;
Utils::debug() << "ACGL was compiled for debug" << std::endl;
#endif
Utils::debug() << "OpenGL error checking is set to "
#if defined( ACGL_CHECK_NO_GL_ERRORS )
<< "NO checks" << std::endl;
#elif defined( ACGL_CHECK_RARE_GL_ERRORS )
<< "check a lot (for debugging)" << std::endl;
#elif defined( ACGL_CHECK_COMMON_GL_ERRORS )
<< "normal" << std::endl;
#elif defined( ACGL_CHECK_CRITICAL_GL_ERRORS )
<< "only most critical checks" << std::endl;
#endif
//
// init GLEW or own extension loader, do nothing on ES
//
......@@ -41,15 +27,15 @@ bool init()
glewExperimental = GL_TRUE;
# endif
GLenum errorCode = glewInit();
if ((errorCode != GLEW_OK) || (openGLCriticalErrorOccured())) {
if ((errorCode != GLEW_OK) || (openGLErrorOccured())) {
Utils::error() << "could not init GLEW!" << std::endl;
#ifdef ACGL_OPENGL_PROFILE_CORE
Utils::error() << "Make sure your version of GLEW is compatible with core contexts" << std::endl;
Utils::error() << "Make sure your version of GLEW is compatible with core contexts!" << std::endl;
#endif
return false;
}
#elif defined( ACGL_EXTENSION_LOADER_GLLOADGEN )
int loaded = ogl_LoadFunctions();
int loaded = ogl_LoadFunctionsForDebug( GL_TRUE, forceDebuggingContext );
if (loaded == ogl_LOAD_FAILED)
{
Utils::error() << "could not load OpenGL functions!" << std::endl;
......@@ -77,6 +63,10 @@ bool init()
// gets runtime limits to be used internally:
OpenGL::initRuntimeDependentLimits();
// if possible, register debug callback:
OpenGL::ACGLRegisterDefaultDebugCallback();
return true;
}
......
......@@ -56,7 +56,6 @@ SharedShaderProgram ShaderProgramCreator::create()
}
for (std::vector<std::string>::size_type i = 0; i < numberOfFiles; ++i) {
# ifdef ACGL_CHECK_CRITICAL_GL_ERRORS
// check for problems:
if ( mShaderType[i] == GL_INVALID_VALUE ) {
......@@ -79,7 +78,6 @@ SharedShaderProgram ShaderProgramCreator::create()
Utils::error() << "file " << mFileNames[i] << " ignored, hardware does not support tessellation shader" << std::endl;
mShaderType[i] = GL_INVALID_VALUE;
}
# endif // critical checks
// attach shader
if ( mShaderType[i] != GL_INVALID_VALUE ) {
......@@ -87,9 +85,7 @@ SharedShaderProgram ShaderProgramCreator::create()
if ( shader ) {
shaderProgram->attachShader( shader );
} else {
# ifdef ACGL_CHECK_CRITICAL_GL_ERRORS
Utils::error() << "could not attach shader " << mFileNames[i] << std::endl;
# endif // critical checks
}
}
}
......@@ -97,7 +93,7 @@ SharedShaderProgram ShaderProgramCreator::create()
if (!setBindings( shaderProgram )) {
return SharedShaderProgram(); // e.g. linking failed
}
openGLCommonError();
updateFileModificationTimes();
return shaderProgram;
}
......@@ -105,18 +101,14 @@ SharedShaderProgram ShaderProgramCreator::create()
// will get called from the create and update functions:
bool ShaderProgramCreator::setBindings(SharedShaderProgram &_shaderProgram)
{
openGLRareError();
_shaderProgram->link();
# if (ACGL_OPENGL_VERSION >= 30)
_shaderProgram->setFragmentDataLocations( mFragmentDataLocations ); // might relink on it's own
openGLRareError();
SharedLocationMappings oldAttributeMap = _shaderProgram->getAttributeLocations();
mAttributeLocations->addLocations( oldAttributeMap ); // add as many old locations as possible without destoying the location map
_shaderProgram->setAttributeLocations( mAttributeLocations ); // might relink on it's own
openGLRareError();
# else
if ( (mAttributeLocations->getSize() > 0) && (mFragmentDataLocations->getSize() > 0) ) {
Utils::error() << "can't set explicit attribute/fragdata locations on OpenGL < 3.0" << std::endl;
......
/***********************************************************************
* Copyright 2011-2012 Computer Graphics Group RWTH Aachen University. *
* All rights reserved. *
* Distributed under the terms of the MIT License (see LICENSE.TXT). *
**********************************************************************/
#include <ACGL/ACGL.hh>
#include <ACGL/OpenGL/Debug.hh>
#include <ACGL/OpenGL/Tools.hh>