diff options
-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) { |