OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 20 matching lines...) Expand all Loading... |
31 | 31 |
32 #include "GraphicsContext3D.h" | 32 #include "GraphicsContext3D.h" |
33 #include "LayerRendererChromium.h" | 33 #include "LayerRendererChromium.h" |
34 #include "LayerTilerChromium.h" | 34 #include "LayerTilerChromium.h" |
35 #include "TextStream.h" | 35 #include "TextStream.h" |
36 #include "cc/CCLayerImpl.h" | 36 #include "cc/CCLayerImpl.h" |
37 #include "cc/CCTiledLayerImpl.h" | 37 #include "cc/CCTiledLayerImpl.h" |
38 #include <wtf/CurrentTime.h> | 38 #include <wtf/CurrentTime.h> |
39 | 39 |
40 // Start tiling when the width and height of a layer are larger than this size. | 40 // Start tiling when the width and height of a layer are larger than this size. |
41 static int maxUntiledSize = 510; | 41 static int maxUntiledSize = 512; |
42 | 42 |
43 // When tiling is enabled, use tiles of this dimension squared. | 43 // When tiling is enabled, use tiles of this dimension squared. |
44 static int defaultTileSize = 256; | 44 static int defaultTileSize = 256; |
45 | 45 |
46 using namespace std; | 46 using namespace std; |
47 | 47 |
48 namespace WebCore { | 48 namespace WebCore { |
49 | 49 |
50 TiledLayerChromium::TiledLayerChromium(GraphicsLayerChromium* owner) | 50 TiledLayerChromium::TiledLayerChromium(GraphicsLayerChromium* owner) |
51 : LayerChromium(owner) | 51 : LayerChromium(owner) |
52 , m_tilingOption(AutoTile) | 52 , m_tilingOption(AutoTile) |
53 , m_borderTexels(true) | |
54 { | 53 { |
55 } | 54 } |
56 | 55 |
57 TiledLayerChromium::~TiledLayerChromium() | 56 TiledLayerChromium::~TiledLayerChromium() |
58 { | 57 { |
59 } | 58 } |
60 | 59 |
61 PassRefPtr<CCLayerImpl> TiledLayerChromium::createCCLayerImpl() | 60 PassRefPtr<CCLayerImpl> TiledLayerChromium::createCCLayerImpl() |
62 { | 61 { |
63 return CCTiledLayerImpl::create(this, id()); | 62 return CCTiledLayerImpl::create(this, id()); |
64 } | 63 } |
65 | 64 |
66 void TiledLayerChromium::cleanupResources() | 65 void TiledLayerChromium::cleanupResources() |
67 { | 66 { |
68 m_tiler.clear(); | 67 m_tiler.clear(); |
69 LayerChromium::cleanupResources(); | 68 LayerChromium::cleanupResources(); |
70 } | 69 } |
71 | 70 |
72 void TiledLayerChromium::setLayerRenderer(LayerRendererChromium* layerRenderer) | 71 void TiledLayerChromium::setLayerRenderer(LayerRendererChromium* layerRenderer) |
73 { | 72 { |
74 LayerChromium::setLayerRenderer(layerRenderer); | 73 LayerChromium::setLayerRenderer(layerRenderer); |
75 createTilerIfNeeded(); | 74 createTilerIfNeeded(); |
76 } | 75 } |
77 | 76 |
78 void TiledLayerChromium::updateTileSizeAndTilingOption() | 77 void TiledLayerChromium::updateTileSizeAndTilingOption() |
79 { | 78 { |
80 if (!m_tiler) | 79 if (!m_tiler) |
81 return; | 80 return; |
82 | 81 |
83 const IntSize tileSize(defaultTileSize, defaultTileSize); | 82 const IntSize tileSize(min(defaultTileSize, contentBounds().width()), min(de
faultTileSize, contentBounds().height())); |
84 | 83 |
85 // Tile if both dimensions large, or any one dimension large and the other | 84 // Tile if both dimensions large, or any one dimension large and the other |
86 // extends into a second tile. This heuristic allows for long skinny layers | 85 // extends into a second tile. This heuristic allows for long skinny layers |
87 // (e.g. scrollbars) that are Nx1 tiles to minimize wasted texture space. | 86 // (e.g. scrollbars) that are Nx1 tiles to minimize wasted texture space. |
88 const bool anyDimensionLarge = contentBounds().width() > maxUntiledSize || c
ontentBounds().height() > maxUntiledSize; | 87 const bool anyDimensionLarge = contentBounds().width() > maxUntiledSize || c
ontentBounds().height() > maxUntiledSize; |
89 const bool anyDimensionOneTile = contentBounds().width() <= defaultTileSize
|| contentBounds().height() <= defaultTileSize; | 88 const bool anyDimensionOneTile = contentBounds().width() <= defaultTileSize
|| contentBounds().height() <= defaultTileSize; |
90 const bool autoTiled = anyDimensionLarge && !anyDimensionOneTile; | 89 const bool autoTiled = anyDimensionLarge && !anyDimensionOneTile; |
91 | 90 |
92 bool isTiled; | 91 bool isTiled; |
93 if (m_tilingOption == AlwaysTile) | 92 if (m_tilingOption == AlwaysTile) |
94 isTiled = true; | 93 isTiled = true; |
95 else if (m_tilingOption == NeverTile) | 94 else if (m_tilingOption == NeverTile) |
96 isTiled = false; | 95 isTiled = false; |
97 else | 96 else |
98 isTiled = autoTiled; | 97 isTiled = autoTiled; |
99 | 98 |
100 // Empty tile size tells the tiler to avoid tiling. | 99 IntSize requestedSize = isTiled ? tileSize : contentBounds(); |
101 IntSize requestedSize = isTiled ? tileSize : IntSize(); | |
102 const int maxSize = layerRenderer()->maxTextureSize(); | 100 const int maxSize = layerRenderer()->maxTextureSize(); |
103 IntSize clampedSize = requestedSize.shrunkTo(IntSize(maxSize, maxSize)); | 101 IntSize clampedSize = requestedSize.shrunkTo(IntSize(maxSize, maxSize)); |
104 m_tiler->setTileSize(clampedSize); | 102 m_tiler->setTileSize(clampedSize); |
105 } | 103 } |
106 | 104 |
107 bool TiledLayerChromium::drawsContent() const | 105 bool TiledLayerChromium::drawsContent() const |
108 { | 106 { |
109 if (!m_owner) | 107 if (!m_owner) |
110 return false; | 108 return false; |
111 | 109 |
112 if (!m_tiler) | 110 if (!m_tiler) |
113 return true; | 111 return true; |
114 | 112 |
115 if (m_tilingOption == NeverTile && m_tiler->numTiles() > 1) | 113 if (m_tilingOption == NeverTile && m_tiler->numTiles() > 1) |
116 return false; | 114 return false; |
117 | 115 |
118 return !m_tiler->skipsDraw(); | 116 return !m_tiler->skipsDraw(); |
119 } | 117 } |
120 | 118 |
121 void TiledLayerChromium::createTilerIfNeeded() | 119 void TiledLayerChromium::createTilerIfNeeded() |
122 { | 120 { |
123 if (m_tiler) | 121 if (m_tiler) |
124 return; | 122 return; |
125 | 123 |
126 createTextureUpdaterIfNeeded(); | 124 createTextureUpdaterIfNeeded(); |
127 | 125 |
128 m_tiler = LayerTilerChromium::create( | 126 m_tiler = LayerTilerChromium::create( |
129 layerRenderer(), | 127 layerRenderer(), |
130 IntSize(defaultTileSize, defaultTileSize), | 128 IntSize(defaultTileSize, defaultTileSize), |
131 m_borderTexels ? LayerTilerChromium::HasBorderTexels : LayerTilerChromiu
m::NoBorderTexels); | 129 LayerTilerChromium::HasBorderTexels); |
132 } | 130 } |
133 | 131 |
134 void TiledLayerChromium::updateCompositorResources() | 132 void TiledLayerChromium::updateCompositorResources() |
135 { | 133 { |
136 m_tiler->updateRect(textureUpdater()); | 134 m_tiler->updateRect(textureUpdater()); |
137 } | 135 } |
138 | 136 |
139 void TiledLayerChromium::setTilingOption(TilingOption tilingOption) | 137 void TiledLayerChromium::setTilingOption(TilingOption tilingOption) |
140 { | 138 { |
141 m_tilingOption = tilingOption; | 139 m_tilingOption = tilingOption; |
142 updateTileSizeAndTilingOption(); | 140 updateTileSizeAndTilingOption(); |
143 } | 141 } |
144 | 142 |
145 void TiledLayerChromium::setIsMask(bool isMask) | 143 void TiledLayerChromium::setIsMask(bool isMask) |
146 { | 144 { |
147 m_borderTexels = !isMask; | |
148 setTilingOption(isMask ? NeverTile : AutoTile); | 145 setTilingOption(isMask ? NeverTile : AutoTile); |
149 } | 146 } |
150 | 147 |
151 TransformationMatrix TiledLayerChromium::tilingTransform() const | 148 TransformationMatrix TiledLayerChromium::tilingTransform() const |
152 { | 149 { |
153 TransformationMatrix transform = ccLayerImpl()->drawTransform(); | 150 TransformationMatrix transform = ccLayerImpl()->drawTransform(); |
154 | 151 |
155 if (contentBounds().isEmpty()) | 152 if (contentBounds().isEmpty()) |
156 return transform; | 153 return transform; |
157 | 154 |
(...skipping 23 matching lines...) Expand all Loading... |
181 | 178 |
182 void TiledLayerChromium::dumpLayerProperties(TextStream& ts, int indent) const | 179 void TiledLayerChromium::dumpLayerProperties(TextStream& ts, int indent) const |
183 { | 180 { |
184 LayerChromium::dumpLayerProperties(ts, indent); | 181 LayerChromium::dumpLayerProperties(ts, indent); |
185 writeIndent(ts, indent); | 182 writeIndent(ts, indent); |
186 ts << "skipsDraw: " << (!m_tiler || m_tiler->skipsDraw()) << "\n"; | 183 ts << "skipsDraw: " << (!m_tiler || m_tiler->skipsDraw()) << "\n"; |
187 } | 184 } |
188 | 185 |
189 } | 186 } |
190 #endif // USE(ACCELERATED_COMPOSITING) | 187 #endif // USE(ACCELERATED_COMPOSITING) |
OLD | NEW |