mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
This version does not recycle buffers. It is meant only as an initial solution, and the proper buffer recycling logic has been broken out into a separate change
91 lines
2.3 KiB
C++
91 lines
2.3 KiB
C++
// Copyright 2017 The Chromium 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/content_handler/vulkan_native_rasterizer.h"
|
|
|
|
#include <utility>
|
|
|
|
#include "flutter/vulkan/vulkan_native_surface_magma.h"
|
|
|
|
namespace flutter_runner {
|
|
|
|
VulkanNativeRasterizer::VulkanNativeRasterizer()
|
|
: compositor_context_(nullptr) {
|
|
auto proc_table = ftl::MakeRefCounted<vulkan::VulkanProcTable>();
|
|
|
|
if (!proc_table->HasAcquiredMandatoryProcAddresses()) {
|
|
return;
|
|
}
|
|
|
|
auto native_surface = std::make_unique<vulkan::VulkanNativeSurfaceMagma>();
|
|
|
|
if (!native_surface->IsValid()) {
|
|
return;
|
|
}
|
|
|
|
auto window = std::make_unique<vulkan::VulkanWindow>(
|
|
proc_table, std::move(native_surface));
|
|
|
|
if (!window->IsValid()) {
|
|
return;
|
|
}
|
|
|
|
window_ = std::move(window);
|
|
}
|
|
|
|
VulkanNativeRasterizer::~VulkanNativeRasterizer() = default;
|
|
|
|
bool VulkanNativeRasterizer::IsValid() const {
|
|
return window_ == nullptr ? false : window_->IsValid();
|
|
}
|
|
|
|
void VulkanNativeRasterizer::SetScene(
|
|
fidl::InterfaceHandle<mozart::Scene> scene) {
|
|
// TODO: Composition is currently unsupported using the Vulkan backend.
|
|
}
|
|
|
|
void VulkanNativeRasterizer::Draw(std::unique_ptr<flow::LayerTree> layer_tree,
|
|
ftl::Closure callback) {
|
|
Draw(std::move(layer_tree));
|
|
callback();
|
|
}
|
|
|
|
bool VulkanNativeRasterizer::Draw(std::unique_ptr<flow::LayerTree> layer_tree) {
|
|
if (layer_tree == nullptr) {
|
|
FTL_DLOG(INFO) << "Layer tree was not valid.";
|
|
return false;
|
|
}
|
|
|
|
if (!window_->IsValid()) {
|
|
FTL_DLOG(INFO) << "Vulkan window was not valid.";
|
|
return false;
|
|
}
|
|
|
|
auto surface = window_->AcquireSurface();
|
|
|
|
if (!surface && surface->getCanvas() != nullptr) {
|
|
FTL_DLOG(INFO) << "Could not acquire a vulkan surface.";
|
|
return false;
|
|
}
|
|
|
|
{
|
|
auto compositor_frame = compositor_context_.AcquireFrame(
|
|
window_->GetSkiaGrContext(), // GrContext*
|
|
surface->getCanvas(), // SkCanvas
|
|
true // instrumentation
|
|
);
|
|
|
|
layer_tree->Raster(compositor_frame);
|
|
}
|
|
|
|
if (!window_->SwapBuffers()) {
|
|
FTL_DLOG(INFO) << "Could not swap buffers successfully.";
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
} // namespace flutter_runner
|