// Copyright 2020 The Dawn Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "dawn_native/PersistentCache.h" #include "common/Assert.h" #include "dawn_native/Device.h" #include "dawn_platform/DawnPlatform.h" namespace dawn::native { PersistentCache::PersistentCache(DeviceBase* device) : mDevice(device), mCache(GetPlatformCache()) { } ScopedCachedBlob PersistentCache::LoadData(const PersistentCacheKey& key) { ScopedCachedBlob blob = {}; if (mCache == nullptr) { return blob; } std::lock_guard lock(mMutex); blob.bufferSize = mCache->LoadData(ToAPI(mDevice), key.data(), key.size(), nullptr, 0); if (blob.bufferSize > 0) { blob.buffer.reset(new uint8_t[blob.bufferSize]); const size_t bufferSize = mCache->LoadData(ToAPI(mDevice), key.data(), key.size(), blob.buffer.get(), blob.bufferSize); ASSERT(bufferSize == blob.bufferSize); return blob; } return blob; } void PersistentCache::StoreData(const PersistentCacheKey& key, const void* value, size_t size) { if (mCache == nullptr) { return; } ASSERT(value != nullptr); ASSERT(size > 0); std::lock_guard lock(mMutex); mCache->StoreData(ToAPI(mDevice), key.data(), key.size(), value, size); } dawn::platform::CachingInterface* PersistentCache::GetPlatformCache() { // TODO(dawn:549): Create a fingerprint of concatenated version strings (ex. Tint commit // hash, Dawn commit hash). This will be used by the client so it may know when to discard // previously cached Dawn objects should this fingerprint change. dawn::platform::Platform* platform = mDevice->GetPlatform(); if (platform != nullptr) { return platform->GetCachingInterface(/*fingerprint*/ nullptr, /*fingerprintSize*/ 0); } return nullptr; } } // namespace dawn::native