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(); |
} |