| Index: content/renderer/gpu/frame_swap_message_queue.cc
|
| diff --git a/content/renderer/gpu/frame_swap_message_queue.cc b/content/renderer/gpu/frame_swap_message_queue.cc
|
| index bf91dd84e0f89bdb19c8cb50922547114c474da6..9be26b54c2ecc44ce9d54e67a4036ac12741373f 100644
|
| --- a/content/renderer/gpu/frame_swap_message_queue.cc
|
| +++ b/content/renderer/gpu/frame_swap_message_queue.cc
|
| @@ -9,6 +9,7 @@
|
| #include "base/containers/hash_tables.h"
|
| #include "base/logging.h"
|
| #include "base/stl_util.h"
|
| +#include "content/common/frame_messages.h"
|
| #include "ipc/ipc_message.h"
|
|
|
| using std::vector;
|
| @@ -23,8 +24,12 @@ class FrameSwapMessageSubQueue {
|
| virtual void QueueMessage(int source_frame_number,
|
| scoped_ptr<IPC::Message> msg,
|
| bool* is_first) = 0;
|
| - virtual void DrainMessages(int source_frame_number,
|
| - ScopedVector<IPC::Message>* messages) = 0;
|
| + virtual void OnDrainMessages(ScopedVector<IPC::Message>* messages) = 0;
|
| + virtual void OnDidSwap(int source_frame_number,
|
| + ScopedVector<IPC::Message>* messages) = 0;
|
| + virtual void OnDidNotSwap(int source_frame_number,
|
| + cc::SwapPromise::DidNotSwapReason reason,
|
| + ScopedVector<IPC::Message>* messages) = 0;
|
|
|
| private:
|
| DISALLOW_COPY_AND_ASSIGN(FrameSwapMessageSubQueue);
|
| @@ -64,8 +69,61 @@ class VisualStateQueue : public FrameSwapMessageSubQueue {
|
| queue_[source_frame_number].push_back(msg.release());
|
| }
|
|
|
| + void DeliverSwapInfo(const std::set<int32>& routing_ids,
|
| + int source_frame_number,
|
| + bool swap_success,
|
| + ScopedVector<IPC::Message>* messages) {
|
| + for (auto& routing_id : routing_ids) {
|
| + messages->push_back(new FrameHostMsg_VisualStateSwapInfo(
|
| + routing_id, source_frame_number, swap_success));
|
| + }
|
| + }
|
| +
|
| + std::set<int32> GetRoutingIDs(int source_frame_number) {
|
| + std::set<int32> routing_ids;
|
| + VisualStateQueueMap::iterator end = queue_.upper_bound(source_frame_number);
|
| + for (VisualStateQueueMap::iterator i = queue_.begin(); i != end; i++) {
|
| + DCHECK(i->first <= source_frame_number);
|
| + for (auto& msg : i->second) {
|
| + routing_ids.insert(msg->routing_id());
|
| + }
|
| + }
|
| + return routing_ids;
|
| + }
|
| +
|
| + void OnDidSwap(int source_frame_number,
|
| + ScopedVector<IPC::Message>* messages) override {
|
| + DeliverSwapInfo(GetRoutingIDs(source_frame_number), source_frame_number,
|
| + true, messages);
|
| + DrainMessages(source_frame_number, messages);
|
| + }
|
| +
|
| + void OnDidNotSwap(int source_frame_number,
|
| + cc::SwapPromise::DidNotSwapReason reason,
|
| + ScopedVector<IPC::Message>* messages) override {
|
| + bool swap_ok;
|
| + switch (reason) {
|
| + case cc::SwapPromise::SWAP_FAILS:
|
| + case cc::SwapPromise::COMMIT_NO_UPDATE:
|
| + swap_ok = true;
|
| + break;
|
| + case cc::SwapPromise::COMMIT_FAILS:
|
| + swap_ok = false;
|
| + break;
|
| + default:
|
| + swap_ok = false;
|
| + NOTREACHED();
|
| + }
|
| + DeliverSwapInfo(GetRoutingIDs(source_frame_number), source_frame_number,
|
| + swap_ok, messages);
|
| + DrainMessages(source_frame_number, messages);
|
| + }
|
| +
|
| + void OnDrainMessages(ScopedVector<IPC::Message>* messages) override {}
|
| +
|
| + private:
|
| void DrainMessages(int source_frame_number,
|
| - ScopedVector<IPC::Message>* messages) override {
|
| + ScopedVector<IPC::Message>* messages) {
|
| VisualStateQueueMap::iterator end = queue_.upper_bound(source_frame_number);
|
| for (VisualStateQueueMap::iterator i = queue_.begin(); i != end; i++) {
|
| DCHECK(i->first <= source_frame_number);
|
| @@ -75,8 +133,7 @@ class VisualStateQueue : public FrameSwapMessageSubQueue {
|
| queue_.erase(queue_.begin(), end);
|
| }
|
|
|
| - private:
|
| - typedef std::map<int, std::vector<IPC::Message*> > VisualStateQueueMap;
|
| + typedef std::map<int, std::vector<IPC::Message*>> VisualStateQueueMap;
|
| VisualStateQueueMap queue_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(VisualStateQueue);
|
| @@ -96,13 +153,36 @@ class SwapQueue : public FrameSwapMessageSubQueue {
|
| queue_.push_back(msg.release());
|
| }
|
|
|
| + void OnDrainMessages(ScopedVector<IPC::Message>* messages) override {
|
| + DrainMessages(0, messages);
|
| + }
|
| +
|
| + virtual void OnDidSwap(int source_frame_number,
|
| + ScopedVector<IPC::Message>* messages) {
|
| + }
|
| +
|
| + virtual void OnDidNotSwap(int source_frame_number,
|
| + cc::SwapPromise::DidNotSwapReason reason,
|
| + ScopedVector<IPC::Message>* messages) {
|
| + switch (reason) {
|
| + case cc::SwapPromise::SWAP_FAILS:
|
| + case cc::SwapPromise::COMMIT_NO_UPDATE:
|
| + DrainMessages(source_frame_number, messages);
|
| + break;
|
| + case cc::SwapPromise::COMMIT_FAILS:
|
| + break;
|
| + default:
|
| + NOTREACHED();
|
| + }
|
| + }
|
| +
|
| + private:
|
| void DrainMessages(int source_frame_number,
|
| - ScopedVector<IPC::Message>* messages) override {
|
| + ScopedVector<IPC::Message>* messages) {
|
| messages->insert(messages->end(), queue_.begin(), queue_.end());
|
| queue_.weak_clear();
|
| }
|
|
|
| - private:
|
| ScopedVector<IPC::Message> queue_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(SwapQueue);
|
| @@ -148,35 +228,25 @@ void FrameSwapMessageQueue::QueueMessageForFrame(MessageDeliveryPolicy policy,
|
|
|
| void FrameSwapMessageQueue::DidSwap(int source_frame_number) {
|
| base::AutoLock lock(lock_);
|
| -
|
| - visual_state_queue_->DrainMessages(source_frame_number,
|
| - &next_drain_messages_);
|
| + swap_queue_->OnDidSwap(source_frame_number, &next_drain_messages_);
|
| + visual_state_queue_->OnDidSwap(source_frame_number, &next_drain_messages_);
|
| }
|
|
|
| void FrameSwapMessageQueue::DidNotSwap(int source_frame_number,
|
| cc::SwapPromise::DidNotSwapReason reason,
|
| ScopedVector<IPC::Message>* messages) {
|
| base::AutoLock lock(lock_);
|
| - switch (reason) {
|
| - case cc::SwapPromise::SWAP_FAILS:
|
| - case cc::SwapPromise::COMMIT_NO_UPDATE:
|
| - swap_queue_->DrainMessages(source_frame_number, messages);
|
| - // fallthrough
|
| - case cc::SwapPromise::COMMIT_FAILS:
|
| - visual_state_queue_->DrainMessages(source_frame_number, messages);
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - }
|
| + swap_queue_->OnDidNotSwap(source_frame_number, reason, messages);
|
| + visual_state_queue_->OnDidNotSwap(source_frame_number, reason, messages);
|
| }
|
|
|
| void FrameSwapMessageQueue::DrainMessages(
|
| ScopedVector<IPC::Message>* messages) {
|
| lock_.AssertAcquired();
|
|
|
| - swap_queue_->DrainMessages(0, messages);
|
| - messages->insert(messages->end(),
|
| - next_drain_messages_.begin(),
|
| + swap_queue_->OnDrainMessages(messages);
|
| + visual_state_queue_->OnDrainMessages(messages);
|
| + messages->insert(messages->end(), next_drain_messages_.begin(),
|
| next_drain_messages_.end());
|
| next_drain_messages_.weak_clear();
|
| }
|
|
|