Changeset 90505 in webkit
- Timestamp:
- Jul 6, 2011 3:33:24 PM (13 years ago)
- Location:
- trunk/Source
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r90499 r90505 1 2011-07-06 Adrienne Walker <enne@google.com> 2 3 [chromium] Add compositor texture manager soft limits and lost focus reclaiming 4 https://bugs.webkit.org/show_bug.cgi?id=64009 5 6 Reviewed by James Robinson. 7 8 Add a soft limit for texture memory. Unprotected textures will get 9 reclaimed when above this limit. Increase the hard limit for maximum 10 texture memory as well, now that there is a better heuristic and 11 textures are reclaimed from tabs without focus. 12 13 Landing this for vangelis@chromium.org. 14 15 * platform/graphics/chromium/LayerRendererChromium.cpp: 16 (WebCore::LayerRendererChromium::releaseTextures): 17 (WebCore::LayerRendererChromium::initializeSharedObjects): 18 * platform/graphics/chromium/LayerRendererChromium.h: 19 * platform/graphics/chromium/LayerTilerChromium.cpp: 20 (WebCore::LayerTilerChromium::protectTileTextures): 21 * platform/graphics/chromium/LayerTilerChromium.h: 22 * platform/graphics/chromium/TextureManager.cpp: 23 (WebCore::TextureManager::TextureManager): 24 (WebCore::TextureManager::requestTexture): 25 * platform/graphics/chromium/TextureManager.h: 26 (WebCore::TextureManager::create): 27 1 28 2011-07-06 Pavel Feldman <pfeldman@chromium.org> 2 29 -
trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp
r90492 r90505 66 66 67 67 // FIXME: Make this limit adjustable and give it a useful value. 68 static size_t textureMemoryLimitBytes = 64 * 1024 * 1024; 68 69 // Absolute maximum limit for texture allocations for this instance. 70 static size_t textureMemoryHighLimitBytes = 128 * 1024 * 1024; 71 // Preferred texture size limit. Can be exceeded if needed. 72 static size_t textureMemoryReclaimLimitBytes = 64 * 1024 * 1024; 73 // The maximum texture memory usage when asked to release textures. 74 static size_t textureMemoryLowLimitBytes = 3 * 1024 * 1024; 69 75 70 76 #ifndef NDEBUG … … 200 206 { 201 207 m_rootLayerContentTiler->invalidateRect(dirtyRect); 208 } 209 210 void LayerRendererChromium::releaseTextures() 211 { 212 // Reduces texture memory usage to textureMemoryLowLimitBytes by deleting non root layer 213 // textures. 214 m_rootLayerContentTiler->protectTileTextures(m_viewportVisibleRect); 215 m_textureManager->reduceMemoryToLimit(textureMemoryLowLimitBytes); 216 m_textureManager->unprotectAllTextures(); 202 217 } 203 218 … … 1115 1130 GLC(m_context.get(), m_context->flush()); 1116 1131 1117 m_textureManager = TextureManager::create(m_context.get(), textureMemoryLimitBytes, m_maxTextureSize); 1132 TextureManager::TextureMemoryLimits limits; 1133 limits.upperLimit = textureMemoryHighLimitBytes; 1134 limits.reclaimLimit = textureMemoryReclaimLimitBytes; 1135 m_textureManager = TextureManager::create(m_context.get(), limits, m_maxTextureSize); 1118 1136 return true; 1119 1137 } -
trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.h
r89837 r90505 157 157 bool isCompositorContextLost(); 158 158 159 void releaseTextures(); 160 159 161 #ifndef NDEBUG 160 162 static bool s_inPaintLayerContents; -
trunk/Source/WebCore/platform/graphics/chromium/LayerTilerChromium.cpp
r90260 r90505 227 227 } 228 228 229 void LayerTilerChromium::protectTileTextures(const IntRect& contentRect) 230 { 231 if (contentRect.isEmpty()) 232 return; 233 234 int left, top, right, bottom; 235 contentRectToTileIndices(contentRect, left, top, right, bottom); 236 237 for (int j = top; j <= bottom; ++j) { 238 for (int i = left; i <= right; ++i) { 239 Tile* tile = tileAt(i, j); 240 if (!tile || !tile->texture()->isValid(m_tileSize, GraphicsContext3D::RGBA)) 241 continue; 242 243 tile->texture()->reserve(m_tileSize, GraphicsContext3D::RGBA); 244 } 245 } 246 } 247 229 248 void LayerTilerChromium::prepareToUpdate(const IntRect& contentRect, LayerTextureUpdater* textureUpdater) 230 249 { -
trunk/Source/WebCore/platform/graphics/chromium/LayerTilerChromium.h
r89647 r90505 70 70 71 71 bool skipsDraw() const { return m_skipsDraw; } 72 73 // Reserves all existing and valid tile textures to protect them from being 74 // recycled by the texture manager. 75 void protectTileTextures(const IntRect& contentRect); 72 76 73 77 typedef ProgramBinding<VertexShaderPosTexTransform, FragmentShaderRGBATexAlpha> Program; -
trunk/Source/WebCore/platform/graphics/chromium/TextureManager.cpp
r90260 r90505 39 39 } 40 40 41 TextureManager::TextureManager(GraphicsContext3D* context, size_t memoryLimitBytes, int maxTextureSize)41 TextureManager::TextureManager(GraphicsContext3D* context, const TextureMemoryLimits& memoryLimits, int maxTextureSize) 42 42 : m_context(context) 43 , m_memoryLimit Bytes(memoryLimitBytes)43 , m_memoryLimits(memoryLimits) 44 44 , m_memoryUseBytes(0) 45 45 , m_maxTextureSize(maxTextureSize) … … 98 98 } 99 99 100 boolTextureManager::reduceMemoryToLimit(size_t limit)100 void TextureManager::reduceMemoryToLimit(size_t limit) 101 101 { 102 102 while (m_memoryUseBytes > limit) { … … 113 113 } 114 114 if (!foundCandidate) 115 return false;115 return; 116 116 } 117 return true;118 117 } 119 118 … … 138 137 } 139 138 140 unsigned TextureManager::requestTexture(TextureToken token, IntSize size, unsigned format , bool* newTexture)139 unsigned TextureManager::requestTexture(TextureToken token, IntSize size, unsigned format) 141 140 { 142 141 if (size.width() > m_maxTextureSize || size.height() > m_maxTextureSize) … … 150 149 151 150 size_t memoryRequiredBytes = memoryUseBytes(size, format); 152 if (memoryRequiredBytes > m_memoryLimitBytes || !reduceMemoryToLimit(m_memoryLimitBytes - memoryRequiredBytes)) 151 152 // Reclaim existing unreserved textures to try to stay below the reclaim limit. 153 reduceMemoryToLimit(std::max(m_memoryLimits.reclaimLimit - memoryRequiredBytes, static_cast<size_t>(0))); 154 if (m_memoryUseBytes + memoryRequiredBytes > m_memoryLimits.upperLimit) 153 155 return 0; 154 156 -
trunk/Source/WebCore/platform/graphics/chromium/TextureManager.h
r90260 r90505 41 41 WTF_MAKE_NONCOPYABLE(TextureManager); 42 42 public: 43 static PassOwnPtr<TextureManager> create(GraphicsContext3D* context, size_t memoryLimitBytes, int maxTextureSize) 43 struct TextureMemoryLimits { 44 // Maximum texture allocation size. 45 size_t upperLimit; 46 // Limit over which existing unreserved textures will be reclaimed. 47 size_t reclaimLimit; 48 }; 49 50 static PassOwnPtr<TextureManager> create(GraphicsContext3D* context, const TextureMemoryLimits& memoryLimits, int maxTextureSize) 44 51 { 45 return adoptPtr(new TextureManager(context, memoryLimit Bytes, maxTextureSize));52 return adoptPtr(new TextureManager(context, memoryLimits, maxTextureSize)); 46 53 } 47 54 … … 50 57 bool hasTexture(TextureToken); 51 58 52 unsigned requestTexture(TextureToken, IntSize, unsigned textureFormat , bool* newTexture = 0);59 unsigned requestTexture(TextureToken, IntSize, unsigned textureFormat); 53 60 54 61 void protectTexture(TextureToken); … … 57 64 bool isProtected(TextureToken); 58 65 66 void reduceMemoryToLimit(size_t); 67 59 68 private: 60 TextureManager(GraphicsContext3D*, size_t memoryLimitBytes, int maxTextureSize);69 TextureManager(GraphicsContext3D*, const TextureMemoryLimits&, int maxTextureSize); 61 70 62 71 struct TextureInfo { … … 67 76 }; 68 77 69 bool reduceMemoryToLimit(size_t);70 78 void addTexture(TextureToken, TextureInfo); 71 79 void removeTexture(TextureToken, TextureInfo); … … 77 85 ListHashSet<TextureToken> m_textureLRUSet; 78 86 79 size_t m_memoryLimitBytes;87 TextureMemoryLimits m_memoryLimits; 80 88 size_t m_memoryUseBytes; 81 89 int m_maxTextureSize; -
trunk/Source/WebKit/chromium/ChangeLog
r90497 r90505 1 2011-07-06 Adrienne Walker <enne@google.com> 2 3 [chromium] Add compositor texture manager soft limits and lost focus reclaiming 4 https://bugs.webkit.org/show_bug.cgi?id=64009 5 6 Reviewed by James Robinson. 7 8 Reclaim textures when the tab loses focus. 9 10 * src/WebViewImpl.cpp: 11 (WebKit::WebViewImpl::setVisibilityState): 12 1 13 2011-06-30 Cris Neckar <cdn@chromium.org> 2 14 -
trunk/Source/WebKit/chromium/src/WebViewImpl.cpp
r90185 r90505 2652 2652 void WebViewImpl::setVisibilityState(WebPageVisibilityState visibilityState, 2653 2653 bool isInitialState) { 2654 if (!page()) 2655 return; 2656 2654 2657 #if ENABLE(PAGE_VISIBILITY_API) 2655 if (!page())2656 return;2657 2658 2658 ASSERT(visibilityState == WebPageVisibilityStateVisible 2659 2659 || visibilityState == WebPageVisibilityStateHidden … … 2661 2661 m_page->setVisibilityState(static_cast<PageVisibilityState>(static_cast<int>(visibilityState)), isInitialState); 2662 2662 #endif 2663 2664 #if USE(ACCELERATED_COMPOSITING) 2665 if (isAcceleratedCompositingActive() && visibilityState == WebPageVisibilityStateHidden) 2666 m_layerRenderer->releaseTextures(); 2667 #endif 2663 2668 } 2664 2669
Note: See TracChangeset
for help on using the changeset viewer.