| Index: content/browser/browser_main_loop.cc
|
| diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc
|
| index bbd8dd6992878c1d82fce50e13a7ebe5b62b03ad..df9c13aff6bd321822d5a47dffe0c22112fcdd06 100644
|
| --- a/content/browser/browser_main_loop.cc
|
| +++ b/content/browser/browser_main_loop.cc
|
| @@ -71,6 +71,7 @@
|
| #include "content/common/mojo/mojo_shell_connection_impl.h"
|
| #include "content/public/browser/browser_main_parts.h"
|
| #include "content/public/browser/content_browser_client.h"
|
| +#include "content/public/browser/gpu_data_manager_observer.h"
|
| #include "content/public/browser/render_process_host.h"
|
| #include "content/public/browser/tracing_controller.h"
|
| #include "content/public/common/content_client.h"
|
| @@ -184,7 +185,6 @@
|
| #include "gpu/config/gpu_driver_bug_workaround_type.h"
|
| #include "ui/base/x/x11_util_internal.h" // nogncheck
|
| #include "ui/gfx/x/x11_connection.h" // nogncheck
|
| -#include "ui/gfx/x/x11_switches.h" // nogncheck
|
| #include "ui/gfx/x/x11_types.h" // nogncheck
|
| #endif
|
|
|
| @@ -365,6 +365,44 @@ base::win::MemoryPressureMonitor* CreateWinMemoryPressureMonitor(
|
|
|
| } // namespace
|
|
|
| +#if defined(USE_X11) && !defined(OS_CHROMEOS)
|
| +namespace internal {
|
| +
|
| +// Forwards GPUInfo updates to ui::XVisualManager
|
| +class GpuDataManagerVisualProxy : public GpuDataManagerObserver {
|
| + public:
|
| + explicit GpuDataManagerVisualProxy(GpuDataManagerImpl* gpu_data_manager)
|
| + : gpu_data_manager_(gpu_data_manager) {
|
| + gpu_data_manager_->AddObserver(this);
|
| + }
|
| +
|
| + ~GpuDataManagerVisualProxy() override {
|
| + gpu_data_manager_->RemoveObserver(this);
|
| + }
|
| +
|
| + void OnGpuInfoUpdate() override {
|
| + gpu::GPUInfo gpu_info = gpu_data_manager_->GetGPUInfo();
|
| + if (!ui::XVisualManager::GetInstance()->OnGPUInfoChanged(
|
| + gpu_info.software_rendering ||
|
| + !gpu_data_manager_->GpuAccessAllowed(nullptr),
|
| + gpu_info.system_visual, gpu_info.rgba_visual)) {
|
| + // The GPU process sent back bad visuals, which should never happen.
|
| + auto* gpu_process_host = GpuProcessHost::Get(
|
| + GpuProcessHost::GPU_PROCESS_KIND_SANDBOXED, false);
|
| + if (gpu_process_host)
|
| + gpu_process_host->ForceShutdown();
|
| + }
|
| + }
|
| +
|
| + private:
|
| + GpuDataManagerImpl* gpu_data_manager_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(GpuDataManagerVisualProxy);
|
| +};
|
| +
|
| +} // namespace internal
|
| +#endif
|
| +
|
| // The currently-running BrowserMainLoop. There can be one or zero.
|
| BrowserMainLoop* g_current_browser_main_loop = NULL;
|
|
|
| @@ -746,30 +784,12 @@ int BrowserMainLoop::PreCreateThreads() {
|
| // It's unsafe to append the gpu command line switches to the global
|
| // CommandLine::ForCurrentProcess object after threads are created.
|
| // 2) Must be after parts_->PreCreateThreads to pick up chrome://flags.
|
| - GpuDataManagerImpl::GetInstance()->Initialize();
|
| + GpuDataManagerImpl* gpu_data_manager = GpuDataManagerImpl::GetInstance();
|
| + gpu_data_manager->Initialize();
|
|
|
| #if defined(USE_X11) && !defined(OS_CHROMEOS)
|
| - // PreCreateThreads is called before CreateStartupTasks which starts the gpu
|
| - // process.
|
| - bool enable_transparent_visuals =
|
| - !GpuDataManagerImpl::GetInstance()->IsDriverBugWorkaroundActive(
|
| - gpu::DISABLE_TRANSPARENT_VISUALS);
|
| -
|
| - // Prevent this flag to be turned off later since it is only used here.
|
| - if (!enable_transparent_visuals &&
|
| - !GpuDataManagerImpl::GetInstance()->IsCompleteGpuInfoAvailable()) {
|
| - base::CommandLine::ForCurrentProcess()->AppendSwitch(
|
| - "disable_transparent_visuals");
|
| - }
|
| -
|
| - Visual* visual = NULL;
|
| - int depth = 0;
|
| - ui::ChooseVisualForWindow(enable_transparent_visuals, &visual, &depth);
|
| - DCHECK(depth > 0);
|
| - base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
|
| - switches::kWindowDepth, base::IntToString(depth));
|
| - base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
|
| - switches::kX11VisualID, base::UintToString(visual->visualid));
|
| + gpu_data_manager_visual_proxy_.reset(
|
| + new internal::GpuDataManagerVisualProxy(gpu_data_manager));
|
| #endif
|
|
|
| #if !defined(GOOGLE_CHROME_BUILD) || defined(OS_ANDROID)
|
|
|