diff Framework/OpenGL/OpenGLProgram.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 fadacfbf5538
children 6a9300ecfa13
line wrap: on
line diff
--- a/Framework/OpenGL/OpenGLProgram.cpp	Tue Aug 06 15:07:23 2019 +0200
+++ b/Framework/OpenGL/OpenGLProgram.cpp	Sat Aug 10 13:07:31 2019 +0200
@@ -22,17 +22,19 @@
 #include "OpenGLProgram.h"
 
 #include "OpenGLShader.h"
+#include "IOpenGLContext.h"
 
 #include <Core/OrthancException.h>
 
-
 namespace OrthancStone
 {
   namespace OpenGL
   {
-    OpenGLProgram::OpenGLProgram()
+    OpenGLProgram::OpenGLProgram(OpenGL::IOpenGLContext& context)
+      : context_(context)
     {
       program_ = glCreateProgram();
+      ORTHANC_OPENGL_CHECK("glCreateProgram");
       if (program_ == 0)
       {
         throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError,
@@ -43,17 +45,45 @@
 
     OpenGLProgram::~OpenGLProgram()
     {
-      assert(program_ != 0);
-      glDeleteProgram(program_);
+      try
+      {
+        if (!context_.IsContextLost())
+        {
+          ORTHANC_CHECK_CURRENT_CONTEXT(context_);
+          ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT("About to call glDeleteProgram");
+          assert(program_ != 0);
+          glDeleteProgram(program_);
+          ORTHANC_OPENGL_CHECK("glDeleteProgram");
+        }
+      }
+      catch (const Orthanc::OrthancException& e)
+      {
+        if (e.HasDetails())
+        {
+          LOG(ERROR) << "OrthancException in ~OpenGLProgram: " << e.What() << " Details: " << e.GetDetails();
+        }
+        else
+        {
+          LOG(ERROR) << "OrthancException in ~OpenGLProgram: " << e.What();
+        }
+      }
+      catch (const std::exception& e)
+      {
+        LOG(ERROR) << "std::exception in ~OpenGLProgram: " << e.what();
+      }
+      catch (...)
+      {
+        LOG(ERROR) << "Unknown exception in ~OpenGLProgram";
+      }
     }
 
-
     void OpenGLProgram::Use()
     {
+      //ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT("About to call glUseProgram");
       glUseProgram(program_);
+      ORTHANC_OPENGL_CHECK("glUseProgram");
     }
-
-    
+        
     void OpenGLProgram::CompileShaders(const std::string& vertexCode,
                                        const std::string& fragmentCode)
     {
@@ -63,15 +93,19 @@
       OpenGLShader fragmentShader(GL_FRAGMENT_SHADER, fragmentCode);
 
       glAttachShader(program_, vertexShader.Release());
+      ORTHANC_OPENGL_CHECK("glAttachShader");
       glAttachShader(program_, fragmentShader.Release());
+      ORTHANC_OPENGL_CHECK("glAttachShader");
       glLinkProgram(program_);
+      ORTHANC_OPENGL_CHECK("glLinkProgram");
       glValidateProgram(program_);
+      ORTHANC_OPENGL_CHECK("glValidateProgram");
     }
 
-
     GLint OpenGLProgram::GetUniformLocation(const std::string& name)
     { 
       GLint location = glGetUniformLocation(program_, name.c_str());
+      ORTHANC_OPENGL_CHECK("glGetUniformLocation");
 
       if (location == -1)
       {
@@ -88,6 +122,7 @@
     GLint OpenGLProgram::GetAttributeLocation(const std::string& name)
     { 
       GLint location = glGetAttribLocation(program_, name.c_str());
+      ORTHANC_OPENGL_CHECK("glGetAttribLocation");
 
       if (location == -1)
       {