Chromium Code Reviews| Index: cc/trees/draw_property_utils.cc |
| diff --git a/cc/trees/draw_property_utils.cc b/cc/trees/draw_property_utils.cc |
| index 6899816caee13f3def3c77fd030cb72cb6760f26..de3505cc8866156d1f2f78cc7b41e382344c1bc3 100644 |
| --- a/cc/trees/draw_property_utils.cc |
| +++ b/cc/trees/draw_property_utils.cc |
| @@ -204,20 +204,6 @@ void CalculateVisibleRects(const std::vector<LayerType*>& visible_layer_list, |
| } |
| template <typename LayerType> |
| -static bool IsRootLayerOfNewRenderingContext(LayerType* layer) { |
| - if (layer->parent()) |
| - return !layer->parent()->Is3dSorted() && layer->Is3dSorted(); |
| - return layer->Is3dSorted(); |
| -} |
| - |
| -template <typename LayerType> |
| -static inline bool LayerIsInExisting3DRenderingContext(LayerType* layer) { |
| - return layer->Is3dSorted() && layer->parent() && |
| - layer->parent()->Is3dSorted() && |
| - layer->parent()->sorting_context_id() == layer->sorting_context_id(); |
| -} |
| - |
| -template <typename LayerType> |
| static bool TransformToScreenIsKnown(LayerType* layer, |
| const TransformTree& tree) { |
| const TransformNode* node = tree.Node(layer->transform_tree_index()); |
| @@ -242,8 +228,17 @@ static bool IsLayerBackFaceVisible(LayerType* layer, |
| // rendering context" or not. For Chromium code, we can determine whether we |
| // are in a 3d rendering context by checking if the parent preserves 3d. |
| - if (LayerIsInExisting3DRenderingContext(layer)) |
| + const TransformNode* node = tree.Node(layer->transform_tree_index()); |
| + const TransformNode* parent_node = tree.parent(node); |
| + const bool is_3d_sorted = (node->data.sorting_context_id != 0); |
| + const bool no_transfrom_node_created = (layer->id() != node->owner_id); |
| + const bool parent_also_in_same_rendering_context = |
| + parent_node && |
| + parent_node->data.sorting_context_id == node->data.sorting_context_id; |
| + if (is_3d_sorted && |
| + (no_transfrom_node_created || parent_also_in_same_rendering_context)) { |
| return DrawTransformFromPropertyTrees(layer, tree).IsBackFaceVisible(); |
| + } |
| // In this case, either the layer establishes a new 3d rendering context, or |
| // is not in a 3d rendering context at all. |
| @@ -255,8 +250,16 @@ static bool IsSurfaceBackFaceVisible(LayerType* layer, |
| const TransformTree& tree) { |
| if (HasSingularTransform(layer, tree)) |
| return false; |
| - if (LayerIsInExisting3DRenderingContext(layer)) { |
| - const TransformNode* node = tree.Node(layer->transform_tree_index()); |
| + const TransformNode* node = tree.Node(layer->transform_tree_index()); |
| + // If the render_surface is not part of a new or existing rendering context, |
| + // then the layers that contribute to this surface will decide back-face |
| + // visibility for themselves. |
| + if (!node->data.sorting_context_id) |
| + return false; |
| + |
| + const TransformNode* parent_node = tree.parent(node); |
| + if (parent_node && |
| + parent_node->data.sorting_context_id == node->data.sorting_context_id) { |
| // Draw transform as a contributing render surface. |
| // TODO(enne): we shouldn't walk the tree during a tree walk. |
| gfx::Transform surface_draw_transform; |
| @@ -265,13 +268,9 @@ static bool IsSurfaceBackFaceVisible(LayerType* layer, |
| return surface_draw_transform.IsBackFaceVisible(); |
| } |
| - if (IsRootLayerOfNewRenderingContext(layer)) |
| - return layer->transform().IsBackFaceVisible(); |
| - |
| - // If the render_surface is not part of a new or existing rendering context, |
| - // then the layers that contribute to this surface will decide back-face |
| - // visibility for themselves. |
| - return false; |
| + // We use layer's transform to determine back face visibility when its the |
|
ajuma
2016/01/28 00:08:35
typo: "it's"
|
| + // root of a new rendering context. |
| + return layer->transform().IsBackFaceVisible(); |
| } |
| template <typename LayerType> |