10 #include "fml/trace_event.h"
44 template <
class PipelineHandleT>
47 ShaderStageCompatibilityChecker<
48 typename PipelineHandleT::VertexShader,
49 typename PipelineHandleT::FragmentShader>::Check(),
50 "The output slots for the fragment shader don't have matches in the "
51 "vertex shader's output slots. This will result in a linker error.");
56 void Set(
const ContentContextOptions& options,
57 std::unique_ptr<PipelineHandleT> pipeline) {
58 uint64_t p_key = options.ToKey();
59 for (
const auto& [key, pipeline] : pipelines_) {
64 pipelines_.push_back(std::make_pair(p_key, std::move(pipeline)));
67 void SetDefault(
const ContentContextOptions& options,
68 std::unique_ptr<PipelineHandleT> pipeline) {
69 default_options_ = options;
71 Set(options, std::move(pipeline));
75 void SetDefaultDescriptor(std::optional<PipelineDescriptor> desc) {
76 desc_ = std::move(desc);
79 void CreateDefault(
const Context& context,
80 const ContentContextOptions& options,
81 const std::vector<Scalar>& constants = {}) {
82 auto desc = PipelineHandleT::Builder::MakeDefaultPipelineDescriptor(
84 if (!desc.has_value()) {
88 options.ApplyToPipelineDescriptor(*desc);
90 if (context.GetFlags().lazy_shader_mode) {
91 SetDefault(options,
nullptr);
93 SetDefault(options, std::make_unique<PipelineHandleT>(context, desc_,
98 PipelineHandleT* Get(
const ContentContextOptions& options)
const {
99 uint64_t p_key = options.ToKey();
100 for (
const auto& [key, pipeline] : pipelines_) {
102 return pipeline.get();
108 bool IsDefault(
const ContentContextOptions& opts) {
109 return default_options_.has_value() &&
110 opts.ToKey() == default_options_.value().ToKey();
113 PipelineHandleT* GetDefault(
const Context& context) {
114 if (!default_options_.has_value()) {
117 PipelineHandleT* result = Get(default_options_.value());
118 if (result !=
nullptr) {
121 SetDefault(default_options_.value(), std::make_unique<PipelineHandleT>(
122 context, desc_,
false));
123 return Get(default_options_.value());
126 size_t GetPipelineCount()
const {
return pipelines_.size(); }
129 std::optional<PipelineDescriptor> desc_;
130 std::optional<ContentContextOptions> default_options_;
131 std::vector<std::pair<uint64_t, std::unique_ptr<PipelineHandleT>>> pipelines_;
133 Variants(
const Variants&) =
delete;
135 Variants& operator=(
const Variants&) =
delete;
138 template <
class RenderPipelineHandleT>
139 RenderPipelineHandleT* CreateIfNeeded(
140 const ContentContext* context,
141 Variants<RenderPipelineHandleT>& container,
142 ContentContextOptions opts) {
143 if (!context->IsValid()) {
147 if (RenderPipelineHandleT* found = container.Get(opts)) {
151 RenderPipelineHandleT* default_handle =
152 container.GetDefault(*context->GetContext());
153 if (container.IsDefault(opts)) {
154 return default_handle;
158 FML_CHECK(default_handle !=
nullptr);
160 const std::shared_ptr<Pipeline<PipelineDescriptor>>& pipeline =
161 default_handle->WaitAndGet();
166 auto variant_future = pipeline->CreateVariant(
167 false, [&opts, variants_count = container.GetPipelineCount()](
168 PipelineDescriptor& desc) {
169 opts.ApplyToPipelineDescriptor(desc);
171 SPrintF(
"%s V#%zu", desc.GetLabel().data(), variants_count));
173 std::unique_ptr<RenderPipelineHandleT> variant =
174 std::make_unique<RenderPipelineHandleT>(std::move(variant_future));
175 container.Set(opts, std::move(variant));
176 return container.Get(opts);
179 template <
class TypedPipeline>
180 PipelineRef GetPipeline(
const ContentContext* context,
181 Variants<TypedPipeline>& container,
182 ContentContextOptions opts) {
183 TypedPipeline* pipeline = CreateIfNeeded(context, container, opts);
185 return raw_ptr<Pipeline<PipelineDescriptor>>();
187 return raw_ptr(pipeline->WaitAndGet());
280 #ifdef IMPELLER_ENABLE_OPENGLES
281 Variants<TiledTextureExternalPipeline> tiled_texture_external;
282 Variants<TextureDownsampleGlesPipeline> texture_downsample_gles;
283 Variants<TiledTextureUvExternalPipeline> tiled_texture_uv_external;
293 <<
" as a pipeline blend.";
305 switch (pipeline_blend) {
414 <<
"Depth attachment doesn't match expected pipeline state. "
415 "has_depth_stencil_attachments="
418 <<
"Stencil attachment doesn't match expected pipeline state. "
419 "has_depth_stencil_attachments="
421 if (maybe_stencil.has_value()) {
472 if (maybe_depth.has_value()) {
484 bool supports_decal) {
485 Scalar x = supports_decal ? 1 : 0;
498 {
x, 1, -1, 1, -1, 0},
505 template <
typename PipelineT>
508 auto desc = PipelineT::Builder::MakeDefaultPipelineDescriptor(context);
509 if (!desc.has_value()) {
513 const auto default_color_format =
517 .color_attachment_pixel_format = default_color_format}
518 .ApplyToPipelineDescriptor(*desc);
519 return std::make_unique<PipelineT>(context, desc);
523 std::shared_ptr<Context> context,
524 std::shared_ptr<TypographerContext> typographer_context,
525 std::shared_ptr<RenderTargetAllocator> render_target_allocator)
526 : context_(
std::move(context)),
531 render_target_cache_(render_target_allocator == nullptr
533 context_->GetResourceAllocator())
534 :
std::move(render_target_allocator)),
536 context_->GetIdleWaiter())),
538 if (!context_ || !context_->IsValid()) {
547 empty_texture_ =
GetContext()->GetResourceAllocator()->CreateTexture(desc);
550 std::shared_ptr<CommandBuffer> cmd_buffer =
552 std::shared_ptr<BlitPass> blit_pass = cmd_buffer->CreateBlitPass();
557 if (!blit_pass->EncodeCommands() || !
GetContext()
559 ->Submit({std::move(cmd_buffer)})
567 .color_attachment_pixel_format =
568 context_->GetCapabilities()->GetDefaultColorFormat()};
572 .color_attachment_pixel_format =
573 context_->GetCapabilities()->GetDefaultColorFormat()};
577 .color_attachment_pixel_format =
578 context_->GetCapabilities()->GetDefaultColorFormat(),
579 .has_depth_stencil_attachments =
false};
580 const auto supports_decal =
static_cast<Scalar>(
581 context_->GetCapabilities()->SupportsDecalSamplerAddressMode());
587 pipelines_->glyph_atlas.CreateDefault(
590 GetContext()->GetCapabilities()->GetDefaultGlyphAtlasFormat() ==
592 pipelines_->solid_fill.CreateDefault(*context_, options);
593 pipelines_->texture.CreateDefault(*context_, options);
594 pipelines_->fast_gradient.CreateDefault(*context_, options);
595 pipelines_->line.CreateDefault(*context_, options);
597 if (context_->GetCapabilities()->SupportsSSBO()) {
598 pipelines_->linear_gradient_ssbo_fill.CreateDefault(*context_, options);
599 pipelines_->radial_gradient_ssbo_fill.CreateDefault(*context_, options);
600 pipelines_->conical_gradient_ssbo_fill.CreateDefault(*context_, options,
602 pipelines_->conical_gradient_ssbo_fill_radial.CreateDefault(
603 *context_, options, {1.0});
604 pipelines_->conical_gradient_ssbo_fill_strip.CreateDefault(
605 *context_, options, {2.0});
606 pipelines_->conical_gradient_ssbo_fill_strip_and_radial.CreateDefault(
607 *context_, options, {0.0});
608 pipelines_->sweep_gradient_ssbo_fill.CreateDefault(*context_, options);
610 pipelines_->linear_gradient_uniform_fill.CreateDefault(*context_,
612 pipelines_->radial_gradient_uniform_fill.CreateDefault(*context_,
614 pipelines_->conical_gradient_uniform_fill.CreateDefault(*context_,
616 pipelines_->conical_gradient_uniform_fill_radial.CreateDefault(*context_,
618 pipelines_->conical_gradient_uniform_fill_strip.CreateDefault(*context_,
620 pipelines_->conical_gradient_uniform_fill_strip_and_radial.CreateDefault(
622 pipelines_->sweep_gradient_uniform_fill.CreateDefault(*context_, options);
624 pipelines_->linear_gradient_fill.CreateDefault(*context_, options);
625 pipelines_->radial_gradient_fill.CreateDefault(*context_, options);
626 pipelines_->conical_gradient_fill.CreateDefault(*context_, options);
627 pipelines_->conical_gradient_fill_radial.CreateDefault(*context_,
629 pipelines_->conical_gradient_fill_strip.CreateDefault(*context_, options);
630 pipelines_->conical_gradient_fill_strip_and_radial.CreateDefault(
632 pipelines_->sweep_gradient_fill.CreateDefault(*context_, options);
636 auto clip_pipeline_descriptor =
638 if (!clip_pipeline_descriptor.has_value()) {
643 .color_attachment_pixel_format =
644 context_->GetCapabilities()->GetDefaultColorFormat()}
645 .ApplyToPipelineDescriptor(*clip_pipeline_descriptor);
647 auto clip_color_attachments =
648 clip_pipeline_descriptor->GetColorAttachmentDescriptors();
649 for (
auto& color_attachment : clip_color_attachments) {
652 clip_pipeline_descriptor->SetColorAttachmentDescriptors(
653 std::move(clip_color_attachments));
654 if (
GetContext()->GetFlags().lazy_shader_mode) {
655 pipelines_->clip.SetDefaultDescriptor(clip_pipeline_descriptor);
656 pipelines_->clip.SetDefault(options,
nullptr);
658 pipelines_->clip.SetDefault(
660 std::make_unique<ClipPipeline>(*context_, clip_pipeline_descriptor));
662 pipelines_->texture_downsample.CreateDefault(
663 *context_, options_no_msaa_no_depth_stencil);
664 pipelines_->rrect_blur.CreateDefault(*context_, options_trianglestrip);
665 pipelines_->texture_strict_src.CreateDefault(*context_, options);
666 pipelines_->tiled_texture.CreateDefault(*context_, options,
668 pipelines_->gaussian_blur.CreateDefault(
669 *context_, options_no_msaa_no_depth_stencil, {supports_decal});
670 pipelines_->border_mask_blur.CreateDefault(*context_,
671 options_trianglestrip);
672 pipelines_->color_matrix_color_filter.CreateDefault(*context_,
673 options_trianglestrip);
674 pipelines_->vertices_uber_1_.CreateDefault(*context_, options,
676 pipelines_->vertices_uber_2_.CreateDefault(*context_, options,
679 const std::array<std::vector<Scalar>, 15> porter_duff_constants =
681 pipelines_->clear_blend.CreateDefault(*context_, options_trianglestrip,
682 porter_duff_constants[0]);
683 pipelines_->source_blend.CreateDefault(*context_, options_trianglestrip,
684 porter_duff_constants[1]);
685 pipelines_->destination_blend.CreateDefault(
686 *context_, options_trianglestrip, porter_duff_constants[2]);
687 pipelines_->source_over_blend.CreateDefault(
688 *context_, options_trianglestrip, porter_duff_constants[3]);
689 pipelines_->destination_over_blend.CreateDefault(
690 *context_, options_trianglestrip, porter_duff_constants[4]);
691 pipelines_->source_in_blend.CreateDefault(*context_, options_trianglestrip,
692 porter_duff_constants[5]);
693 pipelines_->destination_in_blend.CreateDefault(
694 *context_, options_trianglestrip, porter_duff_constants[6]);
695 pipelines_->source_out_blend.CreateDefault(*context_, options_trianglestrip,
696 porter_duff_constants[7]);
697 pipelines_->destination_out_blend.CreateDefault(
698 *context_, options_trianglestrip, porter_duff_constants[8]);
699 pipelines_->source_a_top_blend.CreateDefault(
700 *context_, options_trianglestrip, porter_duff_constants[9]);
701 pipelines_->destination_a_top_blend.CreateDefault(
702 *context_, options_trianglestrip, porter_duff_constants[10]);
703 pipelines_->xor_blend.CreateDefault(*context_, options_trianglestrip,
704 porter_duff_constants[11]);
705 pipelines_->plus_blend.CreateDefault(*context_, options_trianglestrip,
706 porter_duff_constants[12]);
707 pipelines_->modulate_blend.CreateDefault(*context_, options_trianglestrip,
708 porter_duff_constants[13]);
709 pipelines_->screen_blend.CreateDefault(*context_, options_trianglestrip,
710 porter_duff_constants[14]);
713 if (context_->GetCapabilities()->SupportsFramebufferFetch()) {
714 pipelines_->framebuffer_blend_color.CreateDefault(
715 *context_, options_trianglestrip,
717 pipelines_->framebuffer_blend_colorburn.CreateDefault(
718 *context_, options_trianglestrip,
720 pipelines_->framebuffer_blend_colordodge.CreateDefault(
721 *context_, options_trianglestrip,
723 pipelines_->framebuffer_blend_darken.CreateDefault(
724 *context_, options_trianglestrip,
726 pipelines_->framebuffer_blend_difference.CreateDefault(
727 *context_, options_trianglestrip,
729 pipelines_->framebuffer_blend_exclusion.CreateDefault(
730 *context_, options_trianglestrip,
732 pipelines_->framebuffer_blend_hardlight.CreateDefault(
733 *context_, options_trianglestrip,
735 pipelines_->framebuffer_blend_hue.CreateDefault(
736 *context_, options_trianglestrip,
738 pipelines_->framebuffer_blend_lighten.CreateDefault(
739 *context_, options_trianglestrip,
741 pipelines_->framebuffer_blend_luminosity.CreateDefault(
742 *context_, options_trianglestrip,
744 pipelines_->framebuffer_blend_multiply.CreateDefault(
745 *context_, options_trianglestrip,
747 pipelines_->framebuffer_blend_overlay.CreateDefault(
748 *context_, options_trianglestrip,
750 pipelines_->framebuffer_blend_saturation.CreateDefault(
751 *context_, options_trianglestrip,
753 pipelines_->framebuffer_blend_screen.CreateDefault(
754 *context_, options_trianglestrip,
756 pipelines_->framebuffer_blend_softlight.CreateDefault(
757 *context_, options_trianglestrip,
760 pipelines_->blend_color.CreateDefault(
761 *context_, options_trianglestrip,
763 pipelines_->blend_colorburn.CreateDefault(
764 *context_, options_trianglestrip,
766 pipelines_->blend_colordodge.CreateDefault(
767 *context_, options_trianglestrip,
769 pipelines_->blend_darken.CreateDefault(
770 *context_, options_trianglestrip,
772 pipelines_->blend_difference.CreateDefault(
773 *context_, options_trianglestrip,
775 pipelines_->blend_exclusion.CreateDefault(
776 *context_, options_trianglestrip,
778 pipelines_->blend_hardlight.CreateDefault(
779 *context_, options_trianglestrip,
781 pipelines_->blend_hue.CreateDefault(
782 *context_, options_trianglestrip,
784 pipelines_->blend_lighten.CreateDefault(
785 *context_, options_trianglestrip,
787 pipelines_->blend_luminosity.CreateDefault(
788 *context_, options_trianglestrip,
790 pipelines_->blend_multiply.CreateDefault(
791 *context_, options_trianglestrip,
793 pipelines_->blend_overlay.CreateDefault(
794 *context_, options_trianglestrip,
796 pipelines_->blend_saturation.CreateDefault(
797 *context_, options_trianglestrip,
799 pipelines_->blend_screen.CreateDefault(
800 *context_, options_trianglestrip,
802 pipelines_->blend_softlight.CreateDefault(
803 *context_, options_trianglestrip,
807 pipelines_->morphology_filter.CreateDefault(*context_, options_trianglestrip,
809 pipelines_->linear_to_srgb_filter.CreateDefault(*context_,
810 options_trianglestrip);
811 pipelines_->srgb_to_linear_filter.CreateDefault(*context_,
812 options_trianglestrip);
813 pipelines_->yuv_to_rgb_filter.CreateDefault(*context_, options_trianglestrip);
815 #if defined(IMPELLER_ENABLE_OPENGLES)
817 #if !defined(FML_OS_MACOSX)
819 pipelines_->tiled_texture_external.CreateDefault(*context_, options);
820 pipelines_->tiled_texture_uv_external.CreateDefault(*context_, options);
822 pipelines_->texture_downsample_gles.CreateDefault(*context_,
823 options_trianglestrip);
828 InitializeCommonlyUsedShadersIfNeeded();
838 return empty_texture_;
842 std::string_view label,
844 const std::shared_ptr<CommandBuffer>& command_buffer,
847 bool depth_stencil_enabled,
848 int32_t mip_count)
const {
849 const std::shared_ptr<Context>& context =
GetContext();
852 std::optional<RenderTarget::AttachmentConfig> depth_stencil_config =
854 : std::optional<RenderTarget::AttachmentConfig>();
856 if (context->GetCapabilities()->SupportsOffscreenMSAA() && msaa_enabled) {
858 *context, texture_size,
863 *context, texture_size,
867 return MakeSubpass(label, subpass_target, command_buffer, subpass_callback);
871 std::string_view label,
873 const std::shared_ptr<CommandBuffer>& command_buffer,
875 const std::shared_ptr<Context>& context =
GetContext();
878 if (!subpass_texture) {
879 return fml::Status(fml::StatusCode::kUnknown,
"");
882 auto sub_renderpass = command_buffer->CreateRenderPass(subpass_target);
883 if (!sub_renderpass) {
884 return fml::Status(fml::StatusCode::kUnknown,
"");
886 sub_renderpass->SetLabel(label);
888 if (!subpass_callback(*
this, *sub_renderpass)) {
889 return fml::Status(fml::StatusCode::kUnknown,
"");
892 if (!sub_renderpass->EncodeCommands()) {
893 return fml::Status(fml::StatusCode::kUnknown,
"");
896 const std::shared_ptr<Texture>& target_texture =
898 if (target_texture->GetMipCount() > 1) {
899 fml::Status mipmap_status =
901 if (!mipmap_status.ok()) {
902 return mipmap_status;
906 return subpass_target;
910 return *tessellator_;
918 return *context_->GetCapabilities();
922 const std::string& unique_entrypoint_name,
925 create_callback)
const {
926 RuntimeEffectPipelineKey key{unique_entrypoint_name, options};
927 auto it = runtime_effect_pipelines_.find(key);
928 if (it == runtime_effect_pipelines_.end()) {
929 it = runtime_effect_pipelines_.insert(it, {key, create_callback()});
935 const std::string& unique_entrypoint_name)
const {
936 for (
auto it = runtime_effect_pipelines_.begin();
937 it != runtime_effect_pipelines_.end();) {
938 if (it->first.unique_entrypoint_name == unique_entrypoint_name) {
939 it = runtime_effect_pipelines_.erase(it);
946 void ContentContext::InitializeCommonlyUsedShadersIfNeeded()
const {
947 if (
GetContext()->GetFlags().lazy_shader_mode) {
950 GetContext()->InitializeCommonlyUsedShadersIfNeeded();
955 return GetPipeline(
this, pipelines_->fast_gradient, opts);
960 return GetPipeline(
this, pipelines_->linear_gradient_fill, opts);
965 return GetPipeline(
this, pipelines_->linear_gradient_uniform_fill, opts);
970 return GetPipeline(
this, pipelines_->radial_gradient_uniform_fill, opts);
975 return GetPipeline(
this, pipelines_->sweep_gradient_uniform_fill, opts);
981 return GetPipeline(
this, pipelines_->linear_gradient_ssbo_fill, opts);
987 return GetPipeline(
this, pipelines_->radial_gradient_ssbo_fill, opts);
995 return GetPipeline(
this, pipelines_->conical_gradient_uniform_fill, opts);
997 return GetPipeline(
this, pipelines_->conical_gradient_uniform_fill_radial,
1000 return GetPipeline(
this, pipelines_->conical_gradient_uniform_fill_strip,
1004 this, pipelines_->conical_gradient_uniform_fill_strip_and_radial,
1015 return GetPipeline(
this, pipelines_->conical_gradient_ssbo_fill, opts);
1017 return GetPipeline(
this, pipelines_->conical_gradient_ssbo_fill_radial,
1020 return GetPipeline(
this, pipelines_->conical_gradient_ssbo_fill_strip,
1024 this, pipelines_->conical_gradient_ssbo_fill_strip_and_radial, opts);
1031 return GetPipeline(
this, pipelines_->sweep_gradient_ssbo_fill, opts);
1036 return GetPipeline(
this, pipelines_->radial_gradient_fill, opts);
1044 return GetPipeline(
this, pipelines_->conical_gradient_fill, opts);
1046 return GetPipeline(
this, pipelines_->conical_gradient_fill_radial, opts);
1048 return GetPipeline(
this, pipelines_->conical_gradient_fill_strip, opts);
1051 this, pipelines_->conical_gradient_fill_strip_and_radial, opts);
1057 return GetPipeline(
this, pipelines_->rrect_blur, opts);
1062 return GetPipeline(
this, pipelines_->sweep_gradient_fill, opts);
1067 return GetPipeline(
this, pipelines_->solid_fill, opts);
1072 return GetPipeline(
this, pipelines_->texture, opts);
1077 return GetPipeline(
this, pipelines_->texture_strict_src, opts);
1082 return GetPipeline(
this, pipelines_->tiled_texture, opts);
1087 return GetPipeline(
this, pipelines_->gaussian_blur, opts);
1092 return GetPipeline(
this, pipelines_->border_mask_blur, opts);
1097 return GetPipeline(
this, pipelines_->morphology_filter, opts);
1102 return GetPipeline(
this, pipelines_->color_matrix_color_filter, opts);
1107 return GetPipeline(
this, pipelines_->linear_to_srgb_filter, opts);
1112 return GetPipeline(
this, pipelines_->srgb_to_linear_filter, opts);
1116 return GetPipeline(
this, pipelines_->clip, opts);
1121 return GetPipeline(
this, pipelines_->glyph_atlas, opts);
1126 return GetPipeline(
this, pipelines_->yuv_to_rgb_filter, opts);
1186 return GetPipeline(
this, pipelines_->clear_blend, opts);
1191 return GetPipeline(
this, pipelines_->source_blend, opts);
1196 return GetPipeline(
this, pipelines_->destination_blend, opts);
1201 return GetPipeline(
this, pipelines_->source_over_blend, opts);
1206 return GetPipeline(
this, pipelines_->destination_over_blend, opts);
1211 return GetPipeline(
this, pipelines_->source_in_blend, opts);
1216 return GetPipeline(
this, pipelines_->destination_in_blend, opts);
1221 return GetPipeline(
this, pipelines_->source_out_blend, opts);
1226 return GetPipeline(
this, pipelines_->destination_out_blend, opts);
1231 return GetPipeline(
this, pipelines_->source_a_top_blend, opts);
1236 return GetPipeline(
this, pipelines_->destination_a_top_blend, opts);
1241 return GetPipeline(
this, pipelines_->xor_blend, opts);
1246 return GetPipeline(
this, pipelines_->plus_blend, opts);
1251 return GetPipeline(
this, pipelines_->modulate_blend, opts);
1256 return GetPipeline(
this, pipelines_->screen_blend, opts);
1261 return GetPipeline(
this, pipelines_->blend_color, opts);
1266 return GetPipeline(
this, pipelines_->blend_colorburn, opts);
1271 return GetPipeline(
this, pipelines_->blend_colordodge, opts);
1276 return GetPipeline(
this, pipelines_->blend_darken, opts);
1281 return GetPipeline(
this, pipelines_->blend_difference, opts);
1286 return GetPipeline(
this, pipelines_->blend_exclusion, opts);
1291 return GetPipeline(
this, pipelines_->blend_hardlight, opts);
1296 return GetPipeline(
this, pipelines_->blend_hue, opts);
1301 return GetPipeline(
this, pipelines_->blend_lighten, opts);
1306 return GetPipeline(
this, pipelines_->blend_luminosity, opts);
1311 return GetPipeline(
this, pipelines_->blend_multiply, opts);
1316 return GetPipeline(
this, pipelines_->blend_overlay, opts);
1321 return GetPipeline(
this, pipelines_->blend_saturation, opts);
1326 return GetPipeline(
this, pipelines_->blend_screen, opts);
1331 return GetPipeline(
this, pipelines_->blend_softlight, opts);
1336 return GetPipeline(
this, pipelines_->texture_downsample, opts);
1342 return GetPipeline(
this, pipelines_->framebuffer_blend_color, opts);
1348 return GetPipeline(
this, pipelines_->framebuffer_blend_colorburn, opts);
1354 return GetPipeline(
this, pipelines_->framebuffer_blend_colordodge, opts);
1360 return GetPipeline(
this, pipelines_->framebuffer_blend_darken, opts);
1366 return GetPipeline(
this, pipelines_->framebuffer_blend_difference, opts);
1372 return GetPipeline(
this, pipelines_->framebuffer_blend_exclusion, opts);
1378 return GetPipeline(
this, pipelines_->framebuffer_blend_hardlight, opts);
1384 return GetPipeline(
this, pipelines_->framebuffer_blend_hue, opts);
1390 return GetPipeline(
this, pipelines_->framebuffer_blend_lighten, opts);
1396 return GetPipeline(
this, pipelines_->framebuffer_blend_luminosity, opts);
1402 return GetPipeline(
this, pipelines_->framebuffer_blend_multiply, opts);
1408 return GetPipeline(
this, pipelines_->framebuffer_blend_overlay, opts);
1414 return GetPipeline(
this, pipelines_->framebuffer_blend_saturation, opts);
1420 return GetPipeline(
this, pipelines_->framebuffer_blend_screen, opts);
1426 return GetPipeline(
this, pipelines_->framebuffer_blend_softlight, opts);
1433 return GetPipeline(
this, pipelines_->vertices_uber_1_, opts);
1435 return GetPipeline(
this, pipelines_->vertices_uber_2_, opts);
1440 return GetPipeline(
this, pipelines_->line, opts);
1443 #ifdef IMPELLER_ENABLE_OPENGLES
1444 PipelineRef ContentContext::GetDownsampleTextureGlesPipeline(
1446 return GetPipeline(
this, pipelines_->texture_downsample_gles, opts);
1449 PipelineRef ContentContext::GetTiledTextureExternalPipeline(
1450 ContentContextOptions opts)
const {
1452 return GetPipeline(
this, pipelines_->tiled_texture_external, opts);
1455 PipelineRef ContentContext::GetTiledTextureUvExternalPipeline(
1456 ContentContextOptions opts)
const {
1458 return GetPipeline(
this, pipelines_->tiled_texture_uv_external, opts);
PipelineRef GetBlendLuminosityPipeline(ContentContextOptions opts) const
HostBuffer & GetTransientsBuffer() const
Retrieve the currnent host buffer for transient storage.
PipelineRef GetTiledTexturePipeline(ContentContextOptions opts) const
PipelineRef GetFramebufferBlendColorPipeline(ContentContextOptions opts) const
PipelineRef GetDownsamplePipeline(ContentContextOptions opts) const
PipelineRef GetSourceInBlendPipeline(ContentContextOptions opts) const
void ClearCachedRuntimeEffectPipeline(const std::string &unique_entrypoint_name) const
PipelineRef GetLinearGradientFillPipeline(ContentContextOptions opts) const
PipelineRef GetFramebufferBlendOverlayPipeline(ContentContextOptions opts) const
PipelineRef GetBlendColorDodgePipeline(ContentContextOptions opts) const
PipelineRef GetFramebufferBlendColorBurnPipeline(ContentContextOptions opts) const
PipelineRef GetPorterDuffPipeline(BlendMode mode, ContentContextOptions opts) const
std::shared_ptr< Texture > GetEmptyTexture() const
PipelineRef GetSourceOutBlendPipeline(ContentContextOptions opts) const
PipelineRef GetScreenBlendPipeline(ContentContextOptions opts) const
PipelineRef GetBlendColorPipeline(ContentContextOptions opts) const
PipelineRef GetLinePipeline(ContentContextOptions opts) const
PipelineRef GetFramebufferBlendLuminosityPipeline(ContentContextOptions opts) const
PipelineRef GetPlusBlendPipeline(ContentContextOptions opts) const
PipelineRef GetFastGradientPipeline(ContentContextOptions opts) const
ContentContext(std::shared_ptr< Context > context, std::shared_ptr< TypographerContext > typographer_context, std::shared_ptr< RenderTargetAllocator > render_target_allocator=nullptr)
PipelineRef GetSolidFillPipeline(ContentContextOptions opts) const
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 GetModulateBlendPipeline(ContentContextOptions opts) const
PipelineRef GetFramebufferBlendHardLightPipeline(ContentContextOptions opts) const
PipelineRef GetFramebufferBlendColorDodgePipeline(ContentContextOptions opts) const
PipelineRef GetSweepGradientUniformFillPipeline(ContentContextOptions opts) const
PipelineRef GetBlendSoftLightPipeline(ContentContextOptions opts) const
PipelineRef GetDestinationATopBlendPipeline(ContentContextOptions opts) const
PipelineRef GetTextureStrictSrcPipeline(ContentContextOptions opts) const
PipelineRef GetCachedRuntimeEffectPipeline(const std::string &unique_entrypoint_name, const ContentContextOptions &options, const std::function< std::shared_ptr< Pipeline< PipelineDescriptor >>()> &create_callback) const
PipelineRef GetRadialGradientSSBOFillPipeline(ContentContextOptions opts) const
PipelineRef GetBlendColorBurnPipeline(ContentContextOptions opts) const
PipelineRef GetSweepGradientSSBOFillPipeline(ContentContextOptions opts) const
PipelineRef GetLinearGradientUniformFillPipeline(ContentContextOptions opts) const
PipelineRef GetFramebufferBlendScreenPipeline(ContentContextOptions opts) const
PipelineRef GetLinearGradientSSBOFillPipeline(ContentContextOptions opts) const
PipelineRef GetRadialGradientFillPipeline(ContentContextOptions opts) const
PipelineRef GetTexturePipeline(ContentContextOptions opts) const
PipelineRef GetBlendHardLightPipeline(ContentContextOptions opts) const
PipelineRef GetClearBlendPipeline(ContentContextOptions opts) const
PipelineRef GetConicalGradientUniformFillPipeline(ContentContextOptions opts, ConicalKind kind) const
PipelineRef GetRadialGradientUniformFillPipeline(ContentContextOptions opts) const
PipelineRef GetSweepGradientFillPipeline(ContentContextOptions opts) const
PipelineRef GetFramebufferBlendExclusionPipeline(ContentContextOptions opts) const
PipelineRef GetFramebufferBlendDarkenPipeline(ContentContextOptions opts) const
PipelineRef GetBlendSaturationPipeline(ContentContextOptions opts) const
PipelineRef GetFramebufferBlendSoftLightPipeline(ContentContextOptions opts) const
PipelineRef GetFramebufferBlendLightenPipeline(ContentContextOptions opts) const
PipelineRef GetMorphologyFilterPipeline(ContentContextOptions opts) const
PipelineRef GetFramebufferBlendSaturationPipeline(ContentContextOptions opts) const
PipelineRef GetBlendDifferencePipeline(ContentContextOptions opts) const
PipelineRef GetGaussianBlurPipeline(ContentContextOptions opts) const
PipelineRef GetBlendHuePipeline(ContentContextOptions opts) const
PipelineRef GetSrgbToLinearFilterPipeline(ContentContextOptions opts) const
PipelineRef GetDestinationOutBlendPipeline(ContentContextOptions opts) const
PipelineRef GetYUVToRGBFilterPipeline(ContentContextOptions opts) const
PipelineRef GetFramebufferBlendDifferencePipeline(ContentContextOptions opts) const
PipelineRef GetFramebufferBlendHuePipeline(ContentContextOptions opts) const
PipelineRef GetSourceATopBlendPipeline(ContentContextOptions opts) const
PipelineRef GetXorBlendPipeline(ContentContextOptions opts) const
PipelineRef GetGlyphAtlasPipeline(ContentContextOptions opts) const
PipelineRef GetClipPipeline(ContentContextOptions opts) const
const std::shared_ptr< RenderTargetAllocator > & GetRenderTargetCache() const
PipelineRef GetRRectBlurPipeline(ContentContextOptions opts) const
PipelineRef GetBlendScreenPipeline(ContentContextOptions opts) const
std::function< bool(const ContentContext &, RenderPass &)> SubpassCallback
PipelineRef GetBlendDarkenPipeline(ContentContextOptions opts) const
PipelineRef GetSourceBlendPipeline(ContentContextOptions opts) const
PipelineRef GetLinearToSrgbFilterPipeline(ContentContextOptions opts) const
PipelineRef GetBlendOverlayPipeline(ContentContextOptions opts) const
PipelineRef GetDestinationBlendPipeline(ContentContextOptions opts) const
PipelineRef GetDestinationOverBlendPipeline(ContentContextOptions opts) const
PipelineRef GetFramebufferBlendMultiplyPipeline(ContentContextOptions opts) const
PipelineRef GetConicalGradientSSBOFillPipeline(ContentContextOptions opts, ConicalKind kind) const
Tessellator & GetTessellator() const
PipelineRef GetBlendLightenPipeline(ContentContextOptions opts) const
PipelineRef GetBlendMultiplyPipeline(ContentContextOptions opts) const
PipelineRef GetSourceOverBlendPipeline(ContentContextOptions opts) const
PipelineRef GetBlendExclusionPipeline(ContentContextOptions opts) const
PipelineRef GetColorMatrixColorFilterPipeline(ContentContextOptions opts) const
PipelineRef GetConicalGradientFillPipeline(ContentContextOptions opts, ConicalKind kind) const
std::shared_ptr< Context > GetContext() const
PipelineRef GetDestinationInBlendPipeline(ContentContextOptions opts) const
PipelineRef GetBorderMaskBlurPipeline(ContentContextOptions opts) const
PipelineRef GetDrawVerticesUberPipeline(BlendMode blend_mode, ContentContextOptions opts) const
To do anything rendering related with Impeller, you need a context.
virtual const std::shared_ptr< const Capabilities > & GetCapabilities() const =0
Get the capabilities of Impeller context. All optionally supported feature of the platform,...
static constexpr BlendMode kLastPipelineBlendMode
BufferView Emplace(const BufferType &buffer, size_t alignment=0)
Emplace non-uniform data (like contiguous vertices) onto the host buffer.
PipelineDescriptor & SetDepthStencilAttachmentDescriptor(std::optional< DepthAttachmentDescriptor > desc)
void ClearStencilAttachments()
void SetPolygonMode(PolygonMode mode)
std::optional< DepthAttachmentDescriptor > GetDepthStencilAttachmentDescriptor() const
PipelineDescriptor & SetStencilAttachmentDescriptors(std::optional< StencilAttachmentDescriptor > front_and_back)
const ColorAttachmentDescriptor * GetColorAttachmentDescriptor(size_t index) const
PipelineDescriptor & SetColorAttachmentDescriptor(size_t index, ColorAttachmentDescriptor desc)
PipelineDescriptor & SetSampleCount(SampleCount samples)
void SetPrimitiveType(PrimitiveType type)
void ClearDepthAttachment()
std::optional< StencilAttachmentDescriptor > GetFrontStencilAttachmentDescriptor() const
An implementation of the [RenderTargetAllocator] that caches all allocated texture data for one frame...
std::shared_ptr< Texture > GetRenderTargetTexture() const
static constexpr AttachmentConfig kDefaultColorAttachmentConfig
static constexpr AttachmentConfigMSAA kDefaultColorAttachmentConfigMSAA
static constexpr AttachmentConfig kDefaultStencilAttachmentConfig
A utility that generates triangles of the specified fill type given a polyline. This happens on the C...
A cache for blurred text that re-uses these across frames.
ScopedObject< Object > Create(CtorArgs &&... args)
@ kOneMinusDestinationAlpha
static std::unique_ptr< PipelineT > CreateDefaultPipeline(const Context &context)
raw_ptr< Pipeline< PipelineDescriptor > > PipelineRef
A raw ptr to a pipeline object.
const char * BlendModeToString(BlendMode blend_mode)
@ kEqual
Comparison test passes if new_value == current_value.
@ kAlways
Comparison test passes always passes.
@ kLess
Comparison test passes if new_value < current_value.
@ kNotEqual
Comparison test passes if new_value != current_value.
fml::Status AddMipmapGeneration(const std::shared_ptr< CommandBuffer > &command_buffer, const std::shared_ptr< Context > &context, const std::shared_ptr< Texture > &texture)
Adds a blit command to the render pass.
@ kDecrementWrap
Decrement the current stencil value by 1. If at zero, set to maximum.
@ kSetToReferenceValue
Reset the stencil value to the reference value.
@ kIncrementClamp
Increment the current stencil value by 1. Clamp it to the maximum.
@ kIncrementWrap
Increment the current stencil value by 1. If at maximum, set to zero.
@ kKeep
Don't modify the current stencil value.
std::array< std::vector< Scalar >, 15 > GetPorterDuffSpecConstants(bool supports_decal)
Describe the color attachment that will be used with this pipeline.
BlendOperation color_blend_op
BlendFactor dst_color_blend_factor
ColorWriteMask write_mask
BlendFactor src_alpha_blend_factor
BlendOperation alpha_blend_op
BlendFactor src_color_blend_factor
BlendFactor dst_alpha_blend_factor
constexpr std::array< uint8_t, 4 > ToR8G8B8A8() const
Convert to R8G8B8A8 representation.
static constexpr Color BlackTransparent()
Variants< SolidFillPipeline > solid_fill
Variants< PorterDuffBlendPipeline > destination_blend
Variants< SweepGradientSSBOFillPipeline > sweep_gradient_ssbo_fill
Variants< BlendScreenPipeline > blend_screen
Variants< PorterDuffBlendPipeline > modulate_blend
Variants< FramebufferBlendOverlayPipeline > framebuffer_blend_overlay
Variants< BlendSaturationPipeline > blend_saturation
Variants< TiledTexturePipeline > tiled_texture
Variants< PorterDuffBlendPipeline > destination_in_blend
Variants< BlendSoftLightPipeline > blend_softlight
Variants< BlendColorDodgePipeline > blend_colordodge
Variants< BlendMultiplyPipeline > blend_multiply
Variants< BlendColorPipeline > blend_color
Variants< BlendDifferencePipeline > blend_difference
Variants< BlendOverlayPipeline > blend_overlay
Variants< ConicalGradientFillStripPipeline > conical_gradient_fill_strip
Variants< FramebufferBlendExclusionPipeline > framebuffer_blend_exclusion
Variants< MorphologyFilterPipeline > morphology_filter
Variants< PorterDuffBlendPipeline > screen_blend
Variants< FramebufferBlendSaturationPipeline > framebuffer_blend_saturation
Variants< PorterDuffBlendPipeline > source_over_blend
Variants< LinearGradientFillPipeline > linear_gradient_fill
Variants< PorterDuffBlendPipeline > plus_blend
Variants< VerticesUber2Shader > vertices_uber_2_
Variants< FramebufferBlendHardLightPipeline > framebuffer_blend_hardlight
Variants< RadialGradientSSBOFillPipeline > radial_gradient_ssbo_fill
Variants< LinePipeline > line
Variants< PorterDuffBlendPipeline > clear_blend
Variants< ConicalGradientUniformFillConicalPipeline > conical_gradient_uniform_fill
Variants< FramebufferBlendMultiplyPipeline > framebuffer_blend_multiply
Variants< ConicalGradientSSBOFillPipeline > conical_gradient_ssbo_fill
Variants< TextureDownsamplePipeline > texture_downsample
Variants< FramebufferBlendLuminosityPipeline > framebuffer_blend_luminosity
Variants< FramebufferBlendSoftLightPipeline > framebuffer_blend_softlight
Variants< SweepGradientUniformFillPipeline > sweep_gradient_uniform_fill
Variants< BlendColorBurnPipeline > blend_colorburn
Variants< ConicalGradientUniformFillStripRadialPipeline > conical_gradient_uniform_fill_strip_and_radial
Variants< PorterDuffBlendPipeline > source_in_blend
Variants< ConicalGradientFillConicalPipeline > conical_gradient_fill
Variants< SweepGradientFillPipeline > sweep_gradient_fill
Variants< FramebufferBlendLightenPipeline > framebuffer_blend_lighten
Variants< PorterDuffBlendPipeline > source_a_top_blend
Variants< PorterDuffBlendPipeline > destination_a_top_blend
Variants< RadialGradientUniformFillPipeline > radial_gradient_uniform_fill
Variants< BlendLightenPipeline > blend_lighten
Variants< LinearGradientUniformFillPipeline > linear_gradient_uniform_fill
Variants< FramebufferBlendColorBurnPipeline > framebuffer_blend_colorburn
Variants< ConicalGradientFillRadialPipeline > conical_gradient_fill_radial
Variants< ClipPipeline > clip
Variants< PorterDuffBlendPipeline > destination_over_blend
Variants< BlendExclusionPipeline > blend_exclusion
Variants< SrgbToLinearFilterPipeline > srgb_to_linear_filter
Variants< ColorMatrixColorFilterPipeline > color_matrix_color_filter
Variants< LinearToSrgbFilterPipeline > linear_to_srgb_filter
Variants< ConicalGradientUniformFillRadialPipeline > conical_gradient_uniform_fill_radial
Variants< ConicalGradientSSBOFillPipeline > conical_gradient_ssbo_fill_strip
Variants< RRectBlurPipeline > rrect_blur
Variants< BlendDarkenPipeline > blend_darken
Variants< TexturePipeline > texture
Variants< PorterDuffBlendPipeline > source_out_blend
Variants< FramebufferBlendHuePipeline > framebuffer_blend_hue
Variants< TextureStrictSrcPipeline > texture_strict_src
Variants< FramebufferBlendColorPipeline > framebuffer_blend_color
Variants< BlendHuePipeline > blend_hue
Variants< FramebufferBlendDarkenPipeline > framebuffer_blend_darken
Variants< FastGradientPipeline > fast_gradient
Variants< ConicalGradientUniformFillStripPipeline > conical_gradient_uniform_fill_strip
Variants< PorterDuffBlendPipeline > xor_blend
Variants< GaussianBlurPipeline > gaussian_blur
Variants< LinearGradientSSBOFillPipeline > linear_gradient_ssbo_fill
Variants< ConicalGradientSSBOFillPipeline > conical_gradient_ssbo_fill_strip_and_radial
Variants< GlyphAtlasPipeline > glyph_atlas
Variants< PorterDuffBlendPipeline > source_blend
Variants< BlendLuminosityPipeline > blend_luminosity
Variants< BorderMaskBlurPipeline > border_mask_blur
Variants< FramebufferBlendScreenPipeline > framebuffer_blend_screen
Variants< FramebufferBlendDifferencePipeline > framebuffer_blend_difference
Variants< YUVToRGBFilterPipeline > yuv_to_rgb_filter
Variants< RadialGradientFillPipeline > radial_gradient_fill
Variants< ConicalGradientSSBOFillPipeline > conical_gradient_ssbo_fill_radial
Variants< ConicalGradientFillStripRadialPipeline > conical_gradient_fill_strip_and_radial
Variants< BlendHardLightPipeline > blend_hardlight
Variants< FramebufferBlendColorDodgePipeline > framebuffer_blend_colordodge
Variants< PorterDuffBlendPipeline > destination_out_blend
Variants< VerticesUber1Shader > vertices_uber_1_
PrimitiveType primitive_type
bool has_depth_stencil_attachments
void ApplyToPipelineDescriptor(PipelineDescriptor &desc) const
PixelFormat color_attachment_pixel_format
@ kOverdrawPreventionRestore
@ kOverdrawPreventionIncrement
bool is_for_rrect_blur_clear
CompareFunction depth_compare
CompareFunction depth_compare
static std::optional< PipelineDescriptor > MakeDefaultPipelineDescriptor(const Context &context, const std::vector< Scalar > &constants={})
Create a default pipeline descriptor using the combination reflected shader information....
StencilOperation stencil_failure
CompareFunction stencil_compare
StencilOperation depth_stencil_pass
A lightweight object that describes the attributes of a texture that can then used an allocator to cr...
std::shared_ptr< const fml::Mapping > data