Index: services/ui/common/gpu_service.cc |
diff --git a/services/ui/common/gpu_service.cc b/services/ui/common/gpu_service.cc |
deleted file mode 100644 |
index 8856b7cca80ce62d00ea763537c22e668da7d231..0000000000000000000000000000000000000000 |
--- a/services/ui/common/gpu_service.cc |
+++ /dev/null |
@@ -1,226 +0,0 @@ |
-// Copyright 2016 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 "services/ui/common/gpu_service.h" |
- |
-#include "base/command_line.h" |
-#include "base/memory/singleton.h" |
-#include "base/threading/thread_task_runner_handle.h" |
-#include "build/build_config.h" |
-#include "mojo/public/cpp/bindings/sync_call_restrictions.h" |
-#include "mojo/public/cpp/system/platform_handle.h" |
-#include "services/shell/public/cpp/connector.h" |
-#include "services/ui/common/gpu_type_converters.h" |
-#include "services/ui/common/mojo_gpu_memory_buffer_manager.h" |
-#include "services/ui/common/switches.h" |
-#include "services/ui/public/interfaces/gpu_service.mojom.h" |
- |
-namespace ui { |
- |
-namespace { |
- |
-void PostTask(scoped_refptr<base::SingleThreadTaskRunner> runner, |
- const tracked_objects::Location& from_here, |
- const gpu::GpuChannelEstablishedCallback& callback, |
- scoped_refptr<gpu::GpuChannelHost> established_channel_host) { |
- runner->PostTask(from_here, |
- base::Bind(callback, std::move(established_channel_host))); |
-} |
- |
-} |
- |
-GpuService::GpuService(shell::Connector* connector) |
- : main_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
- connector_(connector), |
- shutdown_event_(base::WaitableEvent::ResetPolicy::AUTOMATIC, |
- base::WaitableEvent::InitialState::NOT_SIGNALED), |
- io_thread_("GPUIOThread"), |
- gpu_memory_buffer_manager_(new MojoGpuMemoryBufferManager), |
- is_establishing_(false), |
- establishing_condition_(&lock_) { |
- DCHECK(main_task_runner_); |
- DCHECK(connector_); |
- base::Thread::Options thread_options(base::MessageLoop::TYPE_IO, 0); |
- thread_options.priority = base::ThreadPriority::NORMAL; |
- CHECK(io_thread_.StartWithOptions(thread_options)); |
-} |
- |
-GpuService::~GpuService() { |
- DCHECK(IsMainThread()); |
- if (gpu_channel_) |
- gpu_channel_->DestroyChannel(); |
-} |
- |
-// static |
-std::unique_ptr<GpuService> GpuService::Initialize( |
- shell::Connector* connector) { |
- return base::WrapUnique(new GpuService(connector)); |
-} |
- |
-void GpuService::EstablishGpuChannel( |
- const gpu::GpuChannelEstablishedCallback& callback) { |
- base::AutoLock auto_lock(lock_); |
- auto runner = base::ThreadTaskRunnerHandle::Get(); |
- scoped_refptr<gpu::GpuChannelHost> channel = GetGpuChannelLocked(); |
- if (channel) { |
- PostTask(runner, FROM_HERE, callback, std::move(channel)); |
- return; |
- } |
- establish_callbacks_.push_back( |
- base::Bind(PostTask, runner, FROM_HERE, callback)); |
- if (!is_establishing_) { |
- is_establishing_ = true; |
- main_task_runner_->PostTask( |
- FROM_HERE, base::Bind(&GpuService::EstablishGpuChannelOnMainThread, |
- base::Unretained(this))); |
- } |
-} |
- |
-scoped_refptr<gpu::GpuChannelHost> GpuService::EstablishGpuChannelSync() { |
- base::AutoLock auto_lock(lock_); |
- if (GetGpuChannelLocked()) |
- return gpu_channel_; |
- |
- if (IsMainThread()) { |
- is_establishing_ = true; |
- EstablishGpuChannelOnMainThreadSyncLocked(); |
- } else { |
- if (!is_establishing_) { |
- // Create an establishing gpu channel task, if there isn't one. |
- is_establishing_ = true; |
- main_task_runner_->PostTask( |
- FROM_HERE, base::Bind(&GpuService::EstablishGpuChannelOnMainThread, |
- base::Unretained(this))); |
- } |
- |
- // Wait until the pending establishing task is finished. |
- do { |
- establishing_condition_.Wait(); |
- } while (is_establishing_); |
- } |
- return gpu_channel_; |
-} |
- |
-scoped_refptr<gpu::GpuChannelHost> GpuService::GetGpuChannelLocked() { |
- if (gpu_channel_ && gpu_channel_->IsLost()) { |
- main_task_runner_->PostTask( |
- FROM_HERE, |
- base::Bind(&gpu::GpuChannelHost::DestroyChannel, gpu_channel_)); |
- gpu_channel_ = nullptr; |
- } |
- return gpu_channel_; |
-} |
- |
-void GpuService::EstablishGpuChannelOnMainThread() { |
- base::AutoLock auto_lock(lock_); |
- DCHECK(IsMainThread()); |
- |
- // In GpuService::EstablishGpuChannelOnMainThreadSyncLocked(), we use the sync |
- // mojo EstablishGpuChannel call, after that call the gpu_service_ will be |
- // reset immediatelly. So gpu_service_ should be always null here. |
- DCHECK(!gpu_service_); |
- |
- // is_establishing_ is false, it means GpuService::EstablishGpuChannelSync() |
- // has been used, and we don't need try to establish a new GPU channel |
- // anymore. |
- if (!is_establishing_) |
- return; |
- |
- connector_->ConnectToInterface("mojo:ui", &gpu_service_); |
- const bool locked = false; |
- gpu_service_->EstablishGpuChannel( |
- base::Bind(&GpuService::EstablishGpuChannelOnMainThreadDone, |
- base::Unretained(this), locked)); |
-} |
- |
-void GpuService::EstablishGpuChannelOnMainThreadSyncLocked() { |
- DCHECK(IsMainThread()); |
- DCHECK(is_establishing_); |
- |
- // In browser process, EstablishGpuChannelSync() is only used by testing & |
- // GpuProcessTransportFactory::GetGLHelper(). For GetGLHelper(), it expects |
- // the gpu channel has been established, so it should not reach here. |
- // For testing, the asyc method should not be used. |
- // In renderer process, we only use EstablishGpuChannelSync(). |
- // So the gpu_service_ should be null here. |
- DCHECK(!gpu_service_); |
- |
- int client_id = 0; |
- mojom::ChannelHandlePtr channel_handle; |
- mojom::GpuInfoPtr gpu_info; |
- connector_->ConnectToInterface("mojo:ui", &gpu_service_); |
- { |
- base::AutoUnlock auto_unlock(lock_); |
- mojo::SyncCallRestrictions::ScopedAllowSyncCall allow_sync_call; |
- if (!gpu_service_->EstablishGpuChannel(&client_id, &channel_handle, |
- &gpu_info)) { |
- DLOG(WARNING) |
- << "Channel encountered error while establishing gpu channel."; |
- return; |
- } |
- } |
- const bool locked = true; |
- EstablishGpuChannelOnMainThreadDone( |
- locked, client_id, std::move(channel_handle), std::move(gpu_info)); |
-} |
- |
-void GpuService::EstablishGpuChannelOnMainThreadDone( |
- bool locked, |
- int client_id, |
- mojom::ChannelHandlePtr channel_handle, |
- mojom::GpuInfoPtr gpu_info) { |
- DCHECK(IsMainThread()); |
- scoped_refptr<gpu::GpuChannelHost> gpu_channel; |
- if (client_id) { |
- // TODO(penghuang): Get the real gpu info from mus. |
- gpu_channel = gpu::GpuChannelHost::Create( |
- this, client_id, gpu::GPUInfo(), |
- channel_handle.To<IPC::ChannelHandle>(), &shutdown_event_, |
- gpu_memory_buffer_manager_.get()); |
- } |
- |
- auto auto_lock = base::WrapUnique<base::AutoLock>( |
- locked ? nullptr : new base::AutoLock(lock_)); |
- DCHECK(is_establishing_); |
- DCHECK(!gpu_channel_); |
- |
- is_establishing_ = false; |
- gpu_channel_ = gpu_channel; |
- establishing_condition_.Broadcast(); |
- gpu_service_.reset(); |
- |
- for (const auto& i : establish_callbacks_) |
- i.Run(gpu_channel_); |
- establish_callbacks_.clear(); |
-} |
- |
-bool GpuService::IsMainThread() { |
- return main_task_runner_->BelongsToCurrentThread(); |
-} |
- |
-scoped_refptr<base::SingleThreadTaskRunner> |
-GpuService::GetIOThreadTaskRunner() { |
- return io_thread_.task_runner(); |
-} |
- |
-std::unique_ptr<base::SharedMemory> GpuService::AllocateSharedMemory( |
- size_t size) { |
- mojo::ScopedSharedBufferHandle handle = |
- mojo::SharedBufferHandle::Create(size); |
- if (!handle.is_valid()) |
- return nullptr; |
- |
- base::SharedMemoryHandle platform_handle; |
- size_t shared_memory_size; |
- bool readonly; |
- MojoResult result = mojo::UnwrapSharedMemoryHandle( |
- std::move(handle), &platform_handle, &shared_memory_size, &readonly); |
- if (result != MOJO_RESULT_OK) |
- return nullptr; |
- DCHECK_EQ(shared_memory_size, size); |
- |
- return base::MakeUnique<base::SharedMemory>(platform_handle, readonly); |
-} |
- |
-} // namespace ui |