diff options
author | apatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-07 01:42:39 +0000 |
---|---|---|
committer | apatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-07 01:42:39 +0000 |
commit | 23f4656795c66df22e9c8157117a19364ea38cdd (patch) | |
tree | 8dc19289f388e5ca116885a5015b58e65a8175c6 | |
parent | 1629811b5dfecd03a2f3c26a67ef44e5fa7c4e40 (diff) | |
download | chromium_src-23f4656795c66df22e9c8157117a19364ea38cdd.zip chromium_src-23f4656795c66df22e9c8157117a19364ea38cdd.tar.gz chromium_src-23f4656795c66df22e9c8157117a19364ea38cdd.tar.bz2 |
Preload D3DX DLLs before ANGLE is loaded.
This is in case they are not in the DLL search path. It tries the default search path first in case D3DX is installed in the regular place. If that fails then it uses an absolute path to where Chrome installs them.
I moved the call to SetErrorMode to be before ANGLE is loaded. Without this, a failing call to LoadLibrary would result in the display of a dialog box.
This is dependent on http://codereview.chromium.org/7831021.
BUG=69610
Review URL: http://codereview.chromium.org/7792078
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@99892 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | content/gpu/gpu_main.cc | 26 | ||||
-rw-r--r-- | ui/gfx/gl/gl_implementation_win.cc | 33 |
2 files changed, 45 insertions, 14 deletions
diff --git a/content/gpu/gpu_main.cc b/content/gpu/gpu_main.cc index 79ca7c4..198af14 100644 --- a/content/gpu/gpu_main.cc +++ b/content/gpu/gpu_main.cc @@ -41,6 +41,19 @@ int GpuMain(const MainFunctionParams& parameters) { ChildProcess::WaitForDebugger("Gpu"); } + if (!command_line.HasSwitch(switches::kSingleProcess)) { +#if defined(OS_WIN) + // Prevent Windows from displaying a modal dialog on failures like not being + // able to load a DLL. + SetErrorMode( + SEM_FAILCRITICALERRORS | + SEM_NOGPFAULTERRORBOX | + SEM_NOOPENFILEERRORBOX); +#elif defined(USE_X11) + ui::SetDefaultX11ErrorHandlers(); +#endif + } + // Initialization of the OpenGL bindings may fail, in which case we // will need to tear down this process. However, we can not do so // safely until the IPC channel is set up, because the detection of @@ -92,19 +105,6 @@ int GpuMain(const MainFunctionParams& parameters) { MessageLoop main_message_loop(message_loop_type); base::PlatformThread::SetName("CrGpuMain"); - if (!command_line.HasSwitch(switches::kSingleProcess)) { -#if defined(OS_WIN) - // Prevent Windows from displaying a modal dialog on failures like not being - // able to load a DLL. - SetErrorMode( - SEM_FAILCRITICALERRORS | - SEM_NOGPFAULTERRORBOX | - SEM_NOOPENFILEERRORBOX); -#elif defined(USE_X11) - ui::SetDefaultX11ErrorHandlers(); -#endif - } - GpuProcess gpu_process; GpuChildThread* child_thread = new GpuChildThread(dead_on_arrival); diff --git a/ui/gfx/gl/gl_implementation_win.cc b/ui/gfx/gl/gl_implementation_win.cc index 4d6fff7..88d0399 100644 --- a/ui/gfx/gl/gl_implementation_win.cc +++ b/ui/gfx/gl/gl_implementation_win.cc @@ -2,13 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <d3dx9.h> + #include <vector> +#include "base/at_exit.h" #include "base/base_paths.h" +#include "base/bind.h" #include "base/file_path.h" #include "base/logging.h" #include "base/native_library.h" #include "base/path_service.h" +#include "base/stringprintf.h" #include "ui/gfx/gl/gl_bindings.h" #include "ui/gfx/gl/gl_implementation.h" @@ -29,6 +34,23 @@ void GL_BINDING_CALL MarshalDepthRangeToDepthRangef(GLclampd z_near, glDepthRangef(static_cast<GLclampf>(z_near), static_cast<GLclampf>(z_far)); } +bool LoadD3DXLibrary(const FilePath& module_path, + const FilePath::StringType& name) { + base::NativeLibrary library = base::LoadNativeLibrary(FilePath(name), NULL); + if (!library) { + library = base::LoadNativeLibrary(module_path.Append(name), NULL); + if (!library) { + VLOG(1) << name << " not found."; + return false; + } + } + + base::AtExitManager::RegisterTask( + base::Bind(base::UnloadNativeLibrary, library)); + + return true; +} + } // namespace anonymous bool InitializeGLBindings(GLImplementation implementation) { @@ -83,9 +105,18 @@ bool InitializeGLBindings(GLImplementation implementation) { SetupSoftwareRenderer(); #endif + // Attempt to load D3DX and its dependencies using the default search path + // and if that fails, using an absolute path. This is to ensure these DLLs + // are loaded before ANGLE is loaded in case they are not in the default + // search path. + LoadD3DXLibrary(module_path, base::StringPrintf(L"d3dcompiler_%d.dll", + D3DX_SDK_VERSION)); + LoadD3DXLibrary(module_path, base::StringPrintf(L"d3dx9_%d.dll", + D3DX_SDK_VERSION)); + // Load libglesv2.dll before libegl.dll because the latter is dependent on // the former and if there is another version of libglesv2.dll in the dll - // search path, it will get loaded. + // search path, it will get loaded instead. base::NativeLibrary gles_library = base::LoadNativeLibrary( module_path.Append(L"libglesv2.dll"), NULL); if (!gles_library) { |