Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef CC_BLIMP_SYNCED_PROPERTY_REMOTE_H_ | |
| 6 #define CC_BLIMP_SYNCED_PROPERTY_REMOTE_H_ | |
| 7 | |
| 8 #include "cc/base/synced_property.h" | |
| 9 | |
| 10 namespace cc { | |
| 11 | |
| 12 // This class is heavily inspired from SyncedProperty and is the equivalent of | |
| 13 // SyncedProperty for synchronizing state between the engine and client in | |
| 14 // remote mode. There are effectively 2 trees on the main thread, the LayerTree | |
| 15 // on the main thread on the engine, and the tree on the main thread on the | |
| 16 // client. | |
| 17 // | |
| 18 // The client main thread tree receives deltas from the impl thread, but must | |
| 19 // synchronize them with the engine main thread before applying them onto the | |
| 20 // the main thread associated state. At the same time there are different sets | |
| 21 // of deltas, the value that was received from the impl thread but has not yet | |
| 22 // been reported to the engine main thread, and the value that has been sent | |
| 23 // to the engine main thread, but a state update with the application of these | |
| 24 // deltas has not been received from the engine. The purpose of this class is to | |
| 25 // track these deltas for deciding what needs to be reported to the main thread | |
| 26 // on the engine, and providing the impl thread with the delta that it should | |
| 27 // apply to its associated state since it could not be reflected in the local | |
| 28 // BeginMainFrame on the client main thread. | |
| 29 // | |
| 30 // Instances of this class are held on the client main thread and have a 1:1 | |
| 31 // mapping with their corresponding SyncedProperty instances. | |
| 32 | |
| 33 // Note: This class currently supports only one set of deltas to be in flight to | |
| 34 // the engine. | |
| 35 template <typename T> | |
| 36 class SyncedPropertyRemote { | |
| 37 public: | |
| 38 SyncedPropertyRemote() = default; | |
| 39 | |
| 40 SyncedPropertyRemote(SyncedPropertyRemote&& other) = default; | |
| 41 | |
| 42 SyncedPropertyRemote& operator=(SyncedPropertyRemote&& other) = default; | |
| 43 | |
| 44 // Push the main thread state from the engine onto the client main thread | |
| 45 // associated state. | |
| 46 void PushFromEngineMainThread( | |
| 47 typename T::ValueType engine_main_thread_value) { | |
| 48 engine_main_base_ = T(engine_main_thread_value); | |
| 49 } | |
| 50 | |
| 51 // Called when an update for changes made on the impl thread was received on | |
| 52 // the client main thread. | |
| 53 // |main_thread_value| holds the updated value on the client main thread. | |
| 54 void UpdateDeltaFromImplThread(typename T::ValueType main_thread_value) { | |
| 55 T delta_from_impl_thread = | |
| 56 T(main_thread_value).InverseCombine(engine_main_base_); | |
| 57 unsent_delta_from_impl_thread_ = | |
| 58 unsent_delta_from_impl_thread_.Combine(delta_from_impl_thread); | |
| 59 } | |
| 60 | |
| 61 // Pull deltas for changes tracked on the client main thread to be sent to the | |
| 62 // engine main thread. | |
| 63 // Each call to this must be followed with a call to DidApplySentDeltaOnEngine | |
| 64 // before another set of deltas can be pulled. | |
| 65 typename T::ValueType PullDeltaForEngineUpdate() { | |
| 66 DCHECK(sent_but_unapplied_delta_from_impl_thread_.get() == | |
|
aelias_OOO_until_Jul13
2016/10/26 04:04:12
DCHECK_EQ
Khushal
2016/10/26 19:02:35
The compiler yells at me if I use this with scroll
| |
| 67 T::Identity().get()); | |
| 68 | |
| 69 T delta_to_send = unsent_delta_from_impl_thread_; | |
| 70 sent_but_unapplied_delta_from_impl_thread_ = delta_to_send; | |
| 71 unsent_delta_from_impl_thread_ = T::Identity(); | |
| 72 return delta_to_send.get(); | |
| 73 } | |
| 74 | |
| 75 // Called when deltas sent to the engine were applied to the main thread state | |
| 76 // on the engine. | |
| 77 void DidApplySentDeltaOnEngine() { | |
| 78 // Pre-emptively apply the deltas that were sent. This is necessary since | |
| 79 // the engine may not send a frame update if the deltas were simply | |
| 80 // reflected back by the engine main thread (equivalent to | |
| 81 // BeginMainFrameAborted between the main and impl thread). | |
| 82 // If the engine did send a frame, we expect the frame to come with the ack | |
| 83 // for the deltas, so the value will be over-written with the engine update | |
| 84 // before being pushed to the impl thread. | |
| 85 engine_main_base_ = | |
| 86 engine_main_base_.Combine(sent_but_unapplied_delta_from_impl_thread_); | |
| 87 sent_but_unapplied_delta_from_impl_thread_ = T::Identity(); | |
| 88 } | |
| 89 | |
| 90 // Returns the delta that was reported to the main thread on the client but | |
| 91 // has not yet been applied to the main thread on the engine. | |
| 92 typename T::ValueType DeltaNotAppliedOnEngine() { | |
| 93 T total_delta_on_client = unsent_delta_from_impl_thread_.Combine( | |
| 94 sent_but_unapplied_delta_from_impl_thread_); | |
| 95 return total_delta_on_client.get(); | |
| 96 } | |
| 97 | |
| 98 typename T::ValueType EngineMain() { return engine_main_base_.get(); } | |
| 99 | |
| 100 private: | |
| 101 // The delta that was applied to the state on the impl thread and received on | |
| 102 // the main thread on the client during BeginMainFrame, but has not yet been | |
| 103 // reported to the main thread on the engine. | |
| 104 T unsent_delta_from_impl_thread_; | |
| 105 | |
| 106 // The delta that was applied to the state on the impl thread and has been | |
| 107 // sent to the main thread on the engine, but has not yet been applied to the | |
| 108 // main thread on the engine. | |
| 109 T sent_but_unapplied_delta_from_impl_thread_; | |
| 110 | |
| 111 // The value as last received from the main thread on the engine. The value on | |
| 112 // the main thread state on the client should always be set to this value, | |
| 113 // outside of the interval when deltas from the impl thread are reported to | |
| 114 // the main thread on the client. | |
| 115 T engine_main_base_; | |
| 116 | |
| 117 DISALLOW_COPY_AND_ASSIGN(SyncedPropertyRemote); | |
| 118 }; | |
| 119 | |
| 120 } // namespace cc | |
| 121 | |
| 122 #endif // CC_BLIMP_SYNCED_PROPERTY_REMOTE_H_ | |
| OLD | NEW |