11 #include "flutter/fml/logging.h"
25 #include "impeller/entity/texture_fill.frag.h"
26 #include "impeller/entity/texture_fill.vert.h"
37 #define _IMPELLER_BLEND_MODE_FILTER_NAME_LIST(blend_mode) \
38 "Blend Filter " #blend_mode,
40 static constexpr
const char* kBlendModeFilterNames[] = {
43 const std::string_view BlendModeToFilterString(
BlendMode blend_mode) {
44 return kBlendModeFilterNames[
static_cast<std::underlying_type_t<BlendMode>
>(
95 template <
typename TPipeline>
100 const Rect& coverage,
102 std::optional<Color> foreground_color,
105 std::optional<Scalar> alpha) {
106 using VS =
typename TPipeline::VertexShader;
107 using FS =
typename TPipeline::FragmentShader;
113 const size_t total_inputs =
114 inputs.size() + (foreground_color.has_value() ? 1 : 0);
115 if (total_inputs < 2) {
120 inputs[0]->GetSnapshot(
"AdvancedBlend(Dst)", renderer, entity);
121 if (!dst_snapshot.has_value()) {
124 auto maybe_dst_uvs = dst_snapshot->GetCoverageUVs(coverage);
125 if (!maybe_dst_uvs.has_value()) {
128 auto dst_uvs = maybe_dst_uvs.value();
130 std::optional<Snapshot> src_snapshot;
131 std::array<Point, 4> src_uvs;
132 if (!foreground_color.has_value()) {
134 inputs[1]->GetSnapshot(
"AdvancedBlend(Src)", renderer, entity);
135 if (!src_snapshot.has_value()) {
136 if (!dst_snapshot.has_value()) {
141 auto maybe_src_uvs = src_snapshot->GetCoverageUVs(coverage);
142 if (!maybe_src_uvs.has_value()) {
143 if (!dst_snapshot.has_value()) {
148 src_uvs = maybe_src_uvs.value();
151 Rect subpass_coverage = coverage;
153 auto coverage_hint = entity.
GetContents()->GetCoverageHint();
155 if (coverage_hint.has_value()) {
156 auto maybe_subpass_coverage =
158 if (!maybe_subpass_coverage.has_value()) {
162 subpass_coverage = *maybe_subpass_coverage;
174 auto size = pass.GetRenderTargetSize();
176 std::array<typename VS::PerVertexData, 4> vertices = {
177 typename VS::PerVertexData{
Point(0, 0), dst_uvs[0], src_uvs[0]},
178 typename VS::PerVertexData{
Point(size.width, 0), dst_uvs[1],
180 typename VS::PerVertexData{
Point(0, size.height), dst_uvs[2],
182 typename VS::PerVertexData{
Point(size.width, size.height), dst_uvs[3],
191 PipelineRef pipeline = std::invoke(pipeline_proc, renderer, options);
193 #ifdef IMPELLER_DEBUG
194 pass.SetCommandLabel(BlendModeToFilterString(blend_mode));
196 pass.SetVertexBuffer(std::move(vtx_buffer));
197 pass.SetPipeline(pipeline);
199 typename FS::BlendInfo blend_info;
200 typename VS::FrameInfo frame_info;
202 auto dst_sampler_descriptor = dst_snapshot->sampler_descriptor;
208 renderer.
GetContext()->GetSamplerLibrary()->GetSampler(
209 dst_sampler_descriptor);
210 FS::BindTextureSamplerDst(pass, dst_snapshot->texture, dst_sampler);
211 frame_info.dst_y_coord_scale = dst_snapshot->texture->GetYCoordScale();
212 blend_info.dst_input_alpha =
214 ? dst_snapshot->opacity
217 if (foreground_color.has_value()) {
218 blend_info.color_factor = 1;
219 blend_info.color = foreground_color.value();
223 FS::BindTextureSamplerSrc(pass, dst_snapshot->texture, dst_sampler);
225 auto src_sampler_descriptor = src_snapshot->sampler_descriptor;
231 renderer.
GetContext()->GetSamplerLibrary()->GetSampler(
232 src_sampler_descriptor);
233 blend_info.color_factor = 0;
234 blend_info.src_input_alpha = src_snapshot->opacity;
235 FS::BindTextureSamplerSrc(pass, src_snapshot->texture, src_sampler);
236 frame_info.src_y_coord_scale = src_snapshot->texture->GetYCoordScale();
238 auto blend_uniform = host_buffer.EmplaceUniform(blend_info);
239 FS::BindBlendInfo(pass, blend_uniform);
241 frame_info.mvp = pass.GetOrthographicTransform() *
245 auto uniform_view = host_buffer.EmplaceUniform(frame_info);
246 VS::BindFrameInfo(pass, uniform_view);
248 return pass.Draw().ok();
251 std::shared_ptr<CommandBuffer> command_buffer =
253 if (!command_buffer) {
256 fml::StatusOr<RenderTarget> render_target = renderer.
MakeSubpass(
257 "Advanced Blend Filter",
ISize(subpass_coverage.
GetSize()),
258 command_buffer, callback);
259 if (!render_target.ok()) {
262 if (!renderer.
GetContext()->EnqueueCommandBuffer(std::move(command_buffer))) {
268 .
texture = render_target.value().GetRenderTargetTexture(),
273 .sampler_descriptor = {},
276 : dst_snapshot->opacity) *
277 alpha.value_or(1.0)},
281 std::optional<Entity> BlendFilterContents::CreateForegroundAdvancedBlend(
282 const std::shared_ptr<FilterInput>& input,
283 const ContentContext& renderer,
284 const Entity& entity,
285 const Rect& coverage,
286 Color foreground_color,
288 std::optional<Scalar> alpha,
291 input->GetSnapshot(
"ForegroundAdvancedBlend", renderer, entity);
292 if (!dst_snapshot.has_value()) {
296 RenderProc render_proc = [foreground_color, dst_snapshot, blend_mode, alpha,
297 absorb_opacity](
const ContentContext& renderer,
298 const Entity& entity,
299 RenderPass& pass) ->
bool {
303 auto& host_buffer = renderer.GetTransientsBuffer();
304 auto size = dst_snapshot->texture->GetSize();
306 std::array<VS::PerVertexData, 4> vertices = {
307 VS::PerVertexData{{0, 0}, {0, 0}, {0, 0}},
308 VS::PerVertexData{
Point(size.width, 0), {1, 0}, {1, 0}},
309 VS::PerVertexData{
Point(0, size.height), {0, 1}, {0, 1}},
310 VS::PerVertexData{
Point(size.width, size.height), {1, 1}, {1, 1}},
315 #ifdef IMPELLER_DEBUG
316 pass.SetCommandLabel(BlendModeToFilterString(blend_mode));
318 pass.SetVertexBuffer(std::move(vtx_buffer));
322 switch (blend_mode) {
324 pass.SetPipeline(renderer.GetBlendScreenPipeline(options));
327 pass.SetPipeline(renderer.GetBlendOverlayPipeline(options));
330 pass.SetPipeline(renderer.GetBlendDarkenPipeline(options));
333 pass.SetPipeline(renderer.GetBlendLightenPipeline(options));
336 pass.SetPipeline(renderer.GetBlendColorDodgePipeline(options));
339 pass.SetPipeline(renderer.GetBlendColorBurnPipeline(options));
342 pass.SetPipeline(renderer.GetBlendHardLightPipeline(options));
345 pass.SetPipeline(renderer.GetBlendSoftLightPipeline(options));
348 pass.SetPipeline(renderer.GetBlendDifferencePipeline(options));
351 pass.SetPipeline(renderer.GetBlendExclusionPipeline(options));
354 pass.SetPipeline(renderer.GetBlendMultiplyPipeline(options));
357 pass.SetPipeline(renderer.GetBlendHuePipeline(options));
360 pass.SetPipeline(renderer.GetBlendSaturationPipeline(options));
363 pass.SetPipeline(renderer.GetBlendColorPipeline(options));
366 pass.SetPipeline(renderer.GetBlendLuminosityPipeline(options));
372 FS::BlendInfo blend_info;
373 VS::FrameInfo frame_info;
375 auto dst_sampler_descriptor = dst_snapshot->sampler_descriptor;
376 if (renderer.GetDeviceCapabilities().SupportsDecalSamplerAddressMode()) {
380 raw_ptr<const Sampler> dst_sampler =
381 renderer.GetContext()->GetSamplerLibrary()->GetSampler(
382 dst_sampler_descriptor);
383 FS::BindTextureSamplerDst(pass, dst_snapshot->texture, dst_sampler);
384 frame_info.dst_y_coord_scale = dst_snapshot->texture->GetYCoordScale();
387 entity.GetShaderClipDepth(), pass,
388 entity.GetTransform() * dst_snapshot->transform);
390 blend_info.dst_input_alpha =
392 ? dst_snapshot->opacity * alpha.value_or(1.0)
395 blend_info.color_factor = 1;
396 blend_info.color = foreground_color;
400 FS::BindTextureSamplerSrc(pass, dst_snapshot->texture, dst_sampler);
402 auto blend_uniform = host_buffer.EmplaceUniform(blend_info);
403 FS::BindBlendInfo(pass, blend_uniform);
405 auto uniform_view = host_buffer.EmplaceUniform(frame_info);
406 VS::BindFrameInfo(pass, uniform_view);
408 return pass.Draw().ok();
411 [coverage](
const Entity& entity) -> std::optional<Rect> {
412 return coverage.TransformBounds(entity.GetTransform());
418 sub_entity.SetContents(std::move(contents));
419 sub_entity.SetBlendMode(entity.GetBlendMode());
424 std::optional<Entity> BlendFilterContents::CreateForegroundPorterDuffBlend(
425 const std::shared_ptr<FilterInput>& input,
426 const ContentContext& renderer,
427 const Entity& entity,
428 const Rect& coverage,
429 Color foreground_color,
431 std::optional<Scalar> alpha,
438 input->GetSnapshot(
"ForegroundPorterDuffBlend", renderer, entity);
439 if (!dst_snapshot.has_value()) {
447 RenderProc render_proc = [foreground_color, dst_snapshot, blend_mode,
448 absorb_opacity, alpha](
449 const ContentContext& renderer,
450 const Entity& entity, RenderPass& pass) ->
bool {
454 auto& host_buffer = renderer.GetTransientsBuffer();
455 auto size = dst_snapshot->texture->GetSize();
456 auto color = foreground_color.Premultiply();
458 std::array<VS::PerVertexData, 4> vertices = {
459 VS::PerVertexData{{0, 0}, {0, 0}, color},
460 VS::PerVertexData{
Point(size.width, 0), {1, 0}, color},
461 VS::PerVertexData{
Point(0, size.height), {0, 1}, color},
462 VS::PerVertexData{
Point(size.width, size.height), {1, 1}, color},
467 #ifdef IMPELLER_DEBUG
468 pass.SetCommandLabel(BlendModeToFilterString(blend_mode));
470 pass.SetVertexBuffer(std::move(vtx_buffer));
473 pass.SetPipeline(renderer.GetPorterDuffPipeline(blend_mode, options));
475 FS::FragInfo frag_info;
476 VS::FrameInfo frame_info;
479 entity.GetShaderClipDepth(), pass,
480 entity.GetTransform() * dst_snapshot->transform);
482 auto dst_sampler_descriptor = dst_snapshot->sampler_descriptor;
483 if (renderer.GetDeviceCapabilities().SupportsDecalSamplerAddressMode()) {
487 raw_ptr<const Sampler> dst_sampler =
488 renderer.GetContext()->GetSamplerLibrary()->GetSampler(
489 dst_sampler_descriptor);
490 FS::BindTextureSamplerDst(pass, dst_snapshot->texture, dst_sampler);
491 frame_info.texture_sampler_y_coord_scale =
492 dst_snapshot->texture->GetYCoordScale();
494 frag_info.input_alpha =
496 ? dst_snapshot->opacity * alpha.value_or(1.0)
498 frag_info.output_alpha = 1.0;
500 FS::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info));
501 VS::BindFrameInfo(pass, host_buffer.EmplaceUniform(frame_info));
503 return pass.Draw().ok();
507 [coverage](
const Entity& entity) -> std::optional<Rect> {
508 return coverage.TransformBounds(entity.GetTransform());
514 sub_entity.SetContents(std::move(contents));
515 sub_entity.SetBlendMode(entity.GetBlendMode());
524 const Rect& coverage,
526 std::optional<Color> foreground_color,
528 std::optional<Scalar> alpha) {
533 inputs[0]->GetSnapshot(
"PipelineBlend(Dst)", renderer, entity);
534 if (!dst_snapshot.has_value()) {
538 Rect subpass_coverage = coverage;
540 auto coverage_hint = entity.
GetContents()->GetCoverageHint();
542 if (coverage_hint.has_value()) {
543 auto maybe_subpass_coverage =
545 if (!maybe_subpass_coverage.has_value()) {
549 subpass_coverage = *maybe_subpass_coverage;
557 #ifdef IMPELLER_DEBUG
558 pass.SetCommandLabel(BlendModeToFilterString(blend_mode));
563 auto add_blend_command = [&](std::optional<Snapshot> input) {
564 if (!input.has_value()) {
567 auto input_coverage = input->GetCoverage();
568 if (!input_coverage.has_value()) {
573 renderer.
GetContext()->GetSamplerLibrary()->GetSampler(
574 input->sampler_descriptor);
575 FS::BindTextureSampler(pass, input->texture, sampler);
577 auto size = input->texture->GetSize();
578 std::array<VS::PerVertexData, 4> vertices = {
580 VS::PerVertexData{
Point(size.width, 0),
Point(1, 0)},
581 VS::PerVertexData{
Point(0, size.height),
Point(0, 1)},
582 VS::PerVertexData{
Point(size.width, size.height),
Point(1, 1)},
584 pass.SetVertexBuffer(
587 VS::FrameInfo frame_info;
588 frame_info.mvp = pass.GetOrthographicTransform() *
591 frame_info.texture_sampler_y_coord_scale =
592 input->texture->GetYCoordScale();
594 FS::FragInfo frag_info;
599 FS::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info));
600 VS::BindFrameInfo(pass, host_buffer.EmplaceUniform(frame_info));
602 return pass.Draw().ok();
608 if (!add_blend_command(dst_snapshot)) {
614 if (inputs.size() >= 2) {
615 options.blend_mode = blend_mode;
618 for (
auto texture_i = inputs.begin() + 1; texture_i < inputs.end();
620 auto src_input = texture_i->get()->GetSnapshot(
"PipelineBlend(Src)",
622 if (!add_blend_command(src_input)) {
630 if (foreground_color.has_value()) {
631 auto contents = std::make_shared<SolidColorContents>();
633 contents->SetGeometry(&geom);
634 contents->SetColor(foreground_color.value());
639 if (!foreground_entity.
Render(renderer, pass)) {
647 std::shared_ptr<CommandBuffer> command_buffer =
649 if (!command_buffer) {
653 fml::StatusOr<RenderTarget> render_target = renderer.
MakeSubpass(
654 "Pipeline Blend Filter",
ISize(subpass_coverage.
GetSize()),
655 command_buffer, callback);
657 if (!render_target.ok()) {
660 if (!renderer.
GetContext()->EnqueueCommandBuffer(std::move(command_buffer))) {
666 .
texture = render_target.value().GetRenderTargetTexture(),
671 .sampler_descriptor = {},
674 : dst_snapshot->opacity) *
675 alpha.value_or(1.0)},
679 std::optional<Entity> BlendFilterContents::CreateFramebufferAdvancedBlend(
681 const ContentContext& renderer,
682 const Entity& entity,
683 const Rect& coverage,
684 std::optional<Color> foreground_color,
686 std::optional<Scalar> alpha,
689 FML_DCHECK(inputs.size() == 2u ||
690 (inputs.size() == 1u && foreground_color.has_value()));
693 inputs[0]->GetSnapshot(
"ForegroundAdvancedBlend", renderer, entity);
694 if (!dst_snapshot.has_value()) {
698 std::shared_ptr<Texture> foreground_texture;
705 HostBuffer& host_buffer = renderer.GetTransientsBuffer();
708 using FS = TextureFillFragmentShader;
709 using VS = TextureFillVertexShader;
711 pass.SetCommandLabel(
"Framebuffer Advanced Blend");
714 pass.SetPipeline(renderer.GetTexturePipeline(pipeline_options));
716 VS::FrameInfo frame_info;
718 frame_info.texture_sampler_y_coord_scale = 1.0;
720 FS::FragInfo frag_info;
721 frag_info.alpha = 1.0;
723 std::array<VS::PerVertexData, 4> vertices = {
724 VS::PerVertexData{{0, 0}, {0, 0}},
725 VS::PerVertexData{
Point(1, 0), {1, 0}},
726 VS::PerVertexData{
Point(0, 1), {0, 1}},
727 VS::PerVertexData{
Point(1, 1), {1, 1}},
729 pass.SetVertexBuffer(
732 VS::BindFrameInfo(pass, host_buffer.EmplaceUniform(frame_info));
733 FS::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info));
734 FS::BindTextureSampler(
735 pass, dst_snapshot->texture,
736 renderer.GetContext()->GetSamplerLibrary()->GetSampler({}));
738 if (!pass.Draw().ok()) {
749 std::shared_ptr<Texture> src_texture;
750 if (foreground_color.has_value()) {
751 src_texture = foreground_texture;
754 inputs[0]->GetSnapshot(
"ForegroundAdvancedBlend", renderer, entity);
755 if (!src_snapshot.has_value()) {
761 src_texture = src_snapshot->texture;
764 std::array<VS::PerVertexData, 4> vertices = {
775 pass.SetCommandLabel(
"Framebuffer Advanced Blend Filter");
776 pass.SetVertexBuffer(
779 switch (blend_mode) {
781 pass.SetPipeline(renderer.GetFramebufferBlendScreenPipeline(options));
785 renderer.GetFramebufferBlendOverlayPipeline(options));
788 pass.SetPipeline(renderer.GetFramebufferBlendDarkenPipeline(options));
792 renderer.GetFramebufferBlendLightenPipeline(options));
796 renderer.GetFramebufferBlendColorDodgePipeline(options));
800 renderer.GetFramebufferBlendColorBurnPipeline(options));
804 renderer.GetFramebufferBlendHardLightPipeline(options));
808 renderer.GetFramebufferBlendSoftLightPipeline(options));
812 renderer.GetFramebufferBlendDifferencePipeline(options));
816 renderer.GetFramebufferBlendExclusionPipeline(options));
820 renderer.GetFramebufferBlendMultiplyPipeline(options));
823 pass.SetPipeline(renderer.GetFramebufferBlendHuePipeline(options));
827 renderer.GetFramebufferBlendSaturationPipeline(options));
830 pass.SetPipeline(renderer.GetFramebufferBlendColorPipeline(options));
834 renderer.GetFramebufferBlendLuminosityPipeline(options));
840 VS::FrameInfo frame_info;
841 FS::FragInfo frag_info;
843 auto src_sampler_descriptor = SamplerDescriptor{};
844 if (renderer.GetDeviceCapabilities().SupportsDecalSamplerAddressMode()) {
848 raw_ptr<const Sampler> src_sampler =
849 renderer.GetContext()->GetSamplerLibrary()->GetSampler(
850 src_sampler_descriptor);
851 FS::BindTextureSamplerSrc(pass, src_texture, src_sampler);
854 frame_info.src_y_coord_scale = src_texture->GetYCoordScale();
855 VS::BindFrameInfo(pass, host_buffer.EmplaceUniform(frame_info));
857 frag_info.src_input_alpha = 1.0;
858 frag_info.dst_input_alpha =
860 ? dst_snapshot->opacity
862 FS::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info));
864 return pass.Draw().ok();
868 std::shared_ptr<CommandBuffer> cmd_buffer =
869 renderer.GetContext()->CreateCommandBuffer();
872 if (foreground_color.has_value()) {
873 TextureDescriptor desc;
878 renderer.GetContext()->GetResourceAllocator()->CreateTexture(desc);
879 if (!foreground_texture) {
882 auto blit_pass = cmd_buffer->CreateBlitPass();
883 auto buffer_view = renderer.GetTransientsBuffer().Emplace(
884 foreground_color->Premultiply().ToR8G8B8A8(), 4);
886 blit_pass->AddCopy(std::move(
buffer_view), foreground_texture);
887 if (!blit_pass->EncodeCommands()) {
893 renderer.MakeSubpass(
"FramebufferBlend", dst_snapshot->texture->GetSize(),
894 cmd_buffer, subpass_callback);
896 if (!render_target.ok()) {
899 if (!renderer.GetContext()->EnqueueCommandBuffer(std::move(cmd_buffer))) {
905 .texture = render_target.value().GetRenderTargetTexture(),
910 .sampler_descriptor = {},
913 : dst_snapshot->opacity) *
914 alpha.value_or(1.0)},
915 entity.GetBlendMode());
918 #define BLEND_CASE(mode) \
919 case BlendMode::k##mode: \
920 advanced_blend_proc_ = \
921 [](const FilterInput::Vector& inputs, const ContentContext& renderer, \
922 const Entity& entity, const Rect& coverage, BlendMode blend_mode, \
923 std::optional<Color> fg_color, \
924 ColorFilterContents::AbsorbOpacity absorb_opacity, \
925 std::optional<Scalar> alpha) { \
926 PipelineProc p = &ContentContext::GetBlend##mode##Pipeline; \
927 return AdvancedBlend<Blend##mode##Pipeline>( \
928 inputs, renderer, entity, coverage, blend_mode, fg_color, \
929 absorb_opacity, p, alpha); \
935 VALIDATION_LOG <<
"Invalid blend mode " <<
static_cast<int>(blend_mode)
936 <<
" assigned to BlendFilterContents.";
939 blend_mode_ = blend_mode;
942 switch (blend_mode) {
965 foreground_color_ = color;
968 std::optional<Entity> BlendFilterContents::RenderFilter(
972 const Matrix& effect_transform,
973 const Rect& coverage,
974 const std::optional<Rect>& coverage_hint)
const {
975 if (inputs.empty()) {
979 if (inputs.size() == 1 && !foreground_color_.has_value()) {
986 if (inputs.size() == 1 && foreground_color_.has_value() &&
988 return CreateForegroundPorterDuffBlend(
989 inputs[0], renderer, entity, coverage, foreground_color_.value(),
992 return PipelineBlend(inputs, renderer, entity, coverage, blend_mode_,
998 return CreateFramebufferAdvancedBlend(inputs, renderer, entity, coverage,
999 foreground_color_, blend_mode_,
1002 if (inputs.size() == 1 && foreground_color_.has_value() &&
1004 return CreateForegroundAdvancedBlend(
1005 inputs[0], renderer, entity, coverage, foreground_color_.value(),
1008 return advanced_blend_proc_(inputs, renderer, entity, coverage, blend_mode_,
static std::shared_ptr< Contents > Make(RenderProc render_proc, CoverageProc coverage_proc)
~BlendFilterContents() override
void SetBlendMode(BlendMode blend_mode)
void SetForegroundColor(std::optional< Color > color)
Sets a source color which is blended after all of the inputs have been blended.
virtual bool SupportsFramebufferFetch() const =0
Whether the context backend is able to support pipelines with shaders that read from the framebuffer ...
virtual bool SupportsDecalSamplerAddressMode() const =0
Whether the context backend supports SamplerAddressMode::Decal.
std::optional< Scalar > GetAlpha() const
AbsorbOpacity GetAbsorbOpacity() const
HostBuffer & GetTransientsBuffer() const
Retrieve the currnent host buffer for transient storage.
fml::StatusOr< RenderTarget > MakeSubpass(std::string_view label, ISize texture_size, const std::shared_ptr< CommandBuffer > &command_buffer, const SubpassCallback &subpass_callback, bool msaa_enabled=true, bool depth_stencil_enabled=false, int32_t mip_count=1) const
Creates a new texture of size texture_size and calls subpass_callback with a RenderPass for drawing t...
const Capabilities & GetDeviceCapabilities() const
PipelineRef GetTexturePipeline(ContentContextOptions opts) const
std::function< bool(const ContentContext &, RenderPass &)> SubpassCallback
std::shared_ptr< Context > GetContext() const
std::function< std::optional< Rect >(const Entity &entity)> CoverageProc
std::function< bool(const ContentContext &renderer, const Entity &entity, RenderPass &pass)> RenderProc
static Entity FromSnapshot(const Snapshot &snapshot, BlendMode blend_mode=BlendMode::kSourceOver)
Create an entity that can be used to render a given snapshot.
const std::shared_ptr< Contents > & GetContents() const
Matrix GetShaderTransform(const RenderPass &pass) const
Get the vertex shader transform used for drawing this Entity.
BlendMode GetBlendMode() const
void SetContents(std::shared_ptr< Contents > contents)
void SetBlendMode(BlendMode blend_mode)
static constexpr BlendMode kLastAdvancedBlendMode
bool Render(const ContentContext &renderer, RenderPass &parent_pass) const
static constexpr BlendMode kLastPipelineBlendMode
Render passes encode render commands directed as one specific render target into an underlying comman...
VertexShader_ VertexShader
FragmentShader_ FragmentShader
#define IMPELLER_FOR_EACH_BLEND_MODE(V)
@ kDecal
decal sampling mode is only supported on devices that pass the Capabilities.SupportsDecalSamplerAddre...
static constexpr Scalar Saturation(Vector3 color)
GlyphAtlasPipeline::VertexShader VS
raw_ptr< Pipeline< PipelineDescriptor > > PipelineRef
A raw ptr to a pipeline object.
VertexBuffer CreateVertexBuffer(std::array< VertexType, size > input, HostBuffer &host_buffer)
Create an index-less vertex buffer from a fixed size array.
std::optional< BlendMode > InvertPorterDuffBlend(BlendMode blend_mode)
static std::optional< Entity > PipelineBlend(const FilterInput::Vector &inputs, const ContentContext &renderer, const Entity &entity, const Rect &coverage, BlendMode blend_mode, std::optional< Color > foreground_color, ColorFilterContents::AbsorbOpacity absorb_opacity, std::optional< Scalar > alpha)
GlyphAtlasPipeline::FragmentShader FS
PipelineRef(ContentContext::*)(ContentContextOptions) const PipelineProc
ContentContextOptions OptionsFromPassAndEntity(const RenderPass &pass, const Entity &entity)
ContentContextOptions OptionsFromPass(const RenderPass &pass)
static std::optional< Entity > AdvancedBlend(const FilterInput::Vector &inputs, const ContentContext &renderer, const Entity &entity, const Rect &coverage, BlendMode blend_mode, std::optional< Color > foreground_color, ColorFilterContents::AbsorbOpacity absorb_opacity, PipelineProc pipeline_proc, std::optional< Scalar > alpha)
static constexpr Scalar Luminosity(Vector3 color)
A 4x4 matrix using column-major storage.
static constexpr Matrix MakeOrthographic(TSize< T > size)
static constexpr Matrix MakeTranslation(const Vector3 &t)
Represents a texture and its intended draw transform/sampler configuration.
std::shared_ptr< Texture > texture
constexpr TPoint< Type > GetOrigin() const
Returns the upper left corner of the rectangle as specified by the left/top or x/y values when it was...
constexpr std::optional< TRect > Intersection(const TRect &o) const
constexpr TSize< Type > GetSize() const
Returns the size of the rectangle which may be negative in either width or height and may have been c...
constexpr static TRect MakeSize(const TSize< U > &size)