summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/gpu/gpu_main.cc26
-rw-r--r--ui/gfx/gl/gl_implementation_win.cc33
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) {