#include "flutter/shell/common/shell_io_manager.h"
#include "flutter/fml/message_loop.h"
#include "flutter/shell/common/persistent_cache.h"
#include "include/gpu/gl/GrGLInterface.h"
namespace flutter {
sk_sp<GrContext> ShellIOManager::CreateCompatibleResourceLoadingContext(
GrBackend backend,
sk_sp<const GrGLInterface> gl_interface) {
if (backend != GrBackend::kOpenGL_GrBackend) {
return nullptr;
}
GrContextOptions options = {};
options.fPersistentCache = PersistentCache::GetCacheForProcess();
options.fDisableGpuYUVConversion = true;
options.fPreferExternalImagesOverES3 = true;
if (auto context = GrContext::MakeGL(gl_interface, options)) {
context->setResourceCacheLimits(0, 0);
return context;
}
return nullptr;
}
ShellIOManager::ShellIOManager(
sk_sp<GrContext> resource_context,
fml::RefPtr<fml::TaskRunner> unref_queue_task_runner)
: resource_context_(std::move(resource_context)),
resource_context_weak_factory_(
resource_context_ ? std::make_unique<fml::WeakPtrFactory<GrContext>>(
resource_context_.get())
: nullptr),
unref_queue_(fml::MakeRefCounted<flutter::SkiaUnrefQueue>(
std::move(unref_queue_task_runner),
fml::TimeDelta::FromMilliseconds(50))),
weak_factory_(this) {
if (!resource_context_) {
#ifndef OS_FUCHSIA
FML_DLOG(WARNING) << "The IO manager was initialized without a resource "
"context. Async texture uploads will be disabled. "
"Expect performance degradation.";
#endif
}
}
ShellIOManager::~ShellIOManager() {
unref_queue_->Drain(true);
}
void ShellIOManager::NotifyResourceContextAvailable(
sk_sp<GrContext> resource_context) {
if (!resource_context_) {
UpdateResourceContext(std::move(resource_context));
}
}
void ShellIOManager::UpdateResourceContext(sk_sp<GrContext> resource_context) {
resource_context_ = std::move(resource_context);
resource_context_weak_factory_ =
resource_context_ ? std::make_unique<fml::WeakPtrFactory<GrContext>>(
resource_context_.get())
: nullptr;
}
fml::WeakPtr<ShellIOManager> ShellIOManager::GetWeakPtr() {
return weak_factory_.GetWeakPtr();
}
fml::WeakPtr<GrContext> ShellIOManager::GetResourceContext() const {
return resource_context_weak_factory_
? resource_context_weak_factory_->GetWeakPtr()
: fml::WeakPtr<GrContext>();
}
fml::RefPtr<flutter::SkiaUnrefQueue> ShellIOManager::GetSkiaUnrefQueue() const {
return unref_queue_;
}
fml::WeakPtr<IOManager> ShellIOManager::GetWeakIOManager() const {
return weak_factory_.GetWeakPtr();
}
}