blob: 3d143532b61dce2c4755216ba25cea92ef4fdc80 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "gpu/ipc/in_process_gpu_thread_holder.h"
#include "base/bind.h"
#include "base/command_line.h"
#include "base/synchronization/waitable_event.h"
#include "base/threading/thread_task_runner_handle.h"
#include "gpu/command_buffer/service/mailbox_manager_factory.h"
#include "gpu/command_buffer/service/scheduler.h"
#include "gpu/command_buffer/service/service_utils.h"
#include "gpu/command_buffer/service/shared_image_manager.h"
#include "gpu/command_buffer/service/sync_point_manager.h"
#include "gpu/config/gpu_info_collector.h"
#include "gpu/config/gpu_util.h"
#include "gpu/ipc/gpu_in_process_thread_service.h"
namespace gpu {
InProcessGpuThreadHolder::InProcessGpuThreadHolder()
: base::Thread("GpuThread") {
DCHECK(base::CommandLine::InitializedForCurrentProcess());
auto* command_line = base::CommandLine::ForCurrentProcess();
gpu_preferences_ = gles2::ParseGpuPreferences(command_line);
gpu::GPUInfo gpu_info;
gpu::CollectGraphicsInfoForTesting(&gpu_info);
gpu::GpuFeatureInfo gpu_feature_info = gpu::ComputeGpuFeatureInfo(
gpu_info, gpu_preferences_, command_line, nullptr);
Start();
}
InProcessGpuThreadHolder::~InProcessGpuThreadHolder() {
// Ensure members created on GPU thread are destroyed there too.
task_runner()->PostTask(
FROM_HERE, base::BindOnce(&InProcessGpuThreadHolder::DeleteOnGpuThread,
base::Unretained(this)));
Stop();
}
GpuPreferences* InProcessGpuThreadHolder::GetGpuPreferences() {
DCHECK(!task_executor_);
return &gpu_preferences_;
}
GpuFeatureInfo* InProcessGpuThreadHolder::GetGpuFeatureInfo() {
DCHECK(!task_executor_);
return &gpu_feature_info_;
}
scoped_refptr<CommandBufferTaskExecutor>
InProcessGpuThreadHolder::GetTaskExecutor() {
if (!task_executor_) {
base::WaitableEvent completion;
task_runner()->PostTask(
FROM_HERE,
base::BindOnce(&InProcessGpuThreadHolder::InitializeOnGpuThread,
base::Unretained(this), &completion));
completion.Wait();
}
return task_executor_;
}
void InProcessGpuThreadHolder::InitializeOnGpuThread(
base::WaitableEvent* completion) {
sync_point_manager_ = std::make_unique<SyncPointManager>();
scheduler_ =
std::make_unique<Scheduler>(task_runner(), sync_point_manager_.get());
mailbox_manager_ = gles2::CreateMailboxManager(gpu_preferences_);
shared_image_manager_ = std::make_unique<SharedImageManager>();
task_executor_ = base::MakeRefCounted<GpuInProcessThreadService>(
task_runner(), scheduler_.get(), sync_point_manager_.get(),
mailbox_manager_.get(), nullptr, gl::GLSurfaceFormat(), gpu_feature_info_,
gpu_preferences_, shared_image_manager_.get(), nullptr);
completion->Signal();
}
void InProcessGpuThreadHolder::DeleteOnGpuThread() {
task_executor_.reset();
scheduler_.reset();
sync_point_manager_.reset();
shared_image_manager_.reset();
}
} // namespace gpu