Chromium Code Reviews| Index: blimp/engine/renderer/blimp_remote_compositor_bridge.cc |
| diff --git a/blimp/engine/renderer/blimp_remote_compositor_bridge.cc b/blimp/engine/renderer/blimp_remote_compositor_bridge.cc |
| index 1ebbde0707ef8d5f04ee15a2c638d37b98a6d384..123f53b3ed941d125cbe765b4ec98f6e6e7f3289 100644 |
| --- a/blimp/engine/renderer/blimp_remote_compositor_bridge.cc |
| +++ b/blimp/engine/renderer/blimp_remote_compositor_bridge.cc |
| @@ -21,7 +21,9 @@ BlimpRemoteCompositorBridge::BlimpRemoteCompositorBridge( |
| remote_proto_channel_->SetProtoReceiver(this); |
| } |
| -BlimpRemoteCompositorBridge::~BlimpRemoteCompositorBridge() = default; |
| +BlimpRemoteCompositorBridge::~BlimpRemoteCompositorBridge() { |
| + remote_proto_channel_->SetProtoReceiver(nullptr); |
|
David Trainor- moved to gerrit
2016/11/03 05:34:59
Nice catch.
Khushal
2016/11/03 06:17:28
I'm the one who had missed it earlier. :P There is
|
| +} |
| void BlimpRemoteCompositorBridge::BindToClient( |
| cc::RemoteCompositorBridgeClient* client) { |
| @@ -35,6 +37,10 @@ void BlimpRemoteCompositorBridge::ScheduleMainFrame() { |
| void BlimpRemoteCompositorBridge::ProcessCompositorStateUpdate( |
| std::unique_ptr<cc::CompositorProtoState> compositor_proto_state) { |
| + compositor_proto_state->compositor_message->set_client_state_update_ack( |
| + client_state_update_ack_pending_); |
| + client_state_update_ack_pending_ = false; |
| + |
| remote_proto_channel_->SendCompositorProto( |
| *compositor_proto_state->compositor_message); |
| scheduler_.DidSendFrameUpdateToClient(); |
| @@ -46,12 +52,39 @@ void BlimpRemoteCompositorBridge::ProcessCompositorStateUpdate( |
| void BlimpRemoteCompositorBridge::OnProtoReceived( |
| std::unique_ptr<cc::proto::CompositorMessage> proto) { |
| - DCHECK(proto->frame_ack()); |
| - scheduler_.DidReceiveFrameUpdateAck(); |
| + if (proto->frame_ack()) |
| + scheduler_.DidReceiveFrameUpdateAck(); |
| + |
| + if (proto->has_client_state_update()) { |
| + DCHECK(!client_state_update_ack_pending_); |
| + |
| + client_->ApplyStateUpdateFromClient(proto->client_state_update()); |
| + |
| + // If applying the delta resulted in a frame request, run the main frame |
| + // first so the ack sent to the client includes the frame with the deltas |
| + // applied. |
| + if (scheduler_.needs_frame_update()) { |
| + client_state_update_ack_pending_ = true; |
| + } else { |
| + cc::proto::CompositorMessage message; |
| + message.set_client_state_update_ack(true); |
| + remote_proto_channel_->SendCompositorProto(message); |
| + } |
| + } |
| } |
| void BlimpRemoteCompositorBridge::StartFrameUpdate() { |
| client_->BeginMainFrame(); |
| + |
| + // If the frame resulted in an update to the client, the ack should have gone |
| + // with it. If it is still pending, this means the main frame was aborted so |
| + // send the ack now. |
| + if (client_state_update_ack_pending_) { |
| + client_state_update_ack_pending_ = false; |
| + cc::proto::CompositorMessage message; |
| + message.set_client_state_update_ack(true); |
| + remote_proto_channel_->SendCompositorProto(message); |
| + } |
| } |
| } // namespace engine |