| // Copyright 2015 The Cobalt Authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef COBALT_BROWSER_RENDER_TREE_COMBINER_H_ |
| #define COBALT_BROWSER_RENDER_TREE_COMBINER_H_ |
| |
| #include <map> |
| #include <memory> |
| |
| #include "base/optional.h" |
| #include "base/time/time.h" |
| #include "cobalt/renderer/submission.h" |
| |
| namespace cobalt { |
| namespace browser { |
| |
| // Combines rendering layers (such as the main, splash screen, and |
| // debug console). Caches the individual trees as they are produced. |
| // Re-renders when any tree changes. |
| class RenderTreeCombiner { |
| public: |
| // Layer represents the render layer corresponding to the main web |
| // module, the splash screen, or the debug console and are used to |
| // create and submit a combined tree to the RendererModule's |
| // pipeline. Layers are combined in order of the |z_index| specifed |
| // at the Layers' creation. The RenderTreeCombiner stores pointers |
| // to Layers. The Layers are owned by the caller of |
| // RenderTreeCombiner::CreateLayer. |
| class Layer { |
| public: |
| ~Layer(); |
| |
| void Reset() { |
| render_tree_ = base::nullopt; |
| receipt_time_ = base::nullopt; |
| } |
| |
| // Submit render tree to the layer, and specify whether the time |
| // received should be stored. |
| void Submit( |
| const base::Optional<renderer::Submission>& render_tree_submission); |
| |
| bool HasRenderTree() { return !!render_tree_; } |
| |
| // Returns a current submission object that can be passed into a renderer |
| // for rasterization. If the render tree does not exist, this will |
| // return a base::nullopt. |
| base::Optional<renderer::Submission> GetCurrentSubmission(); |
| |
| private: |
| friend class RenderTreeCombiner; |
| |
| explicit Layer(RenderTreeCombiner* render_tree_combiner = NULL); |
| |
| // Returns the current submission time for this particular layer. This is |
| // called by the RenderTreeCombiner on the |timeline_layer_| to determine |
| // which value to pass in as the submission time for the renderer. |
| base::Optional<base::TimeDelta> CurrentTimeOffset(); |
| |
| RenderTreeCombiner* render_tree_combiner_; |
| |
| base::Optional<renderer::Submission> render_tree_; |
| base::Optional<base::TimeTicks> receipt_time_; |
| }; |
| |
| RenderTreeCombiner(); |
| ~RenderTreeCombiner() {} |
| |
| // Create a Layer with a given |z_index|. If a Layer already exists |
| // at |z_index|, return NULL, and no Layer is created. |
| std::unique_ptr<Layer> CreateLayer(int z_index); |
| |
| // Returns a current submission object that can be passed into a renderer |
| // for rasterization. If no layers with render trees exist, this will return |
| // a base::nullopt. |
| base::Optional<renderer::Submission> GetCurrentSubmission(); |
| |
| // Names a single layer as the one responsible for providing the timeline |
| // id and configuration to the output combined render tree. Only a single |
| // layer can be responsible for providing the timeline. |
| void SetTimelineLayer(Layer* layer); |
| |
| private: |
| // Returns true if the specified layer exists in this render tree combiner's |
| // current list of layers (e.g. |layers_|). |
| bool OwnsLayer(Layer* layer); |
| |
| // The layers keyed on their z_index. |
| std::map<int, Layer*> layers_; |
| |
| // Removes a layer from |layers_|. Called by the Layer destructor. |
| void RemoveLayer(const Layer* layer); |
| |
| // Which layer is currently controlling the receipt time submitted to the |
| // rasterizer. |
| RenderTreeCombiner::Layer* timeline_layer_; |
| }; |
| |
| } // namespace browser |
| } // namespace cobalt |
| |
| #endif // COBALT_BROWSER_RENDER_TREE_COMBINER_H_ |