Index: content/common/gpu/gpu_channel_manager.cc |
diff --git a/content/common/gpu/gpu_channel_manager.cc b/content/common/gpu/gpu_channel_manager.cc |
index 27b7fea88f6c17152f48557c0d6db891f06f0188..aadb0a25c322fde26e4e9819ffd31331dfe469bd 100644 |
--- a/content/common/gpu/gpu_channel_manager.cc |
+++ b/content/common/gpu/gpu_channel_manager.cc |
@@ -16,6 +16,7 @@ |
#include "content/common/gpu/gpu_memory_manager.h" |
#include "content/common/gpu/gpu_messages.h" |
#include "content/common/message_router.h" |
+#include "content/public/common/content_switches.h" |
#include "gpu/command_buffer/common/value_state.h" |
#include "gpu/command_buffer/service/feature_info.h" |
#include "gpu/command_buffer/service/gpu_switches.h" |
@@ -53,6 +54,8 @@ GpuChannelManager::GpuChannelManager( |
channel_(channel), |
watchdog_(watchdog), |
shutdown_event_(shutdown_event), |
+ share_group_(new gfx::GLShareGroup), |
+ mailbox_manager_(gpu::gles2::MailboxManager::Create()), |
gpu_memory_manager_( |
this, |
GpuMemoryManager::kDefaultMaxSurfacesWithFrontbufferSoftLimit), |
@@ -61,6 +64,10 @@ GpuChannelManager::GpuChannelManager( |
weak_factory_(this) { |
DCHECK(task_runner); |
DCHECK(io_task_runner); |
+ const base::CommandLine* command_line = |
+ base::CommandLine::ForCurrentProcess(); |
+ if (command_line->HasSwitch(switches::kUIPrioritizeInGpuProcess)) |
+ preemption_flag_ = new gpu::PreemptionFlag; |
} |
GpuChannelManager::~GpuChannelManager() { |
@@ -151,41 +158,29 @@ bool GpuChannelManager::Send(IPC::Message* msg) { |
} |
scoped_ptr<GpuChannel> GpuChannelManager::CreateGpuChannel( |
- gfx::GLShareGroup* share_group, |
- gpu::gles2::MailboxManager* mailbox_manager, |
int client_id, |
uint64_t client_tracing_id, |
+ bool preempts, |
bool allow_future_sync_points, |
bool allow_real_time_streams) { |
- return make_scoped_ptr(new GpuChannel( |
- this, watchdog_, share_group, mailbox_manager, task_runner_.get(), |
- io_task_runner_.get(), client_id, client_tracing_id, false, |
- allow_future_sync_points, allow_real_time_streams)); |
-} |
- |
-void GpuChannelManager::OnEstablishChannel(int client_id, |
- uint64_t client_tracing_id, |
- bool share_context, |
- bool allow_future_sync_points, |
- bool allow_real_time_streams) { |
- gfx::GLShareGroup* share_group = nullptr; |
- gpu::gles2::MailboxManager* mailbox_manager = nullptr; |
- if (share_context) { |
- if (!share_group_.get()) { |
- share_group_ = new gfx::GLShareGroup; |
- DCHECK(!mailbox_manager_.get()); |
- mailbox_manager_ = gpu::gles2::MailboxManager::Create(); |
- } |
- share_group = share_group_.get(); |
- mailbox_manager = mailbox_manager_.get(); |
- } |
- |
- scoped_ptr<GpuChannel> channel = CreateGpuChannel( |
- share_group, mailbox_manager, client_id, client_tracing_id, |
- allow_future_sync_points, allow_real_time_streams); |
+ return make_scoped_ptr( |
+ new GpuChannel(this, watchdog_, share_group(), mailbox_manager(), |
+ preempts ? preemption_flag() : nullptr, task_runner_.get(), |
+ io_task_runner_.get(), client_id, client_tracing_id, |
+ allow_future_sync_points, allow_real_time_streams)); |
+} |
+ |
+void GpuChannelManager::OnEstablishChannel( |
+ const GpuMsg_EstablishChannel_Params& params) { |
+ DCHECK(!params.preempts || !params.preempted); |
+ scoped_ptr<GpuChannel> channel(CreateGpuChannel( |
+ params.client_id, params.client_tracing_id, params.preempts, |
+ params.allow_future_sync_points, params.allow_real_time_streams)); |
+ if (params.preempted) |
+ channel->SetPreemptByFlag(preemption_flag_.get()); |
IPC::ChannelHandle channel_handle = channel->Init(shutdown_event_); |
- gpu_channels_.set(client_id, channel.Pass()); |
+ gpu_channels_.set(params.client_id, channel.Pass()); |
Send(new GpuHostMsg_ChannelEstablished(channel_handle)); |
} |
@@ -202,17 +197,14 @@ void GpuChannelManager::OnCloseChannel( |
void GpuChannelManager::OnCreateViewCommandBuffer( |
const gfx::GLSurfaceHandle& window, |
- int32 surface_id, |
int32 client_id, |
const GPUCreateCommandBufferConfig& init_params, |
int32 route_id) { |
- DCHECK(surface_id); |
CreateCommandBufferResult result = CREATE_COMMAND_BUFFER_FAILED; |
auto it = gpu_channels_.find(client_id); |
if (it != gpu_channels_.end()) { |
- result = it->second->CreateViewCommandBuffer(window, surface_id, |
- init_params, route_id); |
+ result = it->second->CreateViewCommandBuffer(window, init_params, route_id); |
} |
Send(new GpuHostMsg_CommandBufferCreated(result)); |