mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
At a quick glance, one could easily think of the "engine_time" as the GPU thread time and the "frame_time" as the UI thread time because the GPU thread time is mainly spent on the engine while the UI thread time is mainly spent on the Dart framework to generate the frame. But it's actually the other way. The "engine_time" is UI thread time and the "frame_time" is the GPU thread time. To avoid the confusion, rename them to "ui_time" and "raster_time" respectively. I avoided the "gpu_time" because the rasterization may be purely on a CPU backed software Skia backend.
86 lines
2.6 KiB
C++
86 lines
2.6 KiB
C++
// 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/flow/compositor_context.h"
|
|
|
|
#include "flutter/flow/layers/layer_tree.h"
|
|
#include "third_party/skia/include/core/SkCanvas.h"
|
|
|
|
namespace flutter {
|
|
|
|
CompositorContext::CompositorContext() = default;
|
|
|
|
CompositorContext::~CompositorContext() = default;
|
|
|
|
void CompositorContext::BeginFrame(ScopedFrame& frame,
|
|
bool enable_instrumentation) {
|
|
if (enable_instrumentation) {
|
|
frame_count_.Increment();
|
|
raster_time_.Start();
|
|
}
|
|
}
|
|
|
|
void CompositorContext::EndFrame(ScopedFrame& frame,
|
|
bool enable_instrumentation) {
|
|
raster_cache_.SweepAfterFrame();
|
|
if (enable_instrumentation) {
|
|
raster_time_.Stop();
|
|
}
|
|
}
|
|
|
|
std::unique_ptr<CompositorContext::ScopedFrame> CompositorContext::AcquireFrame(
|
|
GrContext* gr_context,
|
|
SkCanvas* canvas,
|
|
ExternalViewEmbedder* view_embedder,
|
|
const SkMatrix& root_surface_transformation,
|
|
bool instrumentation_enabled) {
|
|
return std::make_unique<ScopedFrame>(*this, gr_context, canvas, view_embedder,
|
|
root_surface_transformation,
|
|
instrumentation_enabled);
|
|
}
|
|
|
|
CompositorContext::ScopedFrame::ScopedFrame(
|
|
CompositorContext& context,
|
|
GrContext* gr_context,
|
|
SkCanvas* canvas,
|
|
ExternalViewEmbedder* view_embedder,
|
|
const SkMatrix& root_surface_transformation,
|
|
bool instrumentation_enabled)
|
|
: context_(context),
|
|
gr_context_(gr_context),
|
|
canvas_(canvas),
|
|
view_embedder_(view_embedder),
|
|
root_surface_transformation_(root_surface_transformation),
|
|
instrumentation_enabled_(instrumentation_enabled) {
|
|
context_.BeginFrame(*this, instrumentation_enabled_);
|
|
}
|
|
|
|
CompositorContext::ScopedFrame::~ScopedFrame() {
|
|
context_.EndFrame(*this, instrumentation_enabled_);
|
|
}
|
|
|
|
bool CompositorContext::ScopedFrame::Raster(flutter::LayerTree& layer_tree,
|
|
bool ignore_raster_cache) {
|
|
layer_tree.Preroll(*this, ignore_raster_cache);
|
|
// Clearing canvas after preroll reduces one render target switch when preroll
|
|
// paints some raster cache.
|
|
if (canvas()) {
|
|
canvas()->clear(SK_ColorTRANSPARENT);
|
|
}
|
|
layer_tree.Paint(*this, ignore_raster_cache);
|
|
return true;
|
|
}
|
|
|
|
void CompositorContext::OnGrContextCreated() {
|
|
texture_registry_.OnGrContextCreated();
|
|
raster_cache_.Clear();
|
|
}
|
|
|
|
void CompositorContext::OnGrContextDestroyed() {
|
|
texture_registry_.OnGrContextDestroyed();
|
|
raster_cache_.Clear();
|
|
}
|
|
|
|
} // namespace flutter
|