1692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi/* 2692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi * Copyright 2015 Google Inc. 3692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi * 4692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi * Use of this source code is governed by a BSD-style license that can be 5692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi * found in the LICENSE file. 6692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi */ 7692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi 87eeba2587760a0802fd2b90765b4fd0e5e895375reed#include "SkBitmapCache.h" 9692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi#include "SkResourceCache.h" 107eeba2587760a0802fd2b90765b4fd0e5e895375reed#include "SkYUVPlanesCache.h" 11692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi 12692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi#define CHECK_LOCAL(localCache, localName, globalName, ...) \ 13692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi ((localCache) ? localCache->localName(__VA_ARGS__) : SkResourceCache::globalName(__VA_ARGS__)) 14692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi 15692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoinamespace { 16692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoistatic unsigned gYUVPlanesKeyNamespaceLabel; 17692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi 18692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoistruct YUVValue { 19692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi SkYUVPlanesCache::Info fInfo; 20692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi SkCachedData* fData; 21692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi}; 22692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi 23692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoistruct YUVPlanesKey : public SkResourceCache::Key { 24692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi YUVPlanesKey(uint32_t genID) 25692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi : fGenID(genID) 26692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi { 277eeba2587760a0802fd2b90765b4fd0e5e895375reed this->init(&gYUVPlanesKeyNamespaceLabel, SkMakeResourceCacheSharedIDForBitmap(genID), 287eeba2587760a0802fd2b90765b4fd0e5e895375reed sizeof(genID)); 29692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi } 30692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi 31692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi uint32_t fGenID; 32692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi}; 33692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi 34692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoistruct YUVPlanesRec : public SkResourceCache::Rec { 35692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi YUVPlanesRec(YUVPlanesKey key, SkCachedData* data, SkYUVPlanesCache::Info* info) 36692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi : fKey(key) 37692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi { 38692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi fValue.fData = data; 39692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi fValue.fInfo = *info; 40692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi fValue.fData->attachToCacheAndRef(); 41692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi } 42d3b65972aad96453ff4510caa3e25a2b847c6d1eBrian Salomon ~YUVPlanesRec() override { 43692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi fValue.fData->detachFromCacheAndUnref(); 44692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi } 45692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi 46692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi YUVPlanesKey fKey; 47692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi YUVValue fValue; 48692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi 4936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const Key& getKey() const override { return fKey; } 5036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein size_t bytesUsed() const override { return sizeof(*this) + fValue.fData->size(); } 51216b643fc77e754a3fabbb0ed397e7cf55d1954dreed const char* getCategory() const override { return "yuv-planes"; } 52216b643fc77e754a3fabbb0ed397e7cf55d1954dreed SkDiscardableMemory* diagnostic_only_getDiscardable() const override { 53216b643fc77e754a3fabbb0ed397e7cf55d1954dreed return fValue.fData->diagnostic_only_getDiscardable(); 54216b643fc77e754a3fabbb0ed397e7cf55d1954dreed } 55692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi 56692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi static bool Visitor(const SkResourceCache::Rec& baseRec, void* contextData) { 57692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi const YUVPlanesRec& rec = static_cast<const YUVPlanesRec&>(baseRec); 58692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi YUVValue* result = static_cast<YUVValue*>(contextData); 59692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi 60692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi SkCachedData* tmpData = rec.fValue.fData; 61692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi tmpData->ref(); 6296fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == tmpData->data()) { 63692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi tmpData->unref(); 64692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi return false; 65692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi } 66692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi result->fData = tmpData; 67692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi result->fInfo = rec.fValue.fInfo; 68692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi return true; 69692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi } 70692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi}; 71692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi} // namespace 72692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi 73692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoiSkCachedData* SkYUVPlanesCache::FindAndRef(uint32_t genID, Info* info, 74692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi SkResourceCache* localCache) { 75692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi YUVValue result; 76692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi YUVPlanesKey key(genID); 77692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi if (!CHECK_LOCAL(localCache, find, Find, key, YUVPlanesRec::Visitor, &result)) { 7896fcdcc219d2a0d3579719b84b28bede76efba64halcanary return nullptr; 79692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi } 809d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanary 81692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi *info = result.fInfo; 82692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi return result.fData; 83692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi} 84692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi 85692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoivoid SkYUVPlanesCache::Add(uint32_t genID, SkCachedData* data, Info* info, 86692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi SkResourceCache* localCache) { 87692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi YUVPlanesKey key(genID); 88385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary return CHECK_LOCAL(localCache, add, Add, new YUVPlanesRec(key, data, info)); 89692135f9689d4dcb5ba91ff8f4899e268c0bfe11sugoi} 90