Prevent repeatedly trying to load a non-existent library

A hang in Chromium on MacOS seems related to attempting to load
libGLES_CM repeatedly, since it doesn't exist. While dlopen()
probably shouldn't be this slow, it could also be related to a
sandboxing issue. In any case, this cl attempts to go around the
issue by never trying to load a library twice.

Bug chromium:904346

Change-Id: I65122f0fc9acb4f8db2a606437c61796464f72ad
Reviewed-on: https://swiftshader-review.googlesource.com/c/22468
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/libEGL/libEGL.hpp b/src/OpenGL/libEGL/libEGL.hpp
index 7019338..4a95a5f 100644
--- a/src/OpenGL/libEGL/libEGL.hpp
+++ b/src/OpenGL/libEGL/libEGL.hpp
@@ -90,7 +90,7 @@
 private:
 	LibEGLexports *loadExports()
 	{
-		if(!libEGL)
+		if(!loadLibraryAttempted && !libEGL)
 		{
 			#if defined(_WIN32)
 				#if defined(__LP64__)
@@ -126,6 +126,8 @@
 				auto libEGL_swiftshader = (LibEGLexports *(*)())getProcAddress(libEGL, "libEGL_swiftshader");
 				libEGLexports = libEGL_swiftshader();
 			}
+
+			loadLibraryAttempted = true;
 		}
 
 		return libEGLexports;
@@ -133,6 +135,7 @@
 
 	void *libEGL = nullptr;
 	LibEGLexports *libEGLexports = nullptr;
+	bool loadLibraryAttempted = false;
 };
 
 #endif   // libEGL_hpp
diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.hpp b/src/OpenGL/libGLES_CM/libGLES_CM.hpp
index ae6237b..80ce1f2 100644
--- a/src/OpenGL/libGLES_CM/libGLES_CM.hpp
+++ b/src/OpenGL/libGLES_CM/libGLES_CM.hpp
@@ -251,7 +251,7 @@
 private:
 	LibGLES_CMexports *loadExports()
 	{
-		if(!libGLES_CM)
+		if(!loadLibraryAttempted && !libGLES_CM)
 		{
 			#if defined(_WIN32)
 				#if defined(__LP64__)
@@ -287,6 +287,8 @@
 				auto libGLES_CM_swiftshader = (LibGLES_CMexports *(*)())getProcAddress(libGLES_CM, "libGLES_CM_swiftshader");
 				libGLES_CMexports = libGLES_CM_swiftshader();
 			}
+
+			loadLibraryAttempted = true;
 		}
 
 		return libGLES_CMexports;
@@ -294,6 +296,7 @@
 
 	void *libGLES_CM = nullptr;
 	LibGLES_CMexports *libGLES_CMexports = nullptr;
+	bool loadLibraryAttempted = false;
 };
 
 #endif   // libGLES_CM_hpp
diff --git a/src/OpenGL/libGLESv2/libGLESv2.hpp b/src/OpenGL/libGLESv2/libGLESv2.hpp
index f029f38..24d9e92 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.hpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.hpp
@@ -276,7 +276,7 @@
 private:
 	LibGLESv2exports *loadExports()
 	{
-		if(!libGLESv2)
+		if(!loadLibraryAttempted && !libGLESv2)
 		{
 			#if defined(_WIN32)
 				#if defined(__LP64__)
@@ -312,6 +312,8 @@
 				auto libGLESv2_swiftshader = (LibGLESv2exports *(*)())getProcAddress(libGLESv2, "libGLESv2_swiftshader");
 				libGLESv2exports = libGLESv2_swiftshader();
 			}
+
+			loadLibraryAttempted = true;
 		}
 
 		return libGLESv2exports;
@@ -319,6 +321,7 @@
 
 	void *libGLESv2 = nullptr;
 	LibGLESv2exports *libGLESv2exports = nullptr;
+	bool loadLibraryAttempted = false;
 };
 
 #endif   // libGLESv2_hpp