diff Framework/OpenGL/OpenGLShader.cpp @ 947:1091b2adeb5a toa2019081001

Fixed animation frame stopping when returning false + big work on the OpenGL objects to make them lost context-safe + debug code to forcefully tag a context as lost + debug macros
author Benjamin Golinvaux <bgo@osimis.io>
date Sat, 10 Aug 2019 13:07:31 +0200
parents 58e1faeafb1b
children a7351ad54960
line wrap: on
line diff
--- a/Framework/OpenGL/OpenGLShader.cpp	Tue Aug 06 15:07:23 2019 +0200
+++ b/Framework/OpenGL/OpenGLShader.cpp	Sat Aug 10 13:07:31 2019 +0200
@@ -37,6 +37,7 @@
       sourceString[0] = source.c_str();
       sourceStringLengths[0] = static_cast<GLint>(source.length());
       GLuint shader = glCreateShader(type);
+      ORTHANC_OPENGL_CHECK("glCreateShader");
 
       if (shader == 0)
       {
@@ -47,18 +48,24 @@
       {
         // Assign and compile the source to the shader object
         glShaderSource(shader, 1, sourceString, sourceStringLengths);
+        ORTHANC_OPENGL_CHECK("glShaderSource");
         glCompileShader(shader);
+        ORTHANC_OPENGL_CHECK("glCompileShader");
 
         // Check if there were errors
         int infoLen = 0;
         glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
+        ORTHANC_OPENGL_CHECK("glGetShaderiv");
 
         if (infoLen > 1)  // Might be equal to 1, which amounts to no error
         {
           std::string infoLog;
           infoLog.resize(infoLen + 1);
           glGetShaderInfoLog(shader, infoLen, NULL, &infoLog[0]);
+          ORTHANC_OPENGL_CHECK("glGetShaderInfoLog");
+          ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT("About to call glDeleteShader");
           glDeleteShader(shader);
+          ORTHANC_OPENGL_CHECK("glDeleteShader");
 
           throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError,
                                           "Error while creating an OpenGL shader: " + infoLog);
@@ -81,13 +88,36 @@
     
     OpenGLShader::~OpenGLShader()
     {
-      if (isValid_)
+      try
+      {
+        if (isValid_)
+        {
+          ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT("About to call glDeleteShader");
+          glDeleteShader(shader_);
+          ORTHANC_OPENGL_CHECK("glDeleteShader");
+        }
+      }
+      catch (const Orthanc::OrthancException& e)
       {
-        glDeleteShader(shader_);
+        if (e.HasDetails())
+        {
+          LOG(ERROR) << "OrthancException in ~OpenGLShader: " << e.What() << " Details: " << e.GetDetails();
+        }
+        else
+        {
+          LOG(ERROR) << "OrthancException in ~OpenGLShader: " << e.What();
+        }
+      }
+      catch (const std::exception& e)
+      {
+        LOG(ERROR) << "std::exception in ~OpenGLShader: " << e.what();
+      }
+      catch (...)
+      {
+        LOG(ERROR) << "Unknown exception in ~OpenGLShader";
       }
     }
 
-
     GLuint OpenGLShader::Release()
     {
       if (isValid_)