From cbf1862449aa61edb80301953695bf22641a6914 Mon Sep 17 00:00:00 2001 From: kgv Date: Thu, 10 Oct 2013 08:41:05 +0400 Subject: [PATCH] 0024245: TKOpenGL - use Message_Messenger interface to report issues --- src/OpenGl/OpenGl_Context.cxx | 87 ++++++++++++++++++++-------- src/OpenGl/OpenGl_Context.hxx | 22 ++++++- src/OpenGl/OpenGl_Font.cxx | 8 +++ src/OpenGl/OpenGl_PrimitiveArray.cxx | 9 ++- 4 files changed, 99 insertions(+), 27 deletions(-) diff --git a/src/OpenGl/OpenGl_Context.cxx b/src/OpenGl/OpenGl_Context.cxx index a26f482876..ab170f79c5 100644 --- a/src/OpenGl/OpenGl_Context.cxx +++ b/src/OpenGl/OpenGl_Context.cxx @@ -31,6 +31,7 @@ #include #include +#include #include #include @@ -138,6 +139,18 @@ OpenGl_Context::~OpenGl_Context() mySharedResources.Nullify(); myDelayed.Nullify(); + if (arbDbg != NULL + && caps->contextDebug) + { + // reset callback + void* aPtr = NULL; + glGetPointerv (GL_DEBUG_CALLBACK_USER_PARAM_ARB, &aPtr); + if (aPtr == this) + { + arbDbg->glDebugMessageCallbackARB (NULL, NULL); + } + } + delete myGlCore20; delete arbVBO; delete arbTBO; @@ -241,15 +254,13 @@ Standard_Boolean OpenGl_Context::MakeCurrent() DWORD anErrorCode = GetLastError(); FormatMessageW (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, anErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (wchar_t* )&aMsgBuff, 0, NULL); + TCollection_ExtendedString aMsg ("wglMakeCurrent() has failed. "); if (aMsgBuff != NULL) { - std::wcerr << L"OpenGL interface: wglMakeCurrent() failed. " << aMsgBuff << L" (" << int(anErrorCode) << L")\n"; + aMsg += (Standard_ExtString )aMsgBuff; LocalFree (aMsgBuff); } - else - { - std::wcerr << L"OpenGL interface: wglMakeCurrent() failed with #" << int(anErrorCode) << L" error code\n"; - } + PushMessage (GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB, GL_DEBUG_TYPE_ERROR_ARB, (unsigned int )anErrorCode, GL_DEBUG_SEVERITY_HIGH_ARB, aMsg); return Standard_False; } #else @@ -262,7 +273,8 @@ Standard_Boolean OpenGl_Context::MakeCurrent() if (!glXMakeCurrent ((Display* )myDisplay, (GLXDrawable )myWindow, (GLXContext )myGContext)) { // if there is no current context it might be impossible to use glGetError() correctly - //std::cerr << "glXMakeCurrent() failed!\n"; + PushMessage (GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB, GL_DEBUG_TYPE_ERROR_ARB, 0, GL_DEBUG_SEVERITY_HIGH_ARB, + "glXMakeCurrent() has failed!"); return Standard_False; } #endif @@ -340,7 +352,7 @@ Standard_Boolean OpenGl_Context::CheckExtension (const char* theExtName) const const char* anExtString = (const char* )glGetString (GL_EXTENSIONS); if (anExtString == NULL) { - std::cerr << "glGetString (GL_EXTENSIONS) returns NULL! No GL context?\n"; + Messanger()->Send ("TKOpenGL: glGetString (GL_EXTENSIONS) has returned NULL! No GL context?", Message_Warning); return Standard_False; } return CheckExtension (anExtString, theExtName); @@ -540,35 +552,50 @@ void OpenGl_Context::readGlVersion() static Standard_CString THE_DBGMSG_UNKNOWN = "UNKNOWN"; static Standard_CString THE_DBGMSG_SOURCES[] = { - "OpenGL", // GL_DEBUG_SOURCE_API_ARB - "Window System", // GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB - "Shader Compiler", // GL_DEBUG_SOURCE_SHADER_COMPILER_ARB - "Third Party", // GL_DEBUG_SOURCE_THIRD_PARTY_ARB - "Application", // GL_DEBUG_SOURCE_APPLICATION_ARB - "Other" // GL_DEBUG_SOURCE_OTHER_ARB + ".OpenGL", // GL_DEBUG_SOURCE_API_ARB + ".WinSystem", // GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB + ".GLSL", // GL_DEBUG_SOURCE_SHADER_COMPILER_ARB + ".3rdParty", // GL_DEBUG_SOURCE_THIRD_PARTY_ARB + "", // GL_DEBUG_SOURCE_APPLICATION_ARB + ".Other" // GL_DEBUG_SOURCE_OTHER_ARB }; static Standard_CString THE_DBGMSG_TYPES[] = { - "Error", // GL_DEBUG_TYPE_ERROR_ARB - "Deprecated", // GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB - "Undefined behavior", // GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB - "Portability", // GL_DEBUG_TYPE_PORTABILITY_ARB - "Performance", // GL_DEBUG_TYPE_PERFORMANCE_ARB - "Other" // GL_DEBUG_TYPE_OTHER_ARB + "Error", // GL_DEBUG_TYPE_ERROR_ARB + "Deprecated", // GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB + "Undef. behavior", // GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB + "Portability", // GL_DEBUG_TYPE_PORTABILITY_ARB + "Performance", // GL_DEBUG_TYPE_PERFORMANCE_ARB + "Other" // GL_DEBUG_TYPE_OTHER_ARB }; static Standard_CString THE_DBGMSG_SEV_HIGH = "High"; // GL_DEBUG_SEVERITY_HIGH_ARB static Standard_CString THE_DBGMSG_SEV_MEDIUM = "Medium"; // GL_DEBUG_SEVERITY_MEDIUM_ARB static Standard_CString THE_DBGMSG_SEV_LOW = "Low"; // GL_DEBUG_SEVERITY_LOW_ARB +//! Callback for GL_ARB_debug_output extension static void APIENTRY debugCallbackWrap(unsigned int theSource, unsigned int theType, unsigned int theId, unsigned int theSeverity, int /*theLength*/, const char* theMessage, - void* /*theUserParam*/) + void* theUserParam) +{ + OpenGl_Context* aCtx = (OpenGl_Context* )theUserParam; + aCtx->PushMessage (theSource, theType, theId, theSeverity, theMessage); +} + +// ======================================================================= +// function : PushMessage +// purpose : +// ======================================================================= +void OpenGl_Context::PushMessage (const unsigned int theSource, + const unsigned int theType, + const unsigned int theId, + const unsigned int theSeverity, + const TCollection_ExtendedString& theMessage) { //OpenGl_Context* aCtx = (OpenGl_Context* )theUserParam; Standard_CString& aSrc = (theSource >= GL_DEBUG_SOURCE_API_ARB @@ -584,11 +611,21 @@ static void APIENTRY debugCallbackWrap(unsigned int theSource, : (theSeverity == GL_DEBUG_SEVERITY_MEDIUM_ARB ? THE_DBGMSG_SEV_MEDIUM : THE_DBGMSG_SEV_LOW); - std::cerr << "Source:" << aSrc - << " | Type:" << aType - << " | ID:" << theId - << " | Severity:" << aSev - << " | Message:\n " << theMessage << "\n"; + Message_Gravity aGrav = theSeverity == GL_DEBUG_SEVERITY_HIGH_ARB + ? Message_Alarm + : (theSeverity == GL_DEBUG_SEVERITY_MEDIUM_ARB + ? Message_Warning + : Message_Info); + + TCollection_ExtendedString aMsg; + aMsg += "TKOpenGl"; aMsg += aSrc; + aMsg += " | Type: "; aMsg += aType; + aMsg += " | ID: "; aMsg += (Standard_Integer )theId; + aMsg += " | Severity: "; aMsg += aSev; + aMsg += " | Message:\n "; + aMsg += theMessage; + + Messanger()->Send (aMsg, aGrav); } // ======================================================================= diff --git a/src/OpenGl/OpenGl_Context.hxx b/src/OpenGl/OpenGl_Context.hxx index 52fc99907f..a52bb6f64b 100644 --- a/src/OpenGl/OpenGl_Context.hxx +++ b/src/OpenGl/OpenGl_Context.hxx @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -260,6 +261,26 @@ public: //! @return value for GL_MAX_CLIP_PLANES Standard_EXPORT Standard_Integer MaxClipPlanes() const; +public: + + //! @return messanger instance + inline const Handle_Message_Messenger& Messanger() const + { + return Message::DefaultMessenger(); + } + + //! Callback for GL_ARB_debug_output extension + //! @param theSource message source within GL_DEBUG_SOURCE_ enumeration + //! @param theType message type within GL_DEBUG_TYPE_ enumeration + //! @param theId message ID within source + //! @param theSeverity message severity within GL_DEBUG_SEVERITY_ enumeration + //! @param theMessage the message itself + Standard_EXPORT void PushMessage (const unsigned int theSource, + const unsigned int theType, + const unsigned int theId, + const unsigned int theSeverity, + const TCollection_ExtendedString& theMessage); + private: //! Wrapper to system function to retrieve GL function pointer by name. @@ -334,7 +355,6 @@ private: // context info Standard_Boolean myIsFeedback; //!< flag indicates GL_FEEDBACK mode Standard_Boolean myIsInitialized; //!< flag indicates initialization state - private: //! Copying allowed only within Handles diff --git a/src/OpenGl/OpenGl_Font.cxx b/src/OpenGl/OpenGl_Font.cxx index 3f1736c9a9..34e1fb79f8 100644 --- a/src/OpenGl/OpenGl_Font.cxx +++ b/src/OpenGl/OpenGl_Font.cxx @@ -21,6 +21,7 @@ #include #include +#include IMPLEMENT_STANDARD_HANDLE (OpenGl_Font, OpenGl_Resource) IMPLEMENT_STANDARD_RTTIEXT(OpenGl_Font, OpenGl_Resource) @@ -123,6 +124,13 @@ bool OpenGl_Font::createTexture (const Handle(OpenGl_Context)& theCtx) if (!aBlackImg.InitZero (Image_PixMap::ImgGray, Standard_Size(aTextureSizeX), Standard_Size(aTextureSizeY)) || !aTexture->Init (theCtx, aBlackImg, Graphic3d_TOT_2D)) // myTextureFormat { + TCollection_ExtendedString aMsg; + aMsg += "New texture intialization of size "; + aMsg += aTextureSizeX; + aMsg += "x"; + aMsg += aTextureSizeY; + aMsg += " for textured font has failed."; + theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB, GL_DEBUG_TYPE_ERROR_ARB, 0, GL_DEBUG_SEVERITY_HIGH_ARB, aMsg); return false; } diff --git a/src/OpenGl/OpenGl_PrimitiveArray.cxx b/src/OpenGl/OpenGl_PrimitiveArray.cxx index 396258df3d..415f02a6d0 100755 --- a/src/OpenGl/OpenGl_PrimitiveArray.cxx +++ b/src/OpenGl/OpenGl_PrimitiveArray.cxx @@ -706,7 +706,14 @@ void OpenGl_PrimitiveArray::Render (const Handle(OpenGl_Workspace)& theWorkspace && aCtx->core15 != NULL && (myDrawMode != GL_POINTS || anAspectMarker->Sprite().IsNull() || !anAspectMarker->Sprite()->IsDisplayList())) { - BuildVBO (theWorkspace); + if (!BuildVBO (theWorkspace)) + { + TCollection_ExtendedString aMsg; + aMsg += "VBO creation for Primitive Array has failed for "; + aMsg += myPArray->num_vertexs; + aMsg += " vertices. Out of memory?"; + aCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB, GL_DEBUG_TYPE_PERFORMANCE_ARB, 0, GL_DEBUG_SEVERITY_LOW_ARB, aMsg); + } myIsVboInit = Standard_True; }