From ccb1175f196982cd9c864893a73877271284a1ef Mon Sep 17 00:00:00 2001 From: Chinmay Garde Date: Wed, 1 Apr 2020 21:17:41 -0700 Subject: [PATCH] Always cache SkSL when using the Metal backend. 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/shell/platform/darwin/ios/ios_context_metal.mm b/shell/platform/darwin/ios/ios_context_metal.mm index eb16aab4a7008..ea5de5988c3b5 100644 --- a/shell/platform/darwin/ios/ios_context_metal.mm +++ b/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 @@ [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)