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

Side by Side Diff: content/common/gpu/gpu_channel.cc

Issue 10071038: RefCounted types should not have public destructors, content/browser part 2 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Copyright bump Created 8 years, 8 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « content/common/gpu/gpu_channel.h ('k') | content/common/gpu/image_transport_surface.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #if defined(OS_WIN) 5 #if defined(OS_WIN)
6 #include <windows.h> 6 #include <windows.h>
7 #endif 7 #endif
8 8
9 #include "content/common/gpu/gpu_channel.h" 9 #include "content/common/gpu/gpu_channel.h"
10 10
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 52
53 channel_id_ = IPC::Channel::GenerateVerifiedChannelID("gpu"); 53 channel_id_ = IPC::Channel::GenerateVerifiedChannelID("gpu");
54 const CommandLine* command_line = CommandLine::ForCurrentProcess(); 54 const CommandLine* command_line = CommandLine::ForCurrentProcess();
55 log_messages_ = command_line->HasSwitch(switches::kLogPluginMessages); 55 log_messages_ = command_line->HasSwitch(switches::kLogPluginMessages);
56 disallowed_features_.multisampling = 56 disallowed_features_.multisampling =
57 command_line->HasSwitch(switches::kDisableGLMultisampling); 57 command_line->HasSwitch(switches::kDisableGLMultisampling);
58 disallowed_features_.driver_bug_workarounds = 58 disallowed_features_.driver_bug_workarounds =
59 command_line->HasSwitch(switches::kDisableGpuDriverBugWorkarounds); 59 command_line->HasSwitch(switches::kDisableGpuDriverBugWorkarounds);
60 } 60 }
61 61
62 GpuChannel::~GpuChannel() { 62
63 bool GpuChannel::Init(base::MessageLoopProxy* io_message_loop,
64 base::WaitableEvent* shutdown_event) {
65 DCHECK(!channel_.get());
66
67 // Map renderer ID to a (single) channel to that process.
68 channel_.reset(new IPC::SyncChannel(
69 channel_id_,
70 IPC::Channel::MODE_SERVER,
71 this,
72 io_message_loop,
73 false,
74 shutdown_event));
75
76 return true;
63 } 77 }
64 78
79 std::string GpuChannel::GetChannelName() {
80 return channel_id_;
81 }
82
83 #if defined(OS_POSIX)
84 int GpuChannel::TakeRendererFileDescriptor() {
85 if (!channel_.get()) {
86 NOTREACHED();
87 return -1;
88 }
89 return channel_->TakeClientFileDescriptor();
90 }
91 #endif // defined(OS_POSIX)
92
65 bool GpuChannel::OnMessageReceived(const IPC::Message& message) { 93 bool GpuChannel::OnMessageReceived(const IPC::Message& message) {
66 if (log_messages_) { 94 if (log_messages_) {
67 DVLOG(1) << "received message @" << &message << " on channel @" << this 95 DVLOG(1) << "received message @" << &message << " on channel @" << this
68 << " with type " << message.type(); 96 << " with type " << message.type();
69 } 97 }
70 98
71 // Control messages are not deferred and can be handled out of order with 99 // Control messages are not deferred and can be handled out of order with
72 // respect to routed ones. 100 // respect to routed ones.
73 if (message.routing_id() == MSG_ROUTING_CONTROL) 101 if (message.routing_id() == MSG_ROUTING_CONTROL)
74 return OnControlMessageReceived(message); 102 return OnControlMessageReceived(message);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 // not emptied here, which ensures that OnMessageReceived will continue to 167 // not emptied here, which ensures that OnMessageReceived will continue to
140 // defer newly received messages until the ones in the queue have all been 168 // defer newly received messages until the ones in the queue have all been
141 // handled by HandleMessage. HandleMessage is invoked as a 169 // handled by HandleMessage. HandleMessage is invoked as a
142 // task to prevent reentrancy. 170 // task to prevent reentrancy.
143 MessageLoop::current()->PostTask( 171 MessageLoop::current()->PostTask(
144 FROM_HERE, 172 FROM_HERE,
145 base::Bind(&GpuChannel::HandleMessage, weak_factory_.GetWeakPtr())); 173 base::Bind(&GpuChannel::HandleMessage, weak_factory_.GetWeakPtr()));
146 handle_messages_scheduled_ = true; 174 handle_messages_scheduled_ = true;
147 } 175 }
148 176
149 void GpuChannel::LoseAllContexts() {
150 gpu_channel_manager_->LoseAllContexts();
151 }
152
153 void GpuChannel::DestroySoon() {
154 MessageLoop::current()->PostTask(
155 FROM_HERE, base::Bind(&GpuChannel::OnDestroy, this));
156 }
157
158 void GpuChannel::OnDestroy() {
159 TRACE_EVENT0("gpu", "GpuChannel::OnDestroy");
160 gpu_channel_manager_->RemoveChannel(client_id_);
161 }
162
163 void GpuChannel::CreateViewCommandBuffer( 177 void GpuChannel::CreateViewCommandBuffer(
164 const gfx::GLSurfaceHandle& window, 178 const gfx::GLSurfaceHandle& window,
165 int32 surface_id, 179 int32 surface_id,
166 const GPUCreateCommandBufferConfig& init_params, 180 const GPUCreateCommandBufferConfig& init_params,
167 int32* route_id) { 181 int32* route_id) {
168 *route_id = MSG_ROUTING_NONE; 182 *route_id = MSG_ROUTING_NONE;
169 content::GetContentClient()->SetActiveURL(init_params.active_url); 183 content::GetContentClient()->SetActiveURL(init_params.active_url);
170 184
171 #if defined(ENABLE_GPU) 185 #if defined(ENABLE_GPU)
172 WillCreateCommandBuffer(init_params.gpu_preference); 186 WillCreateCommandBuffer(init_params.gpu_preference);
(...skipping 16 matching lines...) Expand all
189 software_)); 203 software_));
190 router_.AddRoute(*route_id, stub.get()); 204 router_.AddRoute(*route_id, stub.get());
191 stubs_.AddWithID(stub.release(), *route_id); 205 stubs_.AddWithID(stub.release(), *route_id);
192 #endif // ENABLE_GPU 206 #endif // ENABLE_GPU
193 } 207 }
194 208
195 GpuCommandBufferStub* GpuChannel::LookupCommandBuffer(int32 route_id) { 209 GpuCommandBufferStub* GpuChannel::LookupCommandBuffer(int32 route_id) {
196 return stubs_.Lookup(route_id); 210 return stubs_.Lookup(route_id);
197 } 211 }
198 212
213 void GpuChannel::LoseAllContexts() {
214 gpu_channel_manager_->LoseAllContexts();
215 }
216
217 void GpuChannel::DestroySoon() {
218 MessageLoop::current()->PostTask(
219 FROM_HERE, base::Bind(&GpuChannel::OnDestroy, this));
220 }
221
222 int GpuChannel::GenerateRouteID() {
223 static int last_id = 0;
224 return ++last_id;
225 }
226
227 void GpuChannel::AddRoute(int32 route_id, IPC::Channel::Listener* listener) {
228 router_.AddRoute(route_id, listener);
229 }
230
231 void GpuChannel::RemoveRoute(int32 route_id) {
232 router_.RemoveRoute(route_id);
233 }
234
235 bool GpuChannel::ShouldPreferDiscreteGpu() const {
236 return num_contexts_preferring_discrete_gpu_ > 0;
237 }
238
239 GpuChannel::~GpuChannel() {}
240
241 void GpuChannel::OnDestroy() {
242 TRACE_EVENT0("gpu", "GpuChannel::OnDestroy");
243 gpu_channel_manager_->RemoveChannel(client_id_);
244 }
245
199 bool GpuChannel::OnControlMessageReceived(const IPC::Message& msg) { 246 bool GpuChannel::OnControlMessageReceived(const IPC::Message& msg) {
200 // Always use IPC_MESSAGE_HANDLER_DELAY_REPLY for synchronous message handlers 247 // Always use IPC_MESSAGE_HANDLER_DELAY_REPLY for synchronous message handlers
201 // here. This is so the reply can be delayed if the scheduler is unscheduled. 248 // here. This is so the reply can be delayed if the scheduler is unscheduled.
202 bool handled = true; 249 bool handled = true;
203 IPC_BEGIN_MESSAGE_MAP(GpuChannel, msg) 250 IPC_BEGIN_MESSAGE_MAP(GpuChannel, msg)
204 IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuChannelMsg_CreateOffscreenCommandBuffer, 251 IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuChannelMsg_CreateOffscreenCommandBuffer,
205 OnCreateOffscreenCommandBuffer) 252 OnCreateOffscreenCommandBuffer)
206 IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuChannelMsg_DestroyCommandBuffer, 253 IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuChannelMsg_DestroyCommandBuffer,
207 OnDestroyCommandBuffer) 254 OnDestroyCommandBuffer)
208 IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuChannelMsg_WillGpuSwitchOccur, 255 IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuChannelMsg_WillGpuSwitchOccur,
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 if (stub->HasMoreWork()) { 324 if (stub->HasMoreWork()) {
278 MessageLoop::current()->PostDelayedTask( 325 MessageLoop::current()->PostDelayedTask(
279 FROM_HERE, 326 FROM_HERE,
280 base::Bind(&GpuChannel::PollWork, 327 base::Bind(&GpuChannel::PollWork,
281 weak_factory_.GetWeakPtr(), 328 weak_factory_.GetWeakPtr(),
282 stub->route_id()), 329 stub->route_id()),
283 base::TimeDelta::FromMilliseconds(delay)); 330 base::TimeDelta::FromMilliseconds(delay));
284 } 331 }
285 } 332 }
286 333
287 int GpuChannel::GenerateRouteID() {
288 static int last_id = 0;
289 return ++last_id;
290 }
291
292 void GpuChannel::AddRoute(int32 route_id, IPC::Channel::Listener* listener) {
293 router_.AddRoute(route_id, listener);
294 }
295
296 void GpuChannel::RemoveRoute(int32 route_id) {
297 router_.RemoveRoute(route_id);
298 }
299
300 bool GpuChannel::ShouldPreferDiscreteGpu() const {
301 return num_contexts_preferring_discrete_gpu_ > 0;
302 }
303
304 void GpuChannel::OnCreateOffscreenCommandBuffer( 334 void GpuChannel::OnCreateOffscreenCommandBuffer(
305 const gfx::Size& size, 335 const gfx::Size& size,
306 const GPUCreateCommandBufferConfig& init_params, 336 const GPUCreateCommandBufferConfig& init_params,
307 IPC::Message* reply_message) { 337 IPC::Message* reply_message) {
308 int32 route_id = MSG_ROUTING_NONE; 338 int32 route_id = MSG_ROUTING_NONE;
309 339
310 content::GetContentClient()->SetActiveURL(init_params.active_url); 340 content::GetContentClient()->SetActiveURL(init_params.active_url);
311 #if defined(ENABLE_GPU) 341 #if defined(ENABLE_GPU)
312 WillCreateCommandBuffer(init_params.gpu_preference); 342 WillCreateCommandBuffer(init_params.gpu_preference);
313 343
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
384 reply_message, 414 reply_message,
385 will_switch_occur); 415 will_switch_occur);
386 Send(reply_message); 416 Send(reply_message);
387 } 417 }
388 418
389 void GpuChannel::OnCloseChannel() { 419 void GpuChannel::OnCloseChannel() {
390 gpu_channel_manager_->RemoveChannel(client_id_); 420 gpu_channel_manager_->RemoveChannel(client_id_);
391 // At this point "this" is deleted! 421 // At this point "this" is deleted!
392 } 422 }
393 423
394 bool GpuChannel::Init(base::MessageLoopProxy* io_message_loop,
395 base::WaitableEvent* shutdown_event) {
396 DCHECK(!channel_.get());
397
398 // Map renderer ID to a (single) channel to that process.
399 channel_.reset(new IPC::SyncChannel(
400 channel_id_,
401 IPC::Channel::MODE_SERVER,
402 this,
403 io_message_loop,
404 false,
405 shutdown_event));
406
407 return true;
408 }
409
410 void GpuChannel::WillCreateCommandBuffer(gfx::GpuPreference gpu_preference) { 424 void GpuChannel::WillCreateCommandBuffer(gfx::GpuPreference gpu_preference) {
411 if (gpu_preference == gfx::PreferDiscreteGpu) 425 if (gpu_preference == gfx::PreferDiscreteGpu)
412 ++num_contexts_preferring_discrete_gpu_; 426 ++num_contexts_preferring_discrete_gpu_;
413 } 427 }
414 428
415 void GpuChannel::DidDestroyCommandBuffer(gfx::GpuPreference gpu_preference) { 429 void GpuChannel::DidDestroyCommandBuffer(gfx::GpuPreference gpu_preference) {
416 if (gpu_preference == gfx::PreferDiscreteGpu) 430 if (gpu_preference == gfx::PreferDiscreteGpu)
417 --num_contexts_preferring_discrete_gpu_; 431 --num_contexts_preferring_discrete_gpu_;
418 DCHECK_GE(num_contexts_preferring_discrete_gpu_, 0); 432 DCHECK_GE(num_contexts_preferring_discrete_gpu_, 0);
419 } 433 }
420
421 std::string GpuChannel::GetChannelName() {
422 return channel_id_;
423 }
424
425 #if defined(OS_POSIX)
426 int GpuChannel::TakeRendererFileDescriptor() {
427 if (!channel_.get()) {
428 NOTREACHED();
429 return -1;
430 }
431 return channel_->TakeClientFileDescriptor();
432 }
433 #endif // defined(OS_POSIX)
OLDNEW
« no previous file with comments | « content/common/gpu/gpu_channel.h ('k') | content/common/gpu/image_transport_surface.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698