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 all commits
Commits
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
24 changes: 11 additions & 13 deletions impeller/entity/contents/clip_contents.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

#include "fml/logging.h"
#include "impeller/core/formats.h"
#include "impeller/core/vertex_buffer.h"
#include "impeller/entity/contents/clip_contents.h"
#include "impeller/entity/contents/content_context.h"
#include "impeller/entity/entity.h"
Expand Down Expand Up @@ -160,11 +161,8 @@ bool ClipContents::Render(const ContentContext& renderer,
break;
}
auto points = cover_area.GetPoints();
auto vertices =
VertexBufferBuilder<VS::PerVertexData>{}
.AddVertices({{points[0]}, {points[1]}, {points[2]}, {points[3]}})
.CreateVertexBuffer(renderer.GetTransientsBuffer());
pass.SetVertexBuffer(std::move(vertices));
pass.SetVertexBuffer(
CreateVertexBuffer(points, renderer.GetTransientsBuffer()));

pass.SetPipeline(renderer.GetClipPipeline(options));

Expand Down Expand Up @@ -237,15 +235,15 @@ bool ClipRestoreContents::Render(const ContentContext& renderer,
auto ltrb =
restore_coverage_.value_or(Rect::MakeSize(pass.GetRenderTargetSize()))
.GetLTRB();
VertexBufferBuilder<VS::PerVertexData> vtx_builder;
vtx_builder.AddVertices({
{Point(ltrb[0], ltrb[1])},
{Point(ltrb[2], ltrb[1])},
{Point(ltrb[0], ltrb[3])},
{Point(ltrb[2], ltrb[3])},
});

std::array<VS::PerVertexData, 4> vertices = {
VS::PerVertexData{Point(ltrb[0], ltrb[1])},
VS::PerVertexData{Point(ltrb[2], ltrb[1])},
VS::PerVertexData{Point(ltrb[0], ltrb[3])},
VS::PerVertexData{Point(ltrb[2], ltrb[3])},
};
pass.SetVertexBuffer(
vtx_builder.CreateVertexBuffer(renderer.GetTransientsBuffer()));
CreateVertexBuffer(vertices, renderer.GetTransientsBuffer()));

VS::FrameInfo info;
info.depth = GetShaderClipDepth(entity);
Expand Down
105 changes: 55 additions & 50 deletions impeller/entity/contents/filters/blend_filter_contents.cc
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include "impeller/core/formats.h"
#include "impeller/core/sampler_descriptor.h"
#include "impeller/core/texture_descriptor.h"
#include "impeller/core/vertex_buffer.h"
#include "impeller/entity/contents/anonymous_contents.h"
#include "impeller/entity/contents/content_context.h"
#include "impeller/entity/contents/contents.h"
Expand Down Expand Up @@ -152,14 +153,18 @@ static std::optional<Entity> AdvancedBlend(
auto& host_buffer = renderer.GetTransientsBuffer();

auto size = pass.GetRenderTargetSize();
VertexBufferBuilder<typename VS::PerVertexData> vtx_builder;
vtx_builder.AddVertices({
{Point(0, 0), dst_uvs[0], src_uvs[0]},
{Point(size.width, 0), dst_uvs[1], src_uvs[1]},
{Point(0, size.height), dst_uvs[2], src_uvs[2]},
{Point(size.width, size.height), dst_uvs[3], src_uvs[3]},
});
auto vtx_buffer = vtx_builder.CreateVertexBuffer(host_buffer);

std::array<typename VS::PerVertexData, 4> vertices = {
typename VS::PerVertexData{Point(0, 0), dst_uvs[0], src_uvs[0]},
typename VS::PerVertexData{Point(size.width, 0), dst_uvs[1],
src_uvs[1]},
typename VS::PerVertexData{Point(0, size.height), dst_uvs[2],
src_uvs[2]},
typename VS::PerVertexData{Point(size.width, size.height), dst_uvs[3],
src_uvs[3]},
};
auto vtx_buffer =
CreateVertexBuffer(vertices, renderer.GetTransientsBuffer());

auto options = OptionsFromPass(pass);
options.primitive_type = PrimitiveType::kTriangleStrip;
Expand Down Expand Up @@ -282,16 +287,16 @@ std::optional<Entity> BlendFilterContents::CreateForegroundAdvancedBlend(
using FS = BlendScreenPipeline::FragmentShader;

auto& host_buffer = renderer.GetTransientsBuffer();

auto size = dst_snapshot->texture->GetSize();
VertexBufferBuilder<VS::PerVertexData> vtx_builder;
vtx_builder.AddVertices({
{{0, 0}, {0, 0}, {0, 0}},
{Point(size.width, 0), {1, 0}, {1, 0}},
{Point(0, size.height), {0, 1}, {0, 1}},
{Point(size.width, size.height), {1, 1}, {1, 1}},
});
auto vtx_buffer = vtx_builder.CreateVertexBuffer(host_buffer);

std::array<VS::PerVertexData, 4> vertices = {
VS::PerVertexData{{0, 0}, {0, 0}, {0, 0}},
VS::PerVertexData{Point(size.width, 0), {1, 0}, {1, 0}},
VS::PerVertexData{Point(0, size.height), {0, 1}, {0, 1}},
VS::PerVertexData{Point(size.width, size.height), {1, 1}, {1, 1}},
};
auto vtx_buffer =
CreateVertexBuffer(vertices, renderer.GetTransientsBuffer());

#ifdef IMPELLER_DEBUG
pass.SetCommandLabel(SPrintF("Foreground Advanced Blend Filter (%s)",
Expand Down Expand Up @@ -434,14 +439,15 @@ std::optional<Entity> BlendFilterContents::CreateForegroundPorterDuffBlend(
auto& host_buffer = renderer.GetTransientsBuffer();
auto size = dst_snapshot->texture->GetSize();
auto color = foreground_color.Premultiply();
VertexBufferBuilder<VS::PerVertexData> vtx_builder;
vtx_builder.AddVertices({
{{0, 0}, {0, 0}, color},
{Point(size.width, 0), {1, 0}, color},
{Point(0, size.height), {0, 1}, color},
{Point(size.width, size.height), {1, 1}, color},
});
auto vtx_buffer = vtx_builder.CreateVertexBuffer(host_buffer);

std::array<VS::PerVertexData, 4> vertices = {
VS::PerVertexData{{0, 0}, {0, 0}, color},
VS::PerVertexData{Point(size.width, 0), {1, 0}, color},
VS::PerVertexData{Point(0, size.height), {0, 1}, color},
VS::PerVertexData{Point(size.width, size.height), {1, 1}, color},
};
auto vtx_buffer =
CreateVertexBuffer(vertices, renderer.GetTransientsBuffer());

#ifdef IMPELLER_DEBUG
pass.SetCommandLabel(SPrintF("Foreground PorterDuff Blend Filter (%s)",
Expand Down Expand Up @@ -562,14 +568,14 @@ static std::optional<Entity> PipelineBlend(
FS::BindTextureSampler(pass, input->texture, sampler);

auto size = input->texture->GetSize();
VertexBufferBuilder<VS::PerVertexData> vtx_builder;
vtx_builder.AddVertices({
{Point(0, 0), Point(0, 0)},
{Point(size.width, 0), Point(1, 0)},
{Point(0, size.height), Point(0, 1)},
{Point(size.width, size.height), Point(1, 1)},
});
pass.SetVertexBuffer(vtx_builder.CreateVertexBuffer(host_buffer));
std::array<VS::PerVertexData, 4> vertices = {
VS::PerVertexData{Point(0, 0), Point(0, 0)},
VS::PerVertexData{Point(size.width, 0), Point(1, 0)},
VS::PerVertexData{Point(0, size.height), Point(0, 1)},
VS::PerVertexData{Point(size.width, size.height), Point(1, 1)},
};
pass.SetVertexBuffer(
CreateVertexBuffer(vertices, renderer.GetTransientsBuffer()));

VS::FrameInfo frame_info;
frame_info.mvp = pass.GetOrthographicTransform() *
Expand Down Expand Up @@ -711,15 +717,14 @@ std::optional<Entity> BlendFilterContents::CreateFramebufferAdvancedBlend(
FS::FragInfo frag_info;
frag_info.alpha = 1.0;

VertexBufferBuilder<VS::PerVertexData> vtx_builder;
vtx_builder.AddVertices({
{{0, 0}, {0, 0}},
{Point(1, 0), {1, 0}},
{Point(0, 1), {0, 1}},
{Point(1, 1), {1, 1}},
});
auto vtx_buffer = vtx_builder.CreateVertexBuffer(host_buffer);
pass.SetVertexBuffer(std::move(vtx_buffer));
std::array<VS::PerVertexData, 4> vertices = {
VS::PerVertexData{{0, 0}, {0, 0}},
VS::PerVertexData{Point(1, 0), {1, 0}},
VS::PerVertexData{Point(0, 1), {0, 1}},
VS::PerVertexData{Point(1, 1), {1, 1}},
};
pass.SetVertexBuffer(
CreateVertexBuffer(vertices, renderer.GetTransientsBuffer()));

VS::BindFrameInfo(pass, host_buffer.EmplaceUniform(frame_info));
FS::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info));
Expand Down Expand Up @@ -753,20 +758,20 @@ std::optional<Entity> BlendFilterContents::CreateFramebufferAdvancedBlend(
src_texture = src_snapshot->texture;
}

VertexBufferBuilder<VS::PerVertexData> vtx_builder;
vtx_builder.AddVertices({
{Point(0, 0), Point(0, 0)},
{Point(1, 0), Point(1, 0)},
{Point(0, 1), Point(0, 1)},
{Point(1, 1), Point(1, 1)},
});
std::array<VS::PerVertexData, 4> vertices = {
VS::PerVertexData{Point(0, 0), Point(0, 0)},
VS::PerVertexData{Point(1, 0), Point(1, 0)},
VS::PerVertexData{Point(0, 1), Point(0, 1)},
VS::PerVertexData{Point(1, 1), Point(1, 1)},
};

auto options = OptionsFromPass(pass);
options.blend_mode = BlendMode::kSource;
options.primitive_type = PrimitiveType::kTriangleStrip;

pass.SetCommandLabel("Framebuffer Advanced Blend Filter");
pass.SetVertexBuffer(vtx_builder.CreateVertexBuffer(host_buffer));
pass.SetVertexBuffer(
CreateVertexBuffer(vertices, renderer.GetTransientsBuffer()));

switch (blend_mode) {
case BlendMode::kScreen:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,15 +91,15 @@ std::optional<Entity> BorderMaskBlurFilterContents::RenderFilter(
const Entity& entity, RenderPass& pass) -> bool {
auto& host_buffer = renderer.GetTransientsBuffer();

VertexBufferBuilder<VS::PerVertexData> vtx_builder;
auto origin = coverage.GetOrigin();
auto size = coverage.GetSize();
vtx_builder.AddVertices({
{origin, input_uvs[0]},
{{origin.x + size.width, origin.y}, input_uvs[1]},
{{origin.x, origin.y + size.height}, input_uvs[2]},
{{origin.x + size.width, origin.y + size.height}, input_uvs[3]},
});
std::array<VS::PerVertexData, 4> vertices = {
VS::PerVertexData{origin, input_uvs[0]},
VS::PerVertexData{{origin.x + size.width, origin.y}, input_uvs[1]},
VS::PerVertexData{{origin.x, origin.y + size.height}, input_uvs[2]},
VS::PerVertexData{{origin.x + size.width, origin.y + size.height},
input_uvs[3]},
};

auto options = OptionsFromPassAndEntity(pass, entity);
options.primitive_type = PrimitiveType::kTriangleStrip;
Expand All @@ -117,7 +117,7 @@ std::optional<Entity> BorderMaskBlurFilterContents::RenderFilter(

pass.SetCommandLabel("Border Mask Blur Filter");
pass.SetPipeline(renderer.GetBorderMaskBlurPipeline(options));
pass.SetVertexBuffer(vtx_builder.CreateVertexBuffer(host_buffer));
pass.SetVertexBuffer(CreateVertexBuffer(vertices, host_buffer));

FS::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info));
VS::BindFrameInfo(pass, host_buffer.EmplaceUniform(frame_info));
Expand Down
16 changes: 8 additions & 8 deletions impeller/entity/contents/filters/color_matrix_filter_contents.cc
Original file line number Diff line number Diff line change
Expand Up @@ -63,15 +63,15 @@ std::optional<Entity> ColorMatrixFilterContents::RenderFilter(

auto size = input_snapshot->texture->GetSize();

VertexBufferBuilder<VS::PerVertexData> vtx_builder;
vtx_builder.AddVertices({
{Point(0, 0)},
{Point(1, 0)},
{Point(0, 1)},
{Point(1, 1)},
});
std::array<VS::PerVertexData, 4> vertices = {
VS::PerVertexData{Point(0, 0)},
VS::PerVertexData{Point(1, 0)},
VS::PerVertexData{Point(0, 1)},
VS::PerVertexData{Point(1, 1)},
};
auto& host_buffer = renderer.GetTransientsBuffer();
pass.SetVertexBuffer(vtx_builder.CreateVertexBuffer(host_buffer));
pass.SetVertexBuffer(
CreateVertexBuffer(vertices, renderer.GetTransientsBuffer()));

VS::FrameInfo frame_info;
frame_info.mvp = Entity::GetShaderTransform(
Expand Down
55 changes: 25 additions & 30 deletions impeller/entity/contents/filters/gaussian_blur_filter_contents.cc
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,6 @@ SamplerDescriptor MakeSamplerDescriptor(MinMagFilter filter,
return sampler_desc;
}

template <typename T>
void BindVertices(RenderPass& pass,
HostBuffer& host_buffer,
std::initializer_list<typename T::PerVertexData>&& vertices) {
VertexBufferBuilder<typename T::PerVertexData> vtx_builder;
vtx_builder.AddVertices(vertices);
pass.SetVertexBuffer(vtx_builder.CreateVertexBuffer(host_buffer));
}

void SetTileMode(SamplerDescriptor* descriptor,
const ContentContext& renderer,
Entity::TileMode tile_mode) {
Expand Down Expand Up @@ -329,6 +320,8 @@ fml::StatusOr<RenderTarget> MakeDownsampleSubpass(
const SamplerDescriptor& sampler_descriptor,
const DownsamplePassArgs& pass_args,
Entity::TileMode tile_mode) {
using VS = TextureFillVertexShader;

// If the texture already had mip levels generated, then we can use the
// original downsample shader.
if (pass_args.effective_scalar.x >= 0.5f ||
Expand All @@ -351,13 +344,13 @@ fml::StatusOr<RenderTarget> MakeDownsampleSubpass(
frag_info.alpha = 1.0;

const Quad& uvs = pass_args.uvs;
BindVertices<TextureFillVertexShader>(pass, host_buffer,
{
{Point(0, 0), uvs[0]},
{Point(1, 0), uvs[1]},
{Point(0, 1), uvs[2]},
{Point(1, 1), uvs[3]},
});
std::array<VS::PerVertexData, 4> vertices = {
VS::PerVertexData{Point(0, 0), uvs[0]},
VS::PerVertexData{Point(1, 0), uvs[1]},
VS::PerVertexData{Point(0, 1), uvs[2]},
VS::PerVertexData{Point(1, 1), uvs[3]},
};
pass.SetVertexBuffer(CreateVertexBuffer(vertices, host_buffer));

SamplerDescriptor linear_sampler_descriptor = sampler_descriptor;
SetTileMode(&linear_sampler_descriptor, renderer, tile_mode);
Expand Down Expand Up @@ -406,13 +399,13 @@ fml::StatusOr<RenderTarget> MakeDownsampleSubpass(
frag_info.pixel_size = Vector2(1.0f / Size(input_texture->GetSize()));

const Quad& uvs = pass_args.uvs;
BindVertices<TextureFillVertexShader>(pass, host_buffer,
{
{Point(0, 0), uvs[0]},
{Point(1, 0), uvs[1]},
{Point(0, 1), uvs[2]},
{Point(1, 1), uvs[3]},
});
std::array<VS::PerVertexData, 4> vertices = {
VS::PerVertexData{Point(0, 0), uvs[0]},
VS::PerVertexData{Point(1, 0), uvs[1]},
VS::PerVertexData{Point(0, 1), uvs[2]},
VS::PerVertexData{Point(1, 1), uvs[3]},
};
pass.SetVertexBuffer(CreateVertexBuffer(vertices, host_buffer));

SamplerDescriptor linear_sampler_descriptor = sampler_descriptor;
SetTileMode(&linear_sampler_descriptor, renderer, tile_mode);
Expand Down Expand Up @@ -443,6 +436,8 @@ fml::StatusOr<RenderTarget> MakeBlurSubpass(
const BlurParameters& blur_info,
std::optional<RenderTarget> destination_target,
const Quad& blur_uvs) {
using VS = GaussianBlurVertexShader;

if (blur_info.blur_sigma < kEhCloseEnough) {
return input_pass;
}
Expand All @@ -464,13 +459,13 @@ fml::StatusOr<RenderTarget> MakeBlurSubpass(
options.primitive_type = PrimitiveType::kTriangleStrip;
pass.SetPipeline(renderer.GetGaussianBlurPipeline(options));

BindVertices<GaussianBlurVertexShader>(pass, host_buffer,
{
{blur_uvs[0], blur_uvs[0]},
{blur_uvs[1], blur_uvs[1]},
{blur_uvs[2], blur_uvs[2]},
{blur_uvs[3], blur_uvs[3]},
});
std::array<VS::PerVertexData, 4> vertices = {
VS::PerVertexData{blur_uvs[0], blur_uvs[0]},
VS::PerVertexData{blur_uvs[1], blur_uvs[1]},
VS::PerVertexData{blur_uvs[2], blur_uvs[2]},
VS::PerVertexData{blur_uvs[3], blur_uvs[3]},
};
pass.SetVertexBuffer(CreateVertexBuffer(vertices, host_buffer));

SamplerDescriptor linear_sampler_descriptor = sampler_descriptor;
linear_sampler_descriptor.mag_filter = MinMagFilter::kLinear;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,17 +51,15 @@ std::optional<Entity> LinearToSrgbFilterContents::RenderFilter(
pass.SetPipeline(renderer.GetLinearToSrgbFilterPipeline(options));

auto size = input_snapshot->texture->GetSize();

VertexBufferBuilder<VS::PerVertexData> vtx_builder;
vtx_builder.AddVertices({
{Point(0, 0)},
{Point(1, 0)},
{Point(0, 1)},
{Point(1, 1)},
});
std::array<VS::PerVertexData, 4> vertices = {
VS::PerVertexData{Point(0, 0)},
VS::PerVertexData{Point(1, 0)},
VS::PerVertexData{Point(0, 1)},
VS::PerVertexData{Point(1, 1)},
};

auto& host_buffer = renderer.GetTransientsBuffer();
pass.SetVertexBuffer(vtx_builder.CreateVertexBuffer(host_buffer));
pass.SetVertexBuffer(CreateVertexBuffer(vertices, host_buffer));

VS::FrameInfo frame_info;
frame_info.mvp = Entity::GetShaderTransform(
Expand Down
Loading