1/* 2 * Copyright (C) 2013, 2014 Apple 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 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23 * THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#ifndef IOSurfacePool_h 27#define IOSurfacePool_h 28 29#include "ColorSpace.h" 30#include "IntSize.h" 31#include "IntSizeHash.h" 32#include "Timer.h" 33#include <wtf/Deque.h> 34#include <wtf/HashMap.h> 35#include <wtf/NeverDestroyed.h> 36#include <wtf/RetainPtr.h> 37 38#if USE(IOSURFACE) 39 40namespace WebCore { 41 42class IOSurface; 43 44class IOSurfacePool { 45 WTF_MAKE_NONCOPYABLE(IOSurfacePool); 46 WTF_MAKE_FAST_ALLOCATED; 47 friend class NeverDestroyed<IOSurfacePool>; 48 49public: 50 static IOSurfacePool& sharedPool(); 51 52 PassRefPtr<IOSurface> takeSurface(IntSize size, ColorSpace colorSpace); 53 void addSurface(IOSurface*); 54 55 void discardAllSurfaces(); 56 57 void setPoolSize(size_t); 58 59 void showPoolStatistics(); 60 61private: 62 IOSurfacePool(); 63 64 struct CachedSurfaceDetails { 65 CachedSurfaceDetails() 66 : hasMarkedPurgeable(false) 67 { } 68 69 void resetLastUseTime() { lastUseTime = std::chrono::steady_clock::now(); } 70 71 std::chrono::steady_clock::time_point lastUseTime; 72 bool hasMarkedPurgeable; 73 }; 74 75 typedef Deque<RefPtr<IOSurface>> CachedSurfaceQueue; 76 typedef HashMap<IntSize, CachedSurfaceQueue> CachedSurfaceMap; 77 typedef HashMap<IOSurface*, CachedSurfaceDetails> CachedSurfaceDetailsMap; 78 79 void willAddSurface(IOSurface*, bool inUse); 80 void didRemoveSurface(IOSurface*, bool inUse); 81 void didUseSurfaceOfSize(IntSize); 82 83 void insertSurfaceIntoPool(IOSurface*); 84 85 void evict(size_t additionalSize); 86 void tryEvictInUseSurface(); 87 void tryEvictOldestCachedSurface(); 88 89 void scheduleCollectionTimer(); 90 void collectionTimerFired(Timer<IOSurfacePool>&); 91 void collectInUseSurfaces(); 92 bool markOlderSurfacesPurgeable(); 93 94 void platformGarbageCollectNow(); 95 96 Timer<IOSurfacePool> m_collectionTimer; 97 CachedSurfaceMap m_cachedSurfaces; 98 CachedSurfaceQueue m_inUseSurfaces; 99 CachedSurfaceDetailsMap m_surfaceDetails; 100 Vector<IntSize> m_sizesInPruneOrder; 101 102 size_t m_bytesCached; 103 size_t m_inUseBytesCached; 104 size_t m_maximumBytesCached; 105}; 106 107} 108#endif // USE(IOSURFACE) 109 110#endif // IOSurfacePool_h 111