Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
106 commits
Select commit Hold shift + click to select a range
d36a55d
Rebase
dkwingsmt Jun 30, 2023
3812621
Rename vars and fix fuchsia compile
dkwingsmt Jun 30, 2023
b1b68eb
Revert window metric changes
dkwingsmt Jul 5, 2023
5e036d8
Apply suggestions from code review
dkwingsmt Jul 6, 2023
ba42c07
Merge remote-tracking branch 'origin/main' into mv-window-metrics
dkwingsmt Jul 6, 2023
fba2c7c
Doc enable_implicit_view
dkwingsmt Jul 6, 2023
d7c6510
Better platConfig structure for adding window
dkwingsmt Jul 6, 2023
968c7e9
Merge remote-tracking branch 'origin/main' into mv-window-metrics
dkwingsmt Jul 10, 2023
752a0a4
Merge remote-tracking branch 'origin/main' into mv-window-metrics
dkwingsmt Jul 10, 2023
c912775
Merge remote-tracking branch 'origin/main' into mv-window-metrics
dkwingsmt Jul 20, 2023
2a87664
Fix compile
dkwingsmt Jul 23, 2023
adf5b8f
Doc for implicit view
dkwingsmt Jul 23, 2023
f1a497b
Two tests
dkwingsmt Jul 24, 2023
f31f60c
Remove platform data view metrics
dkwingsmt Jul 24, 2023
9d68f3c
Extract function
dkwingsmt Jul 24, 2023
7af9496
Docs and address comments
dkwingsmt Jul 24, 2023
2e539c6
One more sentence
dkwingsmt Jul 24, 2023
d20363e
Merge remote-tracking branch 'origin/main' into mv-window-metrics
dkwingsmt Jul 24, 2023
3d5a190
AddRemoveView test
dkwingsmt Jul 25, 2023
ba845c7
Merge remote-tracking branch 'origin/main' into mv-window-metrics
dkwingsmt Jul 25, 2023
4fc4922
Remove expected size on removal
dkwingsmt Jul 25, 2023
db9a99c
More docs
dkwingsmt Jul 25, 2023
a098175
Merge remote-tracking branch 'origin/main' into mv-window-metrics
dkwingsmt Jul 25, 2023
2128688
Assign viewId not bool. Move viewId to settings.h.
dkwingsmt Jul 25, 2023
4f049cd
Remove more implicit view ID
dkwingsmt Jul 25, 2023
c795035
Fix compile, prefix view id with flutter
dkwingsmt Jul 25, 2023
03520e2
Address many comments
dkwingsmt Jul 26, 2023
285c0f6
Correct FlushRuntimeStateToIsolate and PlatformData
dkwingsmt Jul 27, 2023
9c92de2
AddView specifies view config
dkwingsmt Jul 27, 2023
86bd921
Merge remote-tracking branch 'origin/main' into mv-window-metrics
dkwingsmt Jul 27, 2023
a898834
Remove ImplicitViewEnabled from more and lint
dkwingsmt Jul 27, 2023
2ff8609
Fix test and lint
dkwingsmt Jul 28, 2023
c61cf67
Fix tests?
dkwingsmt Jul 31, 2023
d9fc2a5
Shell Add/RemoveView blocking
dkwingsmt Aug 1, 2023
e99900a
Merge remote-tracking branch 'origin/main' into mv-window-metrics
dkwingsmt Aug 1, 2023
89755d2
Implement Rasterizer::CollectView
dkwingsmt Aug 1, 2023
42db5c3
Flushing test
dkwingsmt Aug 1, 2023
164ca90
Add TODO doc
dkwingsmt Aug 1, 2023
3e2902b
doc for implicit view ID.
dkwingsmt Aug 1, 2023
26d3cbe
Better doc
dkwingsmt Aug 1, 2023
8db91df
Bring back docs
dkwingsmt Aug 1, 2023
8d718d5
Merge remote-tracking branch 'origin/main' into mv-window-metrics
dkwingsmt Aug 1, 2023
0d3f6fb
Merge remote-tracking branch 'origin/main' into mv-window-metrics
dkwingsmt Aug 1, 2023
5cb56f8
Trivial comments
dkwingsmt Aug 3, 2023
6264164
Use TODO issue; solve lint
dkwingsmt Aug 3, 2023
a1b0740
Simplify implicit view init, add assertion
dkwingsmt Aug 4, 2023
b3284aa
Doc
dkwingsmt Aug 4, 2023
a7e033b
WIP
dkwingsmt Aug 4, 2023
2fb045b
Comments
dkwingsmt Aug 4, 2023
257f7cc
Merge remote-tracking branch 'origin/main' into mv-window-metrics
dkwingsmt Aug 4, 2023
9bb1d75
RemoveView no longer blocks
dkwingsmt Aug 4, 2023
90020f4
Fix compile
dkwingsmt Aug 5, 2023
ed46975
Compilable
dkwingsmt Aug 7, 2023
eb00183
Merge remote-tracking branch 'origin/main' into mv-pipeline
dkwingsmt Aug 7, 2023
7c24ab8
Merge remote-tracking branch 'origin/main' into mv-window-metrics
dkwingsmt Aug 7, 2023
4e2d39a
Merge branch 'mv-window-metrics' into mv-pipeline
dkwingsmt Aug 7, 2023
a3b7567
Merge remote-tracking branch 'origin/main' into mv-pipeline
dkwingsmt Aug 11, 2023
5c7c313
Merge remote-tracking branch 'origin/main' into mv-pipeline
dkwingsmt Aug 15, 2023
9b6210e
Merge remote-tracking branch 'origin/main' into mv-pipeline
dkwingsmt Aug 31, 2023
9c888ec
Clear changes
dkwingsmt Aug 31, 2023
8d14e6d
More clear patch
dkwingsmt Aug 31, 2023
29aea0a
lint
dkwingsmt Sep 2, 2023
3f17841
Merge remote-tracking branch 'dkwingsmt/mv-pipeline' into mv-pipeline
dkwingsmt Sep 5, 2023
6589d45
Merge remote-tracking branch 'origin/main' into mv-pipeline
dkwingsmt Sep 5, 2023
a762a11
Merge remote-tracking branch 'origin/main' into mv-pipeline
dkwingsmt Sep 5, 2023
2bead3f
Merge remote-tracking branch 'origin/main' into mv-pipeline
dkwingsmt Sep 22, 2023
50b7031
Merge changes with mv-rasterizer
dkwingsmt Sep 22, 2023
f08c963
Remove unneeded include
dkwingsmt Sep 22, 2023
87c73c4
Merge remote-tracking branch 'origin/main' into mv-pipeline
dkwingsmt Sep 29, 2023
2a5a715
Merge remote-tracking branch 'origin/main' into mv-pipeline
dkwingsmt Oct 4, 2023
b74574b
assert frame_timings_recorder is not null in render
dkwingsmt Oct 4, 2023
a705321
Fix many shell tests
dkwingsmt Oct 6, 2023
7f7d0ad
Merge remote-tracking branch 'origin/main' into mv-pipeline
dkwingsmt Oct 6, 2023
a0dd49a
Refactor PumpOneFrame
dkwingsmt Oct 7, 2023
629ea33
Fix lint
dkwingsmt Oct 8, 2023
02ba1b9
Doc, and logs
dkwingsmt Oct 8, 2023
29972e0
Add debug logs
dkwingsmt Oct 8, 2023
dfbd19e
Wait for 2 frames
dkwingsmt Oct 9, 2023
b792ff7
Add more logs
dkwingsmt Oct 9, 2023
be6804b
Fix
dkwingsmt Oct 9, 2023
25cf6f5
Fix two more tests
dkwingsmt Oct 9, 2023
34bf49a
Merge remote-tracking branch 'origin/main' into mv-pipeline
dkwingsmt Oct 9, 2023
0c2f053
Fix compile
dkwingsmt Oct 9, 2023
862a318
Remove logs
dkwingsmt Oct 9, 2023
56cd636
Better fix secondary vsync test
dkwingsmt Oct 9, 2023
1f411ec
Run engine for the first time
dkwingsmt Oct 9, 2023
6cec636
Test complete
dkwingsmt Oct 10, 2023
8021575
Remove postsync
dkwingsmt Oct 10, 2023
ae3e06e
Add docs and fix a lint
dkwingsmt Oct 10, 2023
b037f9a
Add log
dkwingsmt Oct 10, 2023
4f34de0
Fix compile
dkwingsmt Oct 10, 2023
1b21cea
Use another way to fix secondary vsync test
dkwingsmt Oct 10, 2023
181a94b
Fix lint
dkwingsmt Oct 10, 2023
3523e91
Double test started
dkwingsmt Oct 10, 2023
e7bd8fe
Merge remote-tracking branch 'origin/main' into mv-pipeline
dkwingsmt Oct 10, 2023
7a1436d
Fix lint
dkwingsmt Oct 10, 2023
918cf19
Pretty string state
dkwingsmt Oct 12, 2023
199ff4a
EngineContext
dkwingsmt Oct 16, 2023
55b57b2
Remove some params
dkwingsmt Oct 16, 2023
9544da9
Move to engine test
dkwingsmt Oct 16, 2023
4c9a11a
Move mock up
dkwingsmt Oct 16, 2023
39dfbc6
Verify view ID
dkwingsmt Oct 16, 2023
fc44a61
Merge remote-tracking branch 'origin/main' into mv-pipeline
dkwingsmt Oct 19, 2023
d52f4f6
Fix some lint
dkwingsmt Oct 19, 2023
3a9cfb1
Fix clang tidy
dkwingsmt Oct 19, 2023
d570066
Fix test
dkwingsmt Oct 20, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Merge remote-tracking branch 'origin/main' into mv-pipeline
  • Loading branch information
dkwingsmt committed Oct 4, 2023
commit 2a5a715f6d8ac7832062cfb0cf23f2d1e04fd0d1
7 changes: 6 additions & 1 deletion flow/layers/layer_tree.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,18 +96,23 @@ class LayerTree {

// The information to draw a layer tree to a specified view.
struct LayerTreeTask {
public:
LayerTreeTask(int64_t view_id,
std::unique_ptr<LayerTree> layer_tree,
float device_pixel_ratio)
: view_id(view_id),
layer_tree(std::move(layer_tree)),
device_pixel_ratio(device_pixel_ratio) {}
/// The target view to drawn to.

/// The target view to draw to.
int64_t view_id;
/// The target layer tree to be drawn.
std::unique_ptr<LayerTree> layer_tree;
/// The pixel ratio of the target view.
float device_pixel_ratio;

private:
FML_DISALLOW_COPY_AND_ASSIGN(LayerTreeTask);
};

} // namespace flutter
Expand Down
4 changes: 2 additions & 2 deletions shell/common/animator.cc
Original file line number Diff line number Diff line change
Expand Up @@ -177,8 +177,8 @@ void Animator::Render(int64_t view_id,
delegate_.OnAnimatorUpdateLatestFrameTargetTime(
frame_timings_recorder_->GetVsyncTargetTime());

layer_trees_tasks_.emplace_back(view_id, std::move(layer_tree),
device_pixel_ratio);
layer_trees_tasks_.push_back(std::make_unique<LayerTreeTask>(
view_id, std::move(layer_tree), device_pixel_ratio));
}

const std::weak_ptr<VsyncWaiter> Animator::GetVsyncWaiter() const {
Expand Down
4 changes: 2 additions & 2 deletions shell/common/animator.h
Original file line number Diff line number Diff line change
Expand Up @@ -100,13 +100,13 @@ class Animator final {
std::shared_ptr<VsyncWaiter> waiter_;

std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder_;
std::list<LayerTreeTask> layer_trees_tasks_;
std::vector<std::unique_ptr<LayerTreeTask>> layer_trees_tasks_;
uint64_t frame_request_number_ = 1;
fml::TimeDelta dart_frame_deadline_;
std::shared_ptr<FramePipeline> layer_tree_pipeline_;
fml::Semaphore pending_frame_semaphore_;
FramePipeline::ProducerContinuation producer_continuation_;
bool regenerate_layer_tree_ = false;
bool regenerate_layer_trees_ = false;
bool frame_scheduled_ = false;
std::deque<uint64_t> trace_flow_ids_;
bool has_rendered_ = false;
Expand Down
56 changes: 12 additions & 44 deletions shell/common/rasterizer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ void Rasterizer::DrawLastLayerTrees(
}
}

RasterStatus Rasterizer::Draw(const std::shared_ptr<FramePipeline>& pipeline) {
DrawStatus Rasterizer::Draw(const std::shared_ptr<FramePipeline>& pipeline) {
TRACE_EVENT0("flutter", "GPURasterizer::Draw");
if (raster_thread_merger_ &&
!raster_thread_merger_->IsOnRasterizingThread()) {
Expand All @@ -239,29 +239,11 @@ RasterStatus Rasterizer::Draw(const std::shared_ptr<FramePipeline>& pipeline) {
->RunsTasksOnCurrentThread());

DoDrawResult draw_result;
FramePipeline::Consumer consumer =
[&draw_result, this,
&delegate = delegate_](std::unique_ptr<FrameItem> item) {
// TODO(dkwingsmt): The rasterizer only supports rendering a single view
// and that view must be the implicit view. Properly support multi-view
// in the future.
FML_DCHECK(item->layer_tree_tasks.size() <= 1u);
if (item->layer_tree_tasks.empty()) {
return;
}
auto& task = item->layer_tree_tasks.front();
FML_DCHECK(task.view_id == kFlutterImplicitViewId);
std::unique_ptr<LayerTree> layer_tree = std::move(task.layer_tree);
std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder =
std::move(item->frame_timings_recorder);
float device_pixel_ratio = task.device_pixel_ratio;
if (delegate.ShouldDiscardLayerTree(task.view_id, *layer_tree.get())) {
draw_result.raster_status = RasterStatus::kDiscarded;
} else {
draw_result = DoDraw(std::move(frame_timings_recorder),
std::move(layer_tree), device_pixel_ratio);
}
};
FramePipeline::Consumer consumer = [&draw_result,
this](std::unique_ptr<FrameItem> item) {
draw_result = DoDraw(std::move(item->frame_timings_recorder),
std::move(item->layer_tree_tasks));
};

PipelineConsumeResult consume_result = pipeline->Consume(consumer);
if (consume_result == PipelineConsumeResult::NoneAvailable) {
Expand Down Expand Up @@ -465,26 +447,12 @@ Rasterizer::DoDrawResult Rasterizer::DoDraw(
PersistentCache* persistent_cache = PersistentCache::GetCacheForProcess();
persistent_cache->ResetStoredNewShaders();

RasterStatus raster_status =
DrawToSurface(*frame_timings_recorder, *layer_tree, device_pixel_ratio);
if (raster_status == RasterStatus::kSuccess) {
last_layer_tree_ = std::move(layer_tree);
last_device_pixel_ratio_ = device_pixel_ratio;
} else if (ShouldResubmitFrame(raster_status)) {
std::list<LayerTreeTask> resubmitted_tasks;
resubmitted_tasks.emplace_back(kFlutterImplicitViewId,
std::move(layer_tree), device_pixel_ratio);
return DoDrawResult{
.raster_status = raster_status,
.resubmitted_item = std::make_unique<FrameItem>(
std::move(resubmitted_tasks),
frame_timings_recorder->CloneUntil(
FrameTimingsRecorder::State::kBuildEnd)),
};
} else if (raster_status == RasterStatus::kDiscarded) {
return DoDrawResult{
.raster_status = raster_status,
};
DoDrawResult result =
DrawToSurfaces(*frame_timings_recorder, std::move(tasks));

FML_DCHECK(result.status != DoDrawStatus::kEnqueuePipeline);
if (result.status == DoDrawStatus::kGpuUnavailable) {
return DoDrawResult{DoDrawStatus::kGpuUnavailable};
}

if (persistent_cache->IsDumpingSkp() &&
Expand Down
82 changes: 79 additions & 3 deletions shell/common/rasterizer.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,49 @@ class AiksContext;

namespace flutter {

// The result status of Rasterizer::Draw. This is only used for unit tests.
enum class DrawStatus {
// The drawing was done without any specified status.
kDone,
// Failed to rasterize the frame because the Rasterizer is not set up.
kNotSetUp,
// Nothing was done, because the call was not on the raster thread. Yielded to
// let this frame be serviced on the right thread.
kYielded,
// Nothing was done, because the pipeline was empty.
kPipelineEmpty,
// Nothing was done, because the GPU was unavailable.
kGpuUnavailable,
};

// The result status of drawing to a view. This is only used for unit tests.
enum class DrawSurfaceStatus {
// The layer tree was successfully rasterized.
kSuccess,
// The layer tree must be submitted again.
//
// This can occur on Android when switching the background surface to
// FlutterImageView. On Android, the first frame doesn't make the image
// available to the ImageReader right away. The second frame does.
// TODO(egarciad): https://github.com/flutter/flutter/issues/65652
//
// This can also occur when the frame is dropped to wait for the thread
// merger to merge the raster and platform threads.
kRetry,
// Failed to rasterize the frame.
kFailed,
// Layer tree was discarded because its size does not match the view size.
// This typically occurs during resizing.
kDiscarded,
};

// The information to draw to all views of a frame.
struct FrameItem {
FrameItem(std::list<LayerTreeTask> tasks,
FrameItem(std::vector<std::unique_ptr<LayerTreeTask>> tasks,
std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder)
: layer_tree_tasks(std::move(tasks)),
frame_timings_recorder(std::move(frame_timings_recorder)) {}
std::list<LayerTreeTask> layer_tree_tasks;
std::vector<std::unique_ptr<LayerTreeTask>> layer_tree_tasks;
std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder;
};

Expand Down Expand Up @@ -301,7 +337,7 @@ class Rasterizer final : public SnapshotDelegate,
/// @param[in] pipeline The layer tree pipeline to take the next layer tree
/// to render from.
///
RasterStatus Draw(const std::shared_ptr<FramePipeline>& pipeline);
DrawStatus Draw(const std::shared_ptr<FramePipeline>& pipeline);

//----------------------------------------------------------------------------
/// @brief The type of the screenshot to obtain of the previously
Expand Down Expand Up @@ -533,9 +569,49 @@ class Rasterizer final : public SnapshotDelegate,
///
bool IsTornDown();

//----------------------------------------------------------------------------
/// @brief Returns the last status of drawing the specific view.
///
/// This method is used only in unit tests.
///
std::optional<DrawSurfaceStatus> GetLastDrawStatus(int64_t view_id);

private:
// The result status of DoDraw, DrawToSurfaces, and DrawToSurfacesUnsafe.
enum class DoDrawStatus {
// The drawing was done without any specified status.
kDone,
// Frame has been successfully rasterized, but there are additional items
// in the pipeline waiting to be consumed. This is currently only used when
// thread configuration change occurs.
kEnqueuePipeline,
// Failed to rasterize the frame because the Rasterizer is not set up.
kNotSetUp,
// Nothing was done, because GPU was unavailable.
kGpuUnavailable,
};

// The result of DoDraw.
struct DoDrawResult {
// The overall status of the drawing process.
//
// The status of drawing a specific view is available at GetLastDrawStatus.
DoDrawStatus status = DoDrawStatus::kDone;

// The frame item that needs to be submitted again.
//
// See RasterStatus::kResubmit and kSkipAndRetry for when it happens.
//
// If `resubmitted_item` is not null, its `tasks` is guaranteed to be
// non-empty.
std::unique_ptr<FrameItem> resubmitted_item;
};

struct ViewRecord {
std::unique_ptr<LayerTreeTask> last_successful_task;
std::optional<DrawSurfaceStatus> last_draw_status;
};

// |SnapshotDelegate|
std::unique_ptr<GpuImageResult> MakeSkiaGpuImage(
sk_sp<DisplayList> display_list,
Expand Down
7 changes: 4 additions & 3 deletions shell/common/rasterizer_unittests.cc
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,13 @@ namespace {
constexpr float kDevicePixelRatio = 2.0f;
constexpr int64_t kImplicitViewId = 0;

std::list<LayerTreeTask> SingleLayerTreeList(
std::vector<std::unique_ptr<LayerTreeTask>> SingleLayerTreeList(
int64_t view_id,
std::unique_ptr<LayerTree> layer_tree,
float pixel_ratio) {
std::list<LayerTreeTask> tasks;
tasks.emplace_back(view_id, std::move(layer_tree), pixel_ratio);
std::vector<std::unique_ptr<LayerTreeTask>> tasks;
tasks.push_back(std::make_unique<LayerTreeTask>(
view_id, std::move(layer_tree), pixel_ratio));
return tasks;
}

Expand Down
You are viewing a condensed version of this merge commit. You can view the full changes here.