[chromium] Draw the root/"non-composited content" in compositor side
[WebKit-https.git] / Source / WebCore / platform / graphics / chromium / TiledLayerChromium.cpp
1 /*
2  * Copyright (C) 2011 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27
28 #if USE(ACCELERATED_COMPOSITING)
29
30 #include "TiledLayerChromium.h"
31
32 #include "GraphicsContext3D.h"
33 #include "LayerRendererChromium.h"
34 #include "LayerTilerChromium.h"
35 #include "TextStream.h"
36 #include "cc/CCLayerImpl.h"
37 #include "cc/CCTiledLayerImpl.h"
38 #include <wtf/CurrentTime.h>
39
40 // Start tiling when the width and height of a layer are larger than this size.
41 static int maxUntiledSize = 512;
42
43 // When tiling is enabled, use tiles of this dimension squared.
44 static int defaultTileSize = 256;
45
46 using namespace std;
47
48 namespace WebCore {
49
50 TiledLayerChromium::TiledLayerChromium(GraphicsLayerChromium* owner)
51     : LayerChromium(owner)
52     , m_tilingOption(AutoTile)
53 {
54 }
55
56 TiledLayerChromium::~TiledLayerChromium()
57 {
58 }
59
60 PassRefPtr<CCLayerImpl> TiledLayerChromium::createCCLayerImpl()
61 {
62     return CCTiledLayerImpl::create(id());
63 }
64
65 void TiledLayerChromium::cleanupResources()
66 {
67     m_tiler.clear();
68     LayerChromium::cleanupResources();
69 }
70
71 void TiledLayerChromium::setLayerRenderer(LayerRendererChromium* layerRenderer)
72 {
73     LayerChromium::setLayerRenderer(layerRenderer);
74     createTilerIfNeeded();
75 }
76
77 void TiledLayerChromium::updateTileSizeAndTilingOption()
78 {
79     if (!m_tiler)
80         return;
81
82     const IntSize tileSize(min(defaultTileSize, contentBounds().width()), min(defaultTileSize, contentBounds().height()));
83
84     // Tile if both dimensions large, or any one dimension large and the other
85     // extends into a second tile. This heuristic allows for long skinny layers
86     // (e.g. scrollbars) that are Nx1 tiles to minimize wasted texture space.
87     const bool anyDimensionLarge = contentBounds().width() > maxUntiledSize || contentBounds().height() > maxUntiledSize;
88     const bool anyDimensionOneTile = contentBounds().width() <= defaultTileSize || contentBounds().height() <= defaultTileSize;
89     const bool autoTiled = anyDimensionLarge && !anyDimensionOneTile;
90
91     bool isTiled;
92     if (m_tilingOption == AlwaysTile)
93         isTiled = true;
94     else if (m_tilingOption == NeverTile)
95         isTiled = false;
96     else
97         isTiled = autoTiled;
98
99     IntSize requestedSize = isTiled ? tileSize : contentBounds();
100     const int maxSize = layerRenderer()->maxTextureSize();
101     IntSize clampedSize = requestedSize.shrunkTo(IntSize(maxSize, maxSize));
102     m_tiler->setTileSize(clampedSize);
103 }
104
105 bool TiledLayerChromium::drawsContent() const
106 {
107     if (!m_owner)
108         return false;
109
110     if (!m_tiler)
111         return true;
112
113     if (m_tilingOption == NeverTile && m_tiler->numTiles() > 1)
114         return false;
115
116     return !m_tiler->skipsDraw();
117 }
118
119 void TiledLayerChromium::createTilerIfNeeded()
120 {
121     if (m_tiler)
122         return;
123
124     createTextureUpdaterIfNeeded();
125
126     m_tiler = LayerTilerChromium::create(
127         layerRenderer(),
128         IntSize(defaultTileSize, defaultTileSize),
129         isRootLayer() ? LayerTilerChromium::NoBorderTexels : LayerTilerChromium::HasBorderTexels);
130 }
131
132 void TiledLayerChromium::updateCompositorResources()
133 {
134     m_tiler->updateRect(textureUpdater());
135 }
136
137 void TiledLayerChromium::setTilingOption(TilingOption tilingOption)
138 {
139     m_tilingOption = tilingOption;
140     updateTileSizeAndTilingOption();
141 }
142
143 void TiledLayerChromium::setIsMask(bool isMask)
144 {
145     setTilingOption(isMask ? NeverTile : AutoTile);
146 }
147
148 TransformationMatrix TiledLayerChromium::tilingTransform() const
149 {
150     TransformationMatrix transform = drawTransform();
151
152     if (contentBounds().isEmpty())
153         return transform;
154
155     transform.scaleNonUniform(bounds().width() / static_cast<double>(contentBounds().width()),
156                               bounds().height() / static_cast<double>(contentBounds().height()));
157
158     // Tiler draws with a different origin from other layers.
159     transform.translate(-contentBounds().width() / 2.0, -contentBounds().height() / 2.0);
160
161     transform.translate(-scrollPosition().x(), -scrollPosition().y());
162
163     return transform;
164 }
165
166 void TiledLayerChromium::pushPropertiesTo(CCLayerImpl* layer)
167 {
168     LayerChromium::pushPropertiesTo(layer);
169
170     CCTiledLayerImpl* tiledLayer = static_cast<CCTiledLayerImpl*>(layer);
171     tiledLayer->setTilingTransform(tilingTransform());
172     tiledLayer->setTiler(m_tiler.get());
173 }
174
175 static void writeIndent(TextStream& ts, int indent)
176 {
177     for (int i = 0; i != indent; ++i)
178         ts << "  ";
179 }
180
181 void TiledLayerChromium::dumpLayerProperties(TextStream& ts, int indent) const
182 {
183     LayerChromium::dumpLayerProperties(ts, indent);
184     writeIndent(ts, indent);
185     ts << "skipsDraw: " << (!m_tiler || m_tiler->skipsDraw()) << "\n";
186 }
187
188 }
189 #endif // USE(ACCELERATED_COMPOSITING)