blob: 34418320b5ddcf0007a66a19f99193a59811bc42 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "flutter/lib/gpu/context.h"
#include <future>
#include "dart_api.h"
#include "flutter/lib/ui/ui_dart_state.h"
#include "fml/make_copyable.h"
#include "tonic/converter/dart_converter.h"
namespace flutter {
IMPLEMENT_WRAPPERTYPEINFO(gpu, Context);
std::shared_ptr<impeller::Context> Context::default_context_;
void Context::SetOverrideContext(std::shared_ptr<impeller::Context> context) {
default_context_ = std::move(context);
}
std::shared_ptr<impeller::Context> Context::GetDefaultContext() {
return default_context_;
}
Context::Context(std::shared_ptr<impeller::Context> context)
: context_(std::move(context)) {}
Context::~Context() = default;
std::shared_ptr<impeller::Context> Context::GetContext() {
return context_;
}
} // namespace flutter
//----------------------------------------------------------------------------
/// Exports
///
Dart_Handle InternalFlutterGpu_Context_InitializeDefault(Dart_Handle wrapper) {
auto dart_state = flutter::UIDartState::Current();
std::shared_ptr<impeller::Context> impeller_context =
flutter::Context::GetDefaultContext();
if (!impeller_context) {
if (!dart_state->IsImpellerEnabled()) {
return tonic::ToDart(
"Flutter GPU requires the Impeller rendering backend to be enabled.");
}
// Grab the Impeller context from the IO manager.
std::promise<std::shared_ptr<impeller::Context>> context_promise;
auto impeller_context_future = context_promise.get_future();
dart_state->GetTaskRunners().GetIOTaskRunner()->PostTask(
fml::MakeCopyable([promise = std::move(context_promise),
io_manager = dart_state->GetIOManager()]() mutable {
promise.set_value(io_manager ? io_manager->GetImpellerContext()
: nullptr);
}));
impeller_context = impeller_context_future.get();
}
if (!impeller_context) {
return tonic::ToDart("Unable to retrieve the Impeller context.");
}
auto res = fml::MakeRefCounted<flutter::Context>(impeller_context);
res->AssociateWithDartWrapper(wrapper);
return Dart_Null();
}