From 165af3205cef8a4155bd9f7b7c454ce5156bc5ea Mon Sep 17 00:00:00 2001 From: Chinmay Garde Date: Thu, 2 Apr 2020 13:00:29 -0700 Subject: [PATCH] Always cache SkSL when using the Metal backend. (flutter/engine#17468) There is no ability to compile shaders online and cache those binaries when using the Metal backend. SkSL caching must always be used. --- .../platform/darwin/ios/ios_context_metal.mm | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/engine/src/flutter/shell/platform/darwin/ios/ios_context_metal.mm b/engine/src/flutter/shell/platform/darwin/ios/ios_context_metal.mm index eb16aab4a70..ea5de5988c3 100644 --- a/engine/src/flutter/shell/platform/darwin/ios/ios_context_metal.mm +++ b/engine/src/flutter/shell/platform/darwin/ios/ios_context_metal.mm @@ -5,10 +5,22 @@ #include "flutter/shell/platform/darwin/ios/ios_context_metal.h" #include "flutter/fml/logging.h" +#include "flutter/shell/common/persistent_cache.h" #include "flutter/shell/platform/darwin/ios/ios_external_texture_metal.h" +#include "third_party/skia/include/gpu/GrContextOptions.h" namespace flutter { +static GrContextOptions CreateMetalGrContextOptions() { + GrContextOptions options = {}; + if (PersistentCache::cache_sksl()) { + options.fShaderCacheStrategy = GrContextOptions::ShaderCacheStrategy::kSkSL; + } + PersistentCache::MarkStrategySet(); + options.fPersistentCache = PersistentCache::GetCacheForProcess(); + return options; +} + IOSContextMetal::IOSContextMetal() { device_.reset([MTLCreateSystemDefaultDevice() retain]); if (!device_) { @@ -25,16 +37,20 @@ IOSContextMetal::IOSContextMetal() { [main_queue_ setLabel:@"Flutter Main Queue"]; + const auto& context_options = CreateMetalGrContextOptions(); + // Skia expect arguments to `MakeMetal` transfer ownership of the reference in for release later // when the GrContext is collected. - main_context_ = GrContext::MakeMetal([device_ retain], [main_queue_ retain]); - resource_context_ = GrContext::MakeMetal([device_ retain], [main_queue_ retain]); + main_context_ = GrContext::MakeMetal([device_ retain], [main_queue_ retain], context_options); + resource_context_ = GrContext::MakeMetal([device_ retain], [main_queue_ retain], context_options); if (!main_context_ || !resource_context_) { FML_DLOG(ERROR) << "Could not create Skia Metal contexts."; return; } + resource_context_->setResourceCacheLimits(0u, 0u); + CVMetalTextureCacheRef texture_cache_raw = NULL; auto cv_return = CVMetalTextureCacheCreate(kCFAllocatorDefault, // allocator NULL, // cache attributes (NULL default)