| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 #include "content/renderer/gpu/command_buffer_proxy.h" | 5 #include "content/renderer/gpu/command_buffer_proxy.h" |
| 6 | 6 |
| 7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/process_util.h" | 9 #include "base/process_util.h" |
| 10 #include "base/shared_memory.h" | 10 #include "base/shared_memory.h" |
| 11 #include "base/stl_util.h" |
| 11 #include "base/task.h" | 12 #include "base/task.h" |
| 12 #include "content/common/gpu/gpu_messages.h" | 13 #include "content/common/gpu/gpu_messages.h" |
| 13 #include "content/common/plugin_messages.h" | 14 #include "content/common/plugin_messages.h" |
| 14 #include "content/common/view_messages.h" | 15 #include "content/common/view_messages.h" |
| 15 #include "content/renderer/gpu/gpu_channel_host.h" | 16 #include "content/renderer/gpu/gpu_channel_host.h" |
| 16 #include "content/renderer/plugin_channel_host.h" | 17 #include "content/renderer/plugin_channel_host.h" |
| 17 #include "content/renderer/render_thread.h" | 18 #include "content/renderer/render_thread.h" |
| 18 #include "gpu/command_buffer/common/cmd_buffer_common.h" | 19 #include "gpu/command_buffer/common/cmd_buffer_common.h" |
| 19 #include "ui/gfx/size.h" | 20 #include "ui/gfx/size.h" |
| 20 | 21 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 38 delete it->second.shared_memory; | 39 delete it->second.shared_memory; |
| 39 it->second.shared_memory = NULL; | 40 it->second.shared_memory = NULL; |
| 40 } | 41 } |
| 41 } | 42 } |
| 42 | 43 |
| 43 bool CommandBufferProxy::OnMessageReceived(const IPC::Message& message) { | 44 bool CommandBufferProxy::OnMessageReceived(const IPC::Message& message) { |
| 44 bool handled = true; | 45 bool handled = true; |
| 45 IPC_BEGIN_MESSAGE_MAP(CommandBufferProxy, message) | 46 IPC_BEGIN_MESSAGE_MAP(CommandBufferProxy, message) |
| 46 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_UpdateState, OnUpdateState); | 47 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_UpdateState, OnUpdateState); |
| 47 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_Destroyed, OnDestroyed); | 48 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_Destroyed, OnDestroyed); |
| 48 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_SwapBuffers, OnSwapBuffers); | |
| 49 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_NotifyRepaint, | 49 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_NotifyRepaint, |
| 50 OnNotifyRepaint); | 50 OnNotifyRepaint); |
| 51 IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_EchoAck, OnEchoAck); |
| 51 IPC_MESSAGE_UNHANDLED(handled = false) | 52 IPC_MESSAGE_UNHANDLED(handled = false) |
| 52 IPC_END_MESSAGE_MAP() | 53 IPC_END_MESSAGE_MAP() |
| 53 | 54 |
| 54 DCHECK(handled); | 55 DCHECK(handled); |
| 55 return handled; | 56 return handled; |
| 56 } | 57 } |
| 57 | 58 |
| 58 void CommandBufferProxy::OnChannelError() { | 59 void CommandBufferProxy::OnChannelError() { |
| 59 for (Decoders::iterator it = video_decoder_hosts_.begin(); | 60 for (Decoders::iterator it = video_decoder_hosts_.begin(); |
| 60 it != video_decoder_hosts_.end(); ++it) { | 61 it != video_decoder_hosts_.end(); ++it) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 72 last_state_.error = gpu::error::kLostContext; | 73 last_state_.error = gpu::error::kLostContext; |
| 73 last_state_.context_lost_reason = reason; | 74 last_state_.context_lost_reason = reason; |
| 74 | 75 |
| 75 if (channel_error_callback_.get()) { | 76 if (channel_error_callback_.get()) { |
| 76 channel_error_callback_->Run(); | 77 channel_error_callback_->Run(); |
| 77 // Avoid calling the error callback more than once. | 78 // Avoid calling the error callback more than once. |
| 78 channel_error_callback_.reset(); | 79 channel_error_callback_.reset(); |
| 79 } | 80 } |
| 80 } | 81 } |
| 81 | 82 |
| 83 void CommandBufferProxy::OnEchoAck() { |
| 84 DCHECK(!echo_tasks_.empty()); |
| 85 Task* task = echo_tasks_.front().release(); |
| 86 echo_tasks_.pop(); |
| 87 task->Run(); |
| 88 } |
| 89 |
| 82 void CommandBufferProxy::SetChannelErrorCallback(Callback0::Type* callback) { | 90 void CommandBufferProxy::SetChannelErrorCallback(Callback0::Type* callback) { |
| 83 channel_error_callback_.reset(callback); | 91 channel_error_callback_.reset(callback); |
| 84 } | 92 } |
| 85 | 93 |
| 86 bool CommandBufferProxy::Initialize(int32 size) { | 94 bool CommandBufferProxy::Initialize(int32 size) { |
| 87 DCHECK(!ring_buffer_.get()); | 95 DCHECK(!ring_buffer_.get()); |
| 88 | 96 |
| 89 RenderThread* render_thread = RenderThread::current(); | 97 RenderThread* render_thread = RenderThread::current(); |
| 90 if (!render_thread) | 98 if (!render_thread) |
| 91 return false; | 99 return false; |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 337 // Not implemented in proxy. | 345 // Not implemented in proxy. |
| 338 NOTREACHED(); | 346 NOTREACHED(); |
| 339 } | 347 } |
| 340 | 348 |
| 341 void CommandBufferProxy::SetContextLostReason( | 349 void CommandBufferProxy::SetContextLostReason( |
| 342 gpu::error::ContextLostReason reason) { | 350 gpu::error::ContextLostReason reason) { |
| 343 // Not implemented in proxy. | 351 // Not implemented in proxy. |
| 344 NOTREACHED(); | 352 NOTREACHED(); |
| 345 } | 353 } |
| 346 | 354 |
| 347 void CommandBufferProxy::OnSwapBuffers() { | 355 bool CommandBufferProxy::Echo(Task* task) { |
| 348 if (swap_buffers_callback_.get()) | 356 if (last_state_.error != gpu::error::kNoError) { |
| 349 swap_buffers_callback_->Run(); | 357 delete task; |
| 358 return false; |
| 359 } |
| 360 |
| 361 if (!Send(new GpuChannelMsg_Echo(GpuCommandBufferMsg_EchoAck(route_id_)))) { |
| 362 delete task; |
| 363 return false; |
| 364 } |
| 365 |
| 366 echo_tasks_.push(linked_ptr<Task>(task)); |
| 367 |
| 368 return true; |
| 350 } | 369 } |
| 351 | 370 |
| 352 bool CommandBufferProxy::SetParent(CommandBufferProxy* parent_command_buffer, | 371 bool CommandBufferProxy::SetParent(CommandBufferProxy* parent_command_buffer, |
| 353 uint32 parent_texture_id) { | 372 uint32 parent_texture_id) { |
| 354 if (last_state_.error != gpu::error::kNoError) | 373 if (last_state_.error != gpu::error::kNoError) |
| 355 return false; | 374 return false; |
| 356 | 375 |
| 357 bool result; | 376 bool result; |
| 358 if (parent_command_buffer) { | 377 if (parent_command_buffer) { |
| 359 if (!Send(new GpuCommandBufferMsg_SetParent( | 378 if (!Send(new GpuCommandBufferMsg_SetParent( |
| 360 route_id_, | 379 route_id_, |
| 361 parent_command_buffer->route_id_, | 380 parent_command_buffer->route_id_, |
| 362 parent_texture_id, | 381 parent_texture_id, |
| 363 &result))) { | 382 &result))) { |
| 364 return false; | 383 return false; |
| 365 } | 384 } |
| 366 } else { | 385 } else { |
| 367 if (!Send(new GpuCommandBufferMsg_SetParent( | 386 if (!Send(new GpuCommandBufferMsg_SetParent( |
| 368 route_id_, | 387 route_id_, |
| 369 MSG_ROUTING_NONE, | 388 MSG_ROUTING_NONE, |
| 370 0, | 389 0, |
| 371 &result))) { | 390 &result))) { |
| 372 return false; | 391 return false; |
| 373 } | 392 } |
| 374 } | 393 } |
| 375 | 394 |
| 376 return result; | 395 return result; |
| 377 } | 396 } |
| 378 | 397 |
| 379 void CommandBufferProxy::SetSwapBuffersCallback(Callback0::Type* callback) { | |
| 380 swap_buffers_callback_.reset(callback); | |
| 381 } | |
| 382 | |
| 383 void CommandBufferProxy::SetNotifyRepaintTask(Task* task) { | 398 void CommandBufferProxy::SetNotifyRepaintTask(Task* task) { |
| 384 notify_repaint_task_.reset(task); | 399 notify_repaint_task_.reset(task); |
| 385 } | 400 } |
| 386 | 401 |
| 387 scoped_refptr<GpuVideoDecodeAcceleratorHost> | 402 scoped_refptr<GpuVideoDecodeAcceleratorHost> |
| 388 CommandBufferProxy::CreateVideoDecoder( | 403 CommandBufferProxy::CreateVideoDecoder( |
| 389 const std::vector<int32>& configs, | 404 const std::vector<int32>& configs, |
| 390 media::VideoDecodeAccelerator::Client* client) { | 405 media::VideoDecodeAccelerator::Client* client) { |
| 391 int decoder_route_id; | 406 int decoder_route_id; |
| 392 if (!Send(new GpuCommandBufferMsg_CreateVideoDecoder(route_id_, configs, | 407 if (!Send(new GpuCommandBufferMsg_CreateVideoDecoder(route_id_, configs, |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 427 delete msg; | 442 delete msg; |
| 428 return false; | 443 return false; |
| 429 } | 444 } |
| 430 | 445 |
| 431 void CommandBufferProxy::OnUpdateState(const gpu::CommandBuffer::State& state) { | 446 void CommandBufferProxy::OnUpdateState(const gpu::CommandBuffer::State& state) { |
| 432 // Handle wraparound. It works as long as we don't have more than 2B state | 447 // Handle wraparound. It works as long as we don't have more than 2B state |
| 433 // updates in flight across which reordering occurs. | 448 // updates in flight across which reordering occurs. |
| 434 if (state.generation - last_state_.generation < 0x80000000U) | 449 if (state.generation - last_state_.generation < 0x80000000U) |
| 435 last_state_ = state; | 450 last_state_ = state; |
| 436 } | 451 } |
| OLD | NEW |