Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(760)

Unified Diff: services/ui/ws/gpu_service_proxy.cc

Issue 2281583003: services/ui: Split GpuServiceInternal into gpu vs. ws pieces. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@DONE_2016.08.24_mus-ws-gpu-refactor
Patch Set: tot merge Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: services/ui/ws/gpu_service_proxy.cc
diff --git a/services/ui/ws/gpu_service_proxy.cc b/services/ui/ws/gpu_service_proxy.cc
index fa341d1d4db0c41ae42e57fc1d722b389dd34cc2..bf98c56f9dbc16e3e9a0852bf8ddb105deeb31fd 100644
--- a/services/ui/ws/gpu_service_proxy.cc
+++ b/services/ui/ws/gpu_service_proxy.cc
@@ -4,19 +4,32 @@
#include "services/ui/ws/gpu_service_proxy.h"
+#include "base/memory/shared_memory.h"
+#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "gpu/ipc/client/gpu_channel_host.h"
#include "services/shell/public/cpp/connection.h"
#include "services/ui/common/gpu_type_converters.h"
#include "services/ui/gpu/gpu_service_internal.h"
+#include "services/ui/ws/mus_gpu_memory_buffer_manager.h"
namespace ui {
+namespace ws {
namespace {
-const int32_t kLocalGpuChannelClientId = 1;
+const int32_t kInternalGpuChannelClientId = 1;
+const uint64_t kInternalGpuChannelClientTracingId = 1;
} // namespace
-GpuServiceProxy::GpuServiceProxy() : next_client_id_(kLocalGpuChannelClientId) {
+GpuServiceProxy::GpuServiceProxy(Delegate* delegate)
+ : delegate_(delegate),
+ next_client_id_(kInternalGpuChannelClientId),
+ main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()),
+ shutdown_event_(base::WaitableEvent::ResetPolicy::AUTOMATIC,
+ base::WaitableEvent::InitialState::NOT_SIGNALED) {
// TODO(sad): Once GPU process is split, this would look like:
// connector->ConnectToInterface("mojo:gpu", &gpu_service_);
GpuServiceInternal::GetInstance()->Add(GetProxy(&gpu_service_));
@@ -32,6 +45,30 @@ void GpuServiceProxy::Add(mojom::GpuServiceRequest request) {
void GpuServiceProxy::OnInitialized(const gpu::GPUInfo& gpu_info) {
gpu_info_ = gpu_info;
+
+ constexpr bool privileged = true;
+ gpu_service_->EstablishGpuChannel(
+ kInternalGpuChannelClientId, kInternalGpuChannelClientTracingId,
+ privileged, base::Bind(&GpuServiceProxy::OnInternalGpuChannelEstablished,
+ base::Unretained(this)));
+ next_client_id_ = kInternalGpuChannelClientId + 1;
+}
+
+void GpuServiceProxy::OnInternalGpuChannelEstablished(
+ mojo::ScopedMessagePipeHandle channel_handle) {
+ io_thread_.reset(new base::Thread("GPUIOThread"));
Fady Samuel 2016/08/26 16:27:59 A TODO might be useful to verify whether we need t
sadrul 2016/08/26 17:23:50 GpuChannelHost creates a sync ipc-channel, and tha
+ base::Thread::Options thread_options(base::MessageLoop::TYPE_IO, 0);
+ thread_options.priority = base::ThreadPriority::NORMAL;
+ CHECK(io_thread_->StartWithOptions(thread_options));
+
+ gpu_memory_buffer_manager_.reset(new MusGpuMemoryBufferManager(
+ GpuServiceInternal::GetInstance(), kInternalGpuChannelClientId));
+ gpu_channel_ = gpu::GpuChannelHost::Create(
+ this, kInternalGpuChannelClientId, gpu_info_,
+ IPC::ChannelHandle(channel_handle.release()), &shutdown_event_,
+ gpu_memory_buffer_manager_.get());
+ if (delegate_)
+ delegate_->OnGpuChannelEstablished(gpu_channel_);
}
void GpuServiceProxy::OnGpuChannelEstablished(
@@ -47,8 +84,9 @@ void GpuServiceProxy::EstablishGpuChannel(
// TODO(sad): crbug.com/617415 figure out how to generate a meaningful tracing
// id.
const uint64_t client_tracing_id = 0;
+ constexpr bool privileged = false;
gpu_service_->EstablishGpuChannel(
- client_id, client_tracing_id,
+ client_id, client_tracing_id, privileged,
base::Bind(&GpuServiceProxy::OnGpuChannelEstablished,
base::Unretained(this), callback, client_id));
}
@@ -68,4 +106,22 @@ void GpuServiceProxy::DestroyGpuMemoryBuffer(mojom::GpuMemoryBufferIdPtr id,
NOTIMPLEMENTED();
}
+bool GpuServiceProxy::IsMainThread() {
+ return main_thread_task_runner_->BelongsToCurrentThread();
+}
+
+scoped_refptr<base::SingleThreadTaskRunner>
+GpuServiceProxy::GetIOThreadTaskRunner() {
+ return io_thread_->task_runner();
+}
+
+std::unique_ptr<base::SharedMemory> GpuServiceProxy::AllocateSharedMemory(
+ size_t size) {
+ std::unique_ptr<base::SharedMemory> shm(new base::SharedMemory());
+ if (!shm->CreateAnonymous(size))
+ shm.reset();
+ return shm;
+}
+
+} // namespace ws
} // namespace ui

Powered by Google App Engine
This is Rietveld 408576698