diff --git a/engine/src/flutter/impeller/BUILD.gn b/engine/src/flutter/impeller/BUILD.gn index 4e9707f467..c89a89f7f3 100644 --- a/engine/src/flutter/impeller/BUILD.gn +++ b/engine/src/flutter/impeller/BUILD.gn @@ -38,10 +38,6 @@ config("impeller_public_config") { defines += [ "IMPELLER_TRACE_ALL_GL_CALLS" ] } - if (impeller_error_check_all_gl_calls) { - defines += [ "IMPELLER_ERROR_CHECK_ALL_GL_CALLS" ] - } - if (is_win) { defines += [ # TODO(dnfield): https://github.com/flutter/flutter/issues/50053 diff --git a/engine/src/flutter/impeller/renderer/backend/gles/proc_table_gles.cc b/engine/src/flutter/impeller/renderer/backend/gles/proc_table_gles.cc index b3c8a8ff43..5a5212ad4c 100644 --- a/engine/src/flutter/impeller/renderer/backend/gles/proc_table_gles.cc +++ b/engine/src/flutter/impeller/renderer/backend/gles/proc_table_gles.cc @@ -32,6 +32,20 @@ const char* GLErrorToString(GLenum value) { return "Unknown."; } +bool GLErrorIsFatal(GLenum value) { + switch (value) { + case GL_NO_ERROR: + return false; + case GL_INVALID_ENUM: + case GL_INVALID_VALUE: + case GL_INVALID_OPERATION: + case GL_INVALID_FRAMEBUFFER_OPERATION: + case GL_OUT_OF_MEMORY: + return true; + } + return false; +} + ProcTableGLES::Resolver WrappedResolver( const ProcTableGLES::Resolver& resolver) { return [resolver](const char* function_name) -> void* { diff --git a/engine/src/flutter/impeller/renderer/backend/gles/proc_table_gles.h b/engine/src/flutter/impeller/renderer/backend/gles/proc_table_gles.h index eac2b77e59..b9b22d3187 100644 --- a/engine/src/flutter/impeller/renderer/backend/gles/proc_table_gles.h +++ b/engine/src/flutter/impeller/renderer/backend/gles/proc_table_gles.h @@ -17,6 +17,7 @@ namespace impeller { const char* GLErrorToString(GLenum value); +bool GLErrorIsFatal(GLenum value); struct AutoErrorCheck { const PFNGLGETERRORPROC error_fn; @@ -28,9 +29,18 @@ struct AutoErrorCheck { ~AutoErrorCheck() { if (error_fn) { auto error = error_fn(); - FML_CHECK(error == GL_NO_ERROR) - << "GL Error " << GLErrorToString(error) << "(" << error << ")" - << " encountered on call to " << name; + if (error == GL_NO_ERROR) { + return; + } + if (GLErrorIsFatal(error)) { + FML_LOG(FATAL) << "Fatal GL Error " << GLErrorToString(error) << "(" + << error << ")" + << " encountered on call to " << name; + } else { + FML_LOG(ERROR) << "GL Error " << GLErrorToString(error) << "(" << error + << ")" + << " encountered on call to " << name; + } } } }; @@ -63,9 +73,9 @@ struct GLProc { /// template auto operator()(Args&&... args) const { -#ifdef IMPELLER_ERROR_CHECK_ALL_GL_CALLS +#ifdef IMPELLER_DEBUG AutoErrorCheck error(error_fn, name); -#endif // IMPELLER_ERROR_CHECK_ALL_GL_CALLS +#endif // IMPELLER_DEBUG #ifdef IMPELLER_TRACE_ALL_GL_CALLS TRACE_EVENT0("impeller", name); #endif // IMPELLER_TRACE_ALL_GL_CALLS diff --git a/engine/src/flutter/impeller/tools/impeller.gni b/engine/src/flutter/impeller/tools/impeller.gni index 65b1f56254..4ec7119240 100644 --- a/engine/src/flutter/impeller/tools/impeller.gni +++ b/engine/src/flutter/impeller/tools/impeller.gni @@ -39,9 +39,6 @@ declare_args() { # overhead may be substantial, this is not enabled by default. impeller_trace_all_gl_calls = false - # Call glGetError after each OpenGL call and log failures. - impeller_error_check_all_gl_calls = is_debug - # Enable experimental 3D scene rendering. impeller_enable_3d = false