From a71a8c66609d6f090b8399bc6c7c52178c83f05a Mon Sep 17 00:00:00 2001 From: Clemen Deng Date: Thu, 4 Jul 2019 09:42:31 -0400 Subject: [PATCH] ANGLE tests loading wrong opengl32.dll ANGLE tests try to load opengl32.dll from ANGLE directory instead of system Bug: angleproject:3645 Change-Id: I3a8cea37252d13e915ff54ae6bbac920db16e4c4 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1688544 Commit-Queue: Clemen Deng Reviewed-by: Jamie Madill Reviewed-by: Geoff Lang --- samples/sample_util/SampleApplication.cpp | 3 ++- src/common/system_utils.h | 10 +++++++++- src/common/system_utils_posix.cpp | 2 +- src/common/system_utils_win.cpp | 16 ++++++++++++---- src/libEGL/libEGL.cpp | 3 ++- src/tests/gl_tests/ProgramBinaryTest.cpp | 3 ++- src/tests/perf_tests/ANGLEPerfTest.cpp | 6 ++++-- src/tests/perf_tests/EGLMakeCurrentPerf.cpp | 3 ++- src/tests/test_utils/ANGLETest.cpp | 4 ++-- src/tests/test_utils/angle_test_instantiate.cpp | 6 ++++-- 10 files changed, 40 insertions(+), 16 deletions(-) diff --git a/samples/sample_util/SampleApplication.cpp b/samples/sample_util/SampleApplication.cpp index 7a7f4589b..382ca74a3 100644 --- a/samples/sample_util/SampleApplication.cpp +++ b/samples/sample_util/SampleApplication.cpp @@ -64,7 +64,8 @@ SampleApplication::SampleApplication(std::string name, } // Load EGL library so we can initialize the display. - mEntryPointsLib.reset(angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME)); + mEntryPointsLib.reset( + angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME, angle::SearchType::ApplicationDir)); mEGLWindow = EGLWindow::New(glesMajorVersion, glesMinorVersion); mTimer.reset(CreateTimer()); diff --git a/src/common/system_utils.h b/src/common/system_utils.h index f589e937f..0ea4959d0 100644 --- a/src/common/system_utils.h +++ b/src/common/system_utils.h @@ -51,7 +51,15 @@ class Library : angle::NonCopyable } }; -Library *OpenSharedLibrary(const char *libraryName); +// Use SYSTEM_DIR to bypass loading ANGLE libraries with the same name as system DLLS +// (e.g. opengl32.dll) +enum class SearchType +{ + ApplicationDir, + SystemDir +}; + +Library *OpenSharedLibrary(const char *libraryName, SearchType searchType); // Returns true if the process is currently being debugged. bool IsDebuggerAttached(); diff --git a/src/common/system_utils_posix.cpp b/src/common/system_utils_posix.cpp index aa9a1015a..26501eb2a 100644 --- a/src/common/system_utils_posix.cpp +++ b/src/common/system_utils_posix.cpp @@ -248,7 +248,7 @@ class PosixLibrary : public Library void *mModule = nullptr; }; -Library *OpenSharedLibrary(const char *libraryName) +Library *OpenSharedLibrary(const char *libraryName, SearchType searchType) { return new PosixLibrary(libraryName); } diff --git a/src/common/system_utils_win.cpp b/src/common/system_utils_win.cpp index 8c5a821ab..796e92819 100644 --- a/src/common/system_utils_win.cpp +++ b/src/common/system_utils_win.cpp @@ -245,13 +245,21 @@ bool RunApp(const std::vector &args, class Win32Library : public Library { public: - Win32Library(const char *libraryName) + Win32Library(const char *libraryName, SearchType searchType) { char buffer[MAX_PATH]; int ret = snprintf(buffer, MAX_PATH, "%s.%s", libraryName, GetSharedLibraryExtension()); if (ret > 0 && ret < MAX_PATH) { - mModule = LoadLibraryA(buffer); + switch (searchType) + { + case SearchType::ApplicationDir: + mModule = LoadLibraryA(buffer); + break; + case SearchType::SystemDir: + mModule = LoadLibraryExA(buffer, nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32); + break; + } } } @@ -279,9 +287,9 @@ class Win32Library : public Library HMODULE mModule = nullptr; }; -Library *OpenSharedLibrary(const char *libraryName) +Library *OpenSharedLibrary(const char *libraryName, SearchType searchType) { - return new Win32Library(libraryName); + return new Win32Library(libraryName, searchType); } bool IsDirectory(const char *filename) diff --git a/src/libEGL/libEGL.cpp b/src/libEGL/libEGL.cpp index 3dfb9106c..40c2156cc 100644 --- a/src/libEGL/libEGL.cpp +++ b/src/libEGL/libEGL.cpp @@ -33,7 +33,8 @@ void EnsureEGLLoaded() if (gLoaded) return; - gEntryPointsLib.reset(angle::OpenSharedLibrary(ANGLE_GLESV2_LIBRARY_NAME)); + gEntryPointsLib.reset( + angle::OpenSharedLibrary(ANGLE_GLESV2_LIBRARY_NAME, angle::SearchType::ApplicationDir)); angle::LoadEGL_EGL(GlobalLoad); if (!EGL_GetPlatformDisplay) { diff --git a/src/tests/gl_tests/ProgramBinaryTest.cpp b/src/tests/gl_tests/ProgramBinaryTest.cpp index b955182f7..e62118bb9 100644 --- a/src/tests/gl_tests/ProgramBinaryTest.cpp +++ b/src/tests/gl_tests/ProgramBinaryTest.cpp @@ -731,7 +731,8 @@ class ProgramBinariesAcrossPlatforms : public testing::TestWithParaminitialize("EGLMakeCurrent Test", 64, 64); - mEGLLibrary.reset(angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME)); + mEGLLibrary.reset( + angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME, angle::SearchType::ApplicationDir)); angle::LoadProc getProc = reinterpret_cast(mEGLLibrary->getSymbol("eglGetProcAddress")); diff --git a/src/tests/test_utils/ANGLETest.cpp b/src/tests/test_utils/ANGLETest.cpp index 4c8db5d99..25a6b400c 100644 --- a/src/tests/test_utils/ANGLETest.cpp +++ b/src/tests/test_utils/ANGLETest.cpp @@ -1340,7 +1340,7 @@ Library *ANGLETestEnvironment::GetEGLLibrary() #if defined(ANGLE_USE_UTIL_LOADER) if (!gEGLLibrary) { - gEGLLibrary.reset(OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME)); + gEGLLibrary.reset(OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME, SearchType::ApplicationDir)); } #endif // defined(ANGLE_USE_UTIL_LOADER) return gEGLLibrary.get(); @@ -1351,7 +1351,7 @@ Library *ANGLETestEnvironment::GetWGLLibrary() #if defined(ANGLE_USE_UTIL_LOADER) && defined(ANGLE_PLATFORM_WINDOWS) if (!gWGLLibrary) { - gWGLLibrary.reset(OpenSharedLibrary("opengl32")); + gWGLLibrary.reset(OpenSharedLibrary("opengl32", SearchType::SystemDir)); } #endif // defined(ANGLE_USE_UTIL_LOADER) && defined(ANGLE_PLATFORM_WINDOWS) return gWGLLibrary.get(); diff --git a/src/tests/test_utils/angle_test_instantiate.cpp b/src/tests/test_utils/angle_test_instantiate.cpp index 64b0b2351..9aa673397 100644 --- a/src/tests/test_utils/angle_test_instantiate.cpp +++ b/src/tests/test_utils/angle_test_instantiate.cpp @@ -33,7 +33,8 @@ bool IsANGLEConfigSupported(const PlatformParameters ¶m, OSWindow *osWindow) std::unique_ptr eglLibrary; #if defined(ANGLE_USE_UTIL_LOADER) - eglLibrary.reset(angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME)); + eglLibrary.reset( + angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME, angle::SearchType::ApplicationDir)); #endif EGLWindow *eglWindow = EGLWindow::New(param.majorVersion, param.minorVersion); @@ -48,7 +49,8 @@ bool IsANGLEConfigSupported(const PlatformParameters ¶m, OSWindow *osWindow) bool IsWGLConfigSupported(const PlatformParameters ¶m, OSWindow *osWindow) { #if defined(ANGLE_PLATFORM_WINDOWS) && defined(ANGLE_USE_UTIL_LOADER) - std::unique_ptr openglLibrary(angle::OpenSharedLibrary("opengl32")); + std::unique_ptr openglLibrary( + angle::OpenSharedLibrary("opengl32", angle::SearchType::SystemDir)); WGLWindow *wglWindow = WGLWindow::New(param.majorVersion, param.minorVersion); ConfigParameters configParams;