[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdebase/workspace/kwin/lib
From: Fredrik Höglund <fredrik () kde ! org>
Date: 2010-06-08 20:29:18
Message-ID: 20100608202918.0C5A8AC8CE () svn ! kde ! org
[Download RAW message or body]
SVN commit 1136053 by fredrik:
Add more detailed debug output in GLRenderTarget::initFBO().
CCBUG: 240956
M +89 -14 kwinglutils.cpp
--- trunk/KDE/kdebase/workspace/kwin/lib/kwinglutils.cpp #1136052:1136053
@@ -34,6 +34,7 @@
#include <QFile>
+#define DEBUG_GLRENDERTARGET 0
#define MAKE_GL_VERSION(major, minor, release) ( ((major) << 16) | ((minor) << 8) | (release) )
@@ -99,23 +100,27 @@
return glExtensions.contains(extension) || glxExtensions.contains(extension);
}
+static QString formatGLError( GLenum err )
+ {
+ switch ( err )
+ {
+ case GL_NO_ERROR: return "GL_NO_ERROR";
+ case GL_INVALID_ENUM: return "GL_INVALID_ENUM";
+ case GL_INVALID_VALUE: return "GL_INVALID_VALUE";
+ case GL_INVALID_OPERATION: return "GL_INVALID_OPERATION";
+ case GL_STACK_OVERFLOW: return "GL_STACK_OVERFLOW";
+ case GL_STACK_UNDERFLOW: return "GL_STACK_UNDERFLOW";
+ case GL_OUT_OF_MEMORY: return "GL_OUT_OF_MEMORY";
+ default: return QString( "0x" ) + QString::number( err, 16 );
+ }
+ }
+
bool checkGLError( const char* txt )
{
GLenum err = glGetError();
if( err != GL_NO_ERROR )
{
- QString string;
- switch (err)
- {
- case GL_INVALID_ENUM: string = "GL_INVALID_ENUM"; break;
- case GL_INVALID_VALUE: string = "GL_INVALID_VALUE"; break;
- case GL_INVALID_OPERATION: string = "GL_INVALID_OPERATION"; break;
- case GL_STACK_OVERFLOW: string = "GL_STACK_OVERFLOW"; break;
- case GL_STACK_UNDERFLOW: string = "GL_STACK_UNDERFLOW"; break;
- case GL_OUT_OF_MEMORY: string = "GL_OUT_OF_MEMORY"; break;
- default: string = QString( "0x" ) + QString::number( err, 16 ); break;
- }
- kWarning(1212) << "GL error (" << txt << "): " << string;
+ kWarning(1212) << "GL error (" << txt << "): " << formatGLError( err );
return true;
}
return false;
@@ -1020,21 +1025,91 @@
return true;
}
+static QString formatFramebufferStatus( GLenum status )
+ {
+ switch( status )
+ {
+ case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
+ // An attachment is the wrong type / is invalid / has 0 width or height
+ return "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT";
+ case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
+ // There are no images attached to the framebuffer
+ return "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";
+ case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:
+ // Not all attached images have the same width and height
+ return "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT";
+ case GL_FRAMEBUFFER_UNSUPPORTED:
+ // A format or the combination of formats of the attachments is unsupported
+ return "GL_FRAMEBUFFER_UNSUPPORTED";
+ case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT:
+ // The color attachments don't have the same format
+ return "GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT";
+ case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:
+ // The attachments don't have the same number of samples
+ return "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE";
+ case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER:
+ // The draw buffer is missing
+ return "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER";
+ case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER:
+ // The read buffer is missing
+ return "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER";
+ default:
+ return "Unknown (0x" + QString::number(status, 16) + ")";
+ }
+ }
+
void GLRenderTarget::initFBO()
{
+#if DEBUG_GLRENDERTARGET
+ GLenum err = glGetError();
+ if( err != GL_NO_ERROR )
+ kError(1212) << "Error status when entering GLRenderTarget::initFBO: " << formatGLError( err );
+#endif
+
glGenFramebuffers(1, &mFramebuffer);
+
+#if DEBUG_GLRENDERTARGET
+ if( (err = glGetError()) != GL_NO_ERROR )
+ {
+ kError(1212) << "glGenFramebuffers failed: " << formatGLError( err );
+ return;
+ }
+#endif
+
glBindFramebuffer(GL_FRAMEBUFFER_EXT, mFramebuffer);
+#if DEBUG_GLRENDERTARGET
+ if( (err = glGetError()) != GL_NO_ERROR )
+ {
+ kError(1212) << "glBindFramebuffer failed: " << formatGLError( err );
+ glDeleteFramebuffers(1, &mFramebuffer);
+ return;
+ }
+#endif
+
glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
mTexture->target(), mTexture->texture(), 0);
- GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER_EXT);
+#if DEBUG_GLRENDERTARGET
+ if( (err = glGetError()) != GL_NO_ERROR )
+ {
+ kError(1212) << "glFramebufferTexture2D failed: " << formatGLError( err );
+ glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
+ glDeleteFramebuffers(1, &mFramebuffer);
+ return;
+ }
+#endif
+ const GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER_EXT);
+
glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
if( status != GL_FRAMEBUFFER_COMPLETE_EXT )
{ // We have an incomplete framebuffer, consider it invalid
- kError(1212) << "Invalid framebuffer status: " << status;
+ if (status == 0)
+ kError(1212) << "glCheckFramebufferStatus failed: " << formatGLError( glGetError() );
+ else
+ kError(1212) << "Invalid framebuffer status: " << formatFramebufferStatus( status );
glDeleteFramebuffers(1, &mFramebuffer);
return;
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic