Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
299 changes: 245 additions & 54 deletions impeller/aiks/experimental_canvas.cc

Large diffs are not rendered by default.

16 changes: 13 additions & 3 deletions impeller/aiks/experimental_canvas.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,18 @@

namespace impeller {

struct LazyRenderingConfig {
std::unique_ptr<EntityPassTarget> entity_pass_target;
std::unique_ptr<InlinePassContext> inline_pass_context;

LazyRenderingConfig(ContentContext& renderer,
std::unique_ptr<EntityPassTarget> p_entity_pass_target)
: entity_pass_target(std::move(p_entity_pass_target)) {
inline_pass_context =
std::make_unique<InlinePassContext>(renderer, *entity_pass_target, 0);
}
};

/// This Canvas attempts to translate from display lists to draw calls directly.
///
/// It's not fully implemented yet but if successful it will be replacing the
Expand Down Expand Up @@ -78,10 +90,8 @@ class ExperimentalCanvas : public Canvas {
RenderTarget& render_target_;
const bool requires_readback_;
EntityPassClipStack clip_coverage_stack_;
std::vector<std::unique_ptr<InlinePassContext>> inline_pass_contexts_;
std::vector<std::unique_ptr<EntityPassTarget>> entity_pass_targets_;
std::vector<LazyRenderingConfig> render_passes_;
std::vector<SaveLayerState> save_layer_state_;
std::vector<std::shared_ptr<RenderPass>> render_passes_;

void SetupRenderPass();

Expand Down
4 changes: 4 additions & 0 deletions impeller/aiks/image_filter.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,8 @@ class ImageFilter {
virtual std::shared_ptr<ImageFilter> Clone() const = 0;

virtual void Visit(ImageFilterVisitor& visitor) = 0;

virtual int GetRequiredMipCount() const { return 1; }
};

/*******************************************************************************
Expand All @@ -112,6 +114,8 @@ class BlurImageFilter : public ImageFilter {
// |ImageFilter|
void Visit(ImageFilterVisitor& visitor) override { visitor.Visit(*this); }

int GetRequiredMipCount() const override { return 4; }

private:
Sigma sigma_x_;
Sigma sigma_y_;
Expand Down
10 changes: 6 additions & 4 deletions impeller/display_list/dl_dispatcher.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1313,10 +1313,12 @@ void TextFrameDispatcher::drawTextFrame(
if (text_frame->HasColor()) {
properties.color = paint_.color;
}
renderer_.GetLazyGlyphAtlas()->AddTextFrame(*text_frame, //
matrix_.GetMaxBasisLengthXY(), //
Point(x, y), //
properties //
auto scale =
(matrix_ * Matrix::MakeTranslation(Point(x, y))).GetMaxBasisLengthXY();
renderer_.GetLazyGlyphAtlas()->AddTextFrame(*text_frame, //
scale, //
Point(x, y), //
properties //
);
}

Expand Down
6 changes: 3 additions & 3 deletions impeller/display_list/dl_playground.cc
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
#include "third_party/skia/include/core/SkTypeface.h"
#include "txt/platform.h"

#define ENABLE_EXPERIMENTAL_CANVAS false
#define ENABLE_EXPERIMENTAL_CANVAS true

namespace impeller {

Expand Down Expand Up @@ -56,8 +56,8 @@ bool DlPlayground::OpenPlaygroundHere(DisplayListPlaygroundCallback callback) {

ExperimentalDlDispatcher impeller_dispatcher(
context.GetContentContext(), render_target,
display_list->root_has_backdrop_filter(),
display_list->max_root_blend_mode(), IRect::MakeMaximum());
list->root_has_backdrop_filter(), list->max_root_blend_mode(),
IRect::MakeMaximum());
list->Dispatch(impeller_dispatcher);
impeller_dispatcher.FinishRecording();
context.GetContentContext().GetTransientsBuffer().Reset();
Expand Down
9 changes: 8 additions & 1 deletion impeller/entity/entity_pass_clip_stack.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
// found in the LICENSE file.

#include "impeller/entity/entity_pass_clip_stack.h"
#include "fml/logging.h"
#include "impeller/entity/contents/clip_contents.h"
#include "impeller/entity/contents/content_context.h"
#include "impeller/entity/entity.h"

namespace impeller {
Expand All @@ -22,6 +22,12 @@ EntityPassClipStack::EntityPassClipStack(const Rect& initial_coverage_rect) {
}

std::optional<Rect> EntityPassClipStack::CurrentClipCoverage() const {
if (subpass_state_.empty()) {
return std::nullopt;
}
if (subpass_state_.back().clip_coverage.empty()) {
return std::nullopt;
}
return subpass_state_.back().clip_coverage.back().coverage;
}

Expand All @@ -42,6 +48,7 @@ void EntityPassClipStack::PushSubpass(std::optional<Rect> subpass_coverage,

void EntityPassClipStack::PopSubpass() {
subpass_state_.pop_back();
FML_CHECK(!subpass_state_.empty());
}

const std::vector<ClipCoverageLayer>
Expand Down
6 changes: 4 additions & 2 deletions shell/gpu/gpu_surface_metal_impeller.mm
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

static_assert(!__has_feature(objc_arc), "ARC must be disabled.");

#define ENABLE_EXPERIMENTAL_CANVAS false
#define ENABLE_EXPERIMENTAL_CANVAS true

namespace flutter {

Expand Down Expand Up @@ -293,7 +293,9 @@
fml::MakeCopyable([aiks_context, &display_list, &cull_rect,
&sk_cull_rect](impeller::RenderTarget& render_target) -> bool {
impeller::ExperimentalDlDispatcher impeller_dispatcher(
aiks_context->GetContentContext(), render_target, cull_rect);
aiks_context->GetContentContext(), render_target,
display_list->root_has_backdrop_filter(), display_list->max_root_blend_mode(),
cull_rect);
display_list->Dispatch(impeller_dispatcher, sk_cull_rect);
impeller_dispatcher.FinishRecording();
aiks_context->GetContentContext().GetTransientsBuffer().Reset();
Expand Down