5 #ifndef FLUTTER_IMPELLER_ENTITY_CONTENTS_CONTENT_CONTEXT_H_
6 #define FLUTTER_IMPELLER_ENTITY_CONTENTS_CONTENT_CONTEXT_H_
8 #include <initializer_list>
11 #include <unordered_map>
13 #include "flutter/fml/build_config.h"
14 #include "flutter/fml/logging.h"
15 #include "flutter/fml/status_or.h"
26 #include "impeller/entity/checkerboard.frag.h"
27 #include "impeller/entity/checkerboard.vert.h"
28 #endif // IMPELLER_DEBUG
30 #include "impeller/entity/blend.frag.h"
31 #include "impeller/entity/blend.vert.h"
32 #include "impeller/entity/border_mask_blur.frag.h"
33 #include "impeller/entity/border_mask_blur.vert.h"
34 #include "impeller/entity/clip.frag.h"
35 #include "impeller/entity/clip.vert.h"
36 #include "impeller/entity/color_matrix_color_filter.frag.h"
37 #include "impeller/entity/color_matrix_color_filter.vert.h"
38 #include "impeller/entity/conical_gradient_fill.frag.h"
39 #include "impeller/entity/glyph_atlas.frag.h"
40 #include "impeller/entity/glyph_atlas.vert.h"
41 #include "impeller/entity/glyph_atlas_color.frag.h"
42 #include "impeller/entity/gradient_fill.vert.h"
43 #include "impeller/entity/linear_gradient_fill.frag.h"
44 #include "impeller/entity/linear_to_srgb_filter.frag.h"
45 #include "impeller/entity/linear_to_srgb_filter.vert.h"
46 #include "impeller/entity/morphology_filter.frag.h"
47 #include "impeller/entity/morphology_filter.vert.h"
48 #include "impeller/entity/points.comp.h"
49 #include "impeller/entity/porter_duff_blend.frag.h"
50 #include "impeller/entity/porter_duff_blend.vert.h"
51 #include "impeller/entity/radial_gradient_fill.frag.h"
52 #include "impeller/entity/rrect_blur.frag.h"
53 #include "impeller/entity/rrect_blur.vert.h"
54 #include "impeller/entity/solid_fill.frag.h"
55 #include "impeller/entity/solid_fill.vert.h"
56 #include "impeller/entity/srgb_to_linear_filter.frag.h"
57 #include "impeller/entity/srgb_to_linear_filter.vert.h"
58 #include "impeller/entity/sweep_gradient_fill.frag.h"
59 #include "impeller/entity/texture_fill.frag.h"
60 #include "impeller/entity/texture_fill.vert.h"
61 #include "impeller/entity/tiled_texture_fill.frag.h"
62 #include "impeller/entity/uv.comp.h"
63 #include "impeller/entity/vertices.frag.h"
64 #include "impeller/entity/yuv_to_rgb_filter.frag.h"
65 #include "impeller/entity/yuv_to_rgb_filter.vert.h"
67 #include "impeller/entity/gaussian_blur.vert.h"
68 #include "impeller/entity/gaussian_blur_noalpha_decal.frag.h"
69 #include "impeller/entity/gaussian_blur_noalpha_nodecal.frag.h"
70 #include "impeller/entity/kernel_decal.frag.h"
71 #include "impeller/entity/kernel_nodecal.frag.h"
73 #include "impeller/entity/position_color.vert.h"
77 #include "impeller/entity/conical_gradient_ssbo_fill.frag.h"
78 #include "impeller/entity/linear_gradient_ssbo_fill.frag.h"
79 #include "impeller/entity/radial_gradient_ssbo_fill.frag.h"
80 #include "impeller/entity/sweep_gradient_ssbo_fill.frag.h"
82 #include "impeller/entity/advanced_blend.frag.h"
83 #include "impeller/entity/advanced_blend.vert.h"
85 #include "impeller/entity/framebuffer_blend.frag.h"
86 #include "impeller/entity/framebuffer_blend.vert.h"
88 #ifdef IMPELLER_ENABLE_OPENGLES
89 #include "impeller/entity/texture_fill_external.frag.h"
90 #include "impeller/entity/tiled_texture_fill_external.frag.h"
91 #endif // IMPELLER_ENABLE_OPENGLES
93 #if IMPELLER_ENABLE_3D
100 using CheckerboardPipeline =
101 RenderPipelineT<CheckerboardVertexShader, CheckerboardFragmentShader>;
102 #endif // IMPELLER_DEBUG
112 ConicalGradientFillFragmentShader>;
117 LinearGradientSsboFillFragmentShader>;
120 ConicalGradientSsboFillFragmentShader>;
123 RadialGradientSsboFillFragmentShader>;
126 SweepGradientSsboFillFragmentShader>;
138 GaussianBlurNoalphaDecalFragmentShader>;
141 GaussianBlurNoalphaNodecalFragmentShader>;
150 MorphologyFilterFragmentShader>;
153 ColorMatrixColorFilterFragmentShader>;
156 LinearToSrgbFilterFragmentShader>;
159 SrgbToLinearFilterFragmentShader>;
209 FramebufferBlendFragmentShader>;
212 FramebufferBlendFragmentShader>;
215 FramebufferBlendFragmentShader>;
218 FramebufferBlendFragmentShader>;
221 FramebufferBlendFragmentShader>;
224 FramebufferBlendFragmentShader>;
227 FramebufferBlendFragmentShader>;
230 FramebufferBlendFragmentShader>;
233 FramebufferBlendFragmentShader>;
236 FramebufferBlendFragmentShader>;
239 FramebufferBlendFragmentShader>;
242 FramebufferBlendFragmentShader>;
245 FramebufferBlendFragmentShader>;
248 FramebufferBlendFragmentShader>;
251 FramebufferBlendFragmentShader>;
257 #ifdef IMPELLER_ENABLE_OPENGLES
258 using TextureExternalPipeline =
261 using TiledTextureExternalPipeline =
263 TiledTextureFillExternalFragmentShader>;
264 #endif // IMPELLER_ENABLE_OPENGLES
330 class RenderTargetCache;
335 std::shared_ptr<Context> context,
336 std::shared_ptr<TypographerContext> typographer_context,
337 std::shared_ptr<RenderTargetAllocator> render_target_allocator =
nullptr);
343 #if IMPELLER_ENABLE_3D
344 std::shared_ptr<scene::SceneContext> GetSceneContext()
const;
345 #endif // IMPELLER_ENABLE_3D
349 #ifdef IMPELLER_DEBUG
350 std::shared_ptr<Pipeline<PipelineDescriptor>> GetCheckerboardPipeline(
352 return GetPipeline(checkerboard_pipelines_, opts);
354 #endif // IMPELLER_DEBUG
358 return GetPipeline(linear_gradient_fill_pipelines_, opts);
361 std::shared_ptr<Pipeline<PipelineDescriptor>>
364 return GetPipeline(linear_gradient_ssbo_fill_pipelines_, opts);
367 std::shared_ptr<Pipeline<PipelineDescriptor>>
370 return GetPipeline(radial_gradient_ssbo_fill_pipelines_, opts);
373 std::shared_ptr<Pipeline<PipelineDescriptor>>
376 return GetPipeline(conical_gradient_ssbo_fill_pipelines_, opts);
379 std::shared_ptr<Pipeline<PipelineDescriptor>>
382 return GetPipeline(sweep_gradient_ssbo_fill_pipelines_, opts);
387 return GetPipeline(radial_gradient_fill_pipelines_, opts);
392 return GetPipeline(conical_gradient_fill_pipelines_, opts);
397 return GetPipeline(rrect_blur_pipelines_, opts);
402 return GetPipeline(sweep_gradient_fill_pipelines_, opts);
407 return GetPipeline(solid_fill_pipelines_, opts);
412 return GetPipeline(texture_blend_pipelines_, opts);
417 return GetPipeline(texture_pipelines_, opts);
420 #ifdef IMPELLER_ENABLE_OPENGLES
421 std::shared_ptr<Pipeline<PipelineDescriptor>> GetTextureExternalPipeline(
425 return GetPipeline(texture_external_pipelines_, opts);
428 std::shared_ptr<Pipeline<PipelineDescriptor>> GetTiledTextureExternalPipeline(
429 ContentContextOptions opts)
const {
432 return GetPipeline(tiled_texture_external_pipelines_, opts);
434 #endif // IMPELLER_ENABLE_OPENGLES
438 return GetPipeline(position_uv_pipelines_, opts);
443 return GetPipeline(tiled_texture_pipelines_, opts);
448 return GetPipeline(gaussian_blur_noalpha_decal_pipelines_, opts);
453 return GetPipeline(gaussian_blur_noalpha_nodecal_pipelines_, opts);
458 return GetPipeline(kernel_decal_pipelines_, opts);
463 return GetPipeline(kernel_nodecal_pipelines_, opts);
468 return GetPipeline(border_mask_blur_pipelines_, opts);
473 return GetPipeline(morphology_filter_pipelines_, opts);
476 std::shared_ptr<Pipeline<PipelineDescriptor>>
478 return GetPipeline(color_matrix_color_filter_pipelines_, opts);
483 return GetPipeline(linear_to_srgb_filter_pipelines_, opts);
488 return GetPipeline(srgb_to_linear_filter_pipelines_, opts);
493 return GetPipeline(clip_pipelines_, opts);
498 return GetPipeline(glyph_atlas_pipelines_, opts);
503 return GetPipeline(glyph_atlas_color_pipelines_, opts);
508 return GetPipeline(geometry_color_pipelines_, opts);
513 return GetPipeline(yuv_to_rgb_filter_pipelines_, opts);
518 return GetPipeline(porter_duff_blend_pipelines_, opts);
525 return GetPipeline(blend_color_pipelines_, opts);
530 return GetPipeline(blend_colorburn_pipelines_, opts);
535 return GetPipeline(blend_colordodge_pipelines_, opts);
540 return GetPipeline(blend_darken_pipelines_, opts);
545 return GetPipeline(blend_difference_pipelines_, opts);
550 return GetPipeline(blend_exclusion_pipelines_, opts);
555 return GetPipeline(blend_hardlight_pipelines_, opts);
560 return GetPipeline(blend_hue_pipelines_, opts);
565 return GetPipeline(blend_lighten_pipelines_, opts);
570 return GetPipeline(blend_luminosity_pipelines_, opts);
575 return GetPipeline(blend_multiply_pipelines_, opts);
580 return GetPipeline(blend_overlay_pipelines_, opts);
585 return GetPipeline(blend_saturation_pipelines_, opts);
590 return GetPipeline(blend_screen_pipelines_, opts);
595 return GetPipeline(blend_softlight_pipelines_, opts);
599 std::shared_ptr<Pipeline<PipelineDescriptor>>
602 return GetPipeline(framebuffer_blend_color_pipelines_, opts);
605 std::shared_ptr<Pipeline<PipelineDescriptor>>
608 return GetPipeline(framebuffer_blend_colorburn_pipelines_, opts);
611 std::shared_ptr<Pipeline<PipelineDescriptor>>
614 return GetPipeline(framebuffer_blend_colordodge_pipelines_, opts);
617 std::shared_ptr<Pipeline<PipelineDescriptor>>
620 return GetPipeline(framebuffer_blend_darken_pipelines_, opts);
623 std::shared_ptr<Pipeline<PipelineDescriptor>>
626 return GetPipeline(framebuffer_blend_difference_pipelines_, opts);
629 std::shared_ptr<Pipeline<PipelineDescriptor>>
632 return GetPipeline(framebuffer_blend_exclusion_pipelines_, opts);
635 std::shared_ptr<Pipeline<PipelineDescriptor>>
638 return GetPipeline(framebuffer_blend_hardlight_pipelines_, opts);
644 return GetPipeline(framebuffer_blend_hue_pipelines_, opts);
647 std::shared_ptr<Pipeline<PipelineDescriptor>>
650 return GetPipeline(framebuffer_blend_lighten_pipelines_, opts);
653 std::shared_ptr<Pipeline<PipelineDescriptor>>
656 return GetPipeline(framebuffer_blend_luminosity_pipelines_, opts);
659 std::shared_ptr<Pipeline<PipelineDescriptor>>
662 return GetPipeline(framebuffer_blend_multiply_pipelines_, opts);
665 std::shared_ptr<Pipeline<PipelineDescriptor>>
668 return GetPipeline(framebuffer_blend_overlay_pipelines_, opts);
671 std::shared_ptr<Pipeline<PipelineDescriptor>>
674 return GetPipeline(framebuffer_blend_saturation_pipelines_, opts);
677 std::shared_ptr<Pipeline<PipelineDescriptor>>
680 return GetPipeline(framebuffer_blend_screen_pipelines_, opts);
683 std::shared_ptr<Pipeline<PipelineDescriptor>>
686 return GetPipeline(framebuffer_blend_softlight_pipelines_, opts);
692 return point_field_compute_pipelines_;
698 return uv_compute_pipelines_;
713 const std::string& label,
716 bool msaa_enabled =
true)
const;
720 const std::string& label,
725 return lazy_glyph_atlas_;
729 return render_target_cache_;
733 std::shared_ptr<Context> context_;
734 std::shared_ptr<LazyGlyphAtlas> lazy_glyph_atlas_;
736 template <
class PipelineT>
739 Variants() =
default;
742 std::unique_ptr<PipelineT> pipeline) {
743 pipelines_[options] = std::move(pipeline);
746 void SetDefault(
const ContentContextOptions& options,
747 std::unique_ptr<PipelineT> pipeline) {
748 default_options_ = options;
749 Set(options, std::move(pipeline));
752 void CreateDefault(
const Context& context,
753 const ContentContextOptions& options,
754 const std::initializer_list<Scalar>& constants = {},
757 PipelineT::Builder::MakeDefaultPipelineDescriptor(context, constants);
758 if (!desc.has_value()) {
762 desc->SetUseSubpassInput(subpass_input);
763 options.ApplyToPipelineDescriptor(*desc);
764 SetDefault(options, std::make_unique<PipelineT>(context, desc));
767 PipelineT* Get(
const ContentContextOptions& options)
const {
768 if (
auto found = pipelines_.find(options); found != pipelines_.end()) {
769 return found->second.get();
774 PipelineT* GetDefault()
const {
775 if (!default_options_.has_value()) {
778 return Get(default_options_.value());
781 size_t GetPipelineCount()
const {
return pipelines_.size(); }
784 std::optional<ContentContextOptions> default_options_;
785 std::unordered_map<ContentContextOptions,
786 std::unique_ptr<PipelineT>,
787 ContentContextOptions::Hash,
788 ContentContextOptions::Equal>
791 Variants(
const Variants&) =
delete;
793 Variants& operator=(
const Variants&) =
delete;
800 #ifdef IMPELLER_DEBUG
801 mutable Variants<CheckerboardPipeline> checkerboard_pipelines_;
802 #endif // IMPELLER_DEBUG
804 mutable Variants<SolidFillPipeline> solid_fill_pipelines_;
805 mutable Variants<LinearGradientFillPipeline> linear_gradient_fill_pipelines_;
806 mutable Variants<RadialGradientFillPipeline> radial_gradient_fill_pipelines_;
807 mutable Variants<ConicalGradientFillPipeline>
808 conical_gradient_fill_pipelines_;
809 mutable Variants<SweepGradientFillPipeline> sweep_gradient_fill_pipelines_;
810 mutable Variants<LinearGradientSSBOFillPipeline>
811 linear_gradient_ssbo_fill_pipelines_;
812 mutable Variants<RadialGradientSSBOFillPipeline>
813 radial_gradient_ssbo_fill_pipelines_;
814 mutable Variants<ConicalGradientSSBOFillPipeline>
815 conical_gradient_ssbo_fill_pipelines_;
816 mutable Variants<SweepGradientSSBOFillPipeline>
817 sweep_gradient_ssbo_fill_pipelines_;
818 mutable Variants<RRectBlurPipeline> rrect_blur_pipelines_;
819 mutable Variants<BlendPipeline> texture_blend_pipelines_;
820 mutable Variants<TexturePipeline> texture_pipelines_;
821 #ifdef IMPELLER_ENABLE_OPENGLES
822 mutable Variants<TextureExternalPipeline> texture_external_pipelines_;
823 mutable Variants<TiledTextureExternalPipeline>
824 tiled_texture_external_pipelines_;
825 #endif // IMPELLER_ENABLE_OPENGLES
826 mutable Variants<PositionUVPipeline> position_uv_pipelines_;
827 mutable Variants<TiledTexturePipeline> tiled_texture_pipelines_;
828 mutable Variants<GaussianBlurDecalPipeline>
829 gaussian_blur_noalpha_decal_pipelines_;
830 mutable Variants<GaussianBlurPipeline>
831 gaussian_blur_noalpha_nodecal_pipelines_;
832 mutable Variants<KernelDecalPipeline> kernel_decal_pipelines_;
833 mutable Variants<KernelPipeline> kernel_nodecal_pipelines_;
834 mutable Variants<BorderMaskBlurPipeline> border_mask_blur_pipelines_;
835 mutable Variants<MorphologyFilterPipeline> morphology_filter_pipelines_;
836 mutable Variants<ColorMatrixColorFilterPipeline>
837 color_matrix_color_filter_pipelines_;
838 mutable Variants<LinearToSrgbFilterPipeline> linear_to_srgb_filter_pipelines_;
839 mutable Variants<SrgbToLinearFilterPipeline> srgb_to_linear_filter_pipelines_;
840 mutable Variants<ClipPipeline> clip_pipelines_;
841 mutable Variants<GlyphAtlasPipeline> glyph_atlas_pipelines_;
842 mutable Variants<GlyphAtlasColorPipeline> glyph_atlas_color_pipelines_;
843 mutable Variants<GeometryColorPipeline> geometry_color_pipelines_;
844 mutable Variants<YUVToRGBFilterPipeline> yuv_to_rgb_filter_pipelines_;
845 mutable Variants<PorterDuffBlendPipeline> porter_duff_blend_pipelines_;
847 mutable Variants<BlendColorPipeline> blend_color_pipelines_;
848 mutable Variants<BlendColorBurnPipeline> blend_colorburn_pipelines_;
849 mutable Variants<BlendColorDodgePipeline> blend_colordodge_pipelines_;
850 mutable Variants<BlendDarkenPipeline> blend_darken_pipelines_;
851 mutable Variants<BlendDifferencePipeline> blend_difference_pipelines_;
852 mutable Variants<BlendExclusionPipeline> blend_exclusion_pipelines_;
853 mutable Variants<BlendHardLightPipeline> blend_hardlight_pipelines_;
854 mutable Variants<BlendHuePipeline> blend_hue_pipelines_;
855 mutable Variants<BlendLightenPipeline> blend_lighten_pipelines_;
856 mutable Variants<BlendLuminosityPipeline> blend_luminosity_pipelines_;
857 mutable Variants<BlendMultiplyPipeline> blend_multiply_pipelines_;
858 mutable Variants<BlendOverlayPipeline> blend_overlay_pipelines_;
859 mutable Variants<BlendSaturationPipeline> blend_saturation_pipelines_;
860 mutable Variants<BlendScreenPipeline> blend_screen_pipelines_;
861 mutable Variants<BlendSoftLightPipeline> blend_softlight_pipelines_;
863 mutable Variants<FramebufferBlendColorPipeline>
864 framebuffer_blend_color_pipelines_;
865 mutable Variants<FramebufferBlendColorBurnPipeline>
866 framebuffer_blend_colorburn_pipelines_;
867 mutable Variants<FramebufferBlendColorDodgePipeline>
868 framebuffer_blend_colordodge_pipelines_;
869 mutable Variants<FramebufferBlendDarkenPipeline>
870 framebuffer_blend_darken_pipelines_;
871 mutable Variants<FramebufferBlendDifferencePipeline>
872 framebuffer_blend_difference_pipelines_;
873 mutable Variants<FramebufferBlendExclusionPipeline>
874 framebuffer_blend_exclusion_pipelines_;
875 mutable Variants<FramebufferBlendHardLightPipeline>
876 framebuffer_blend_hardlight_pipelines_;
877 mutable Variants<FramebufferBlendHuePipeline>
878 framebuffer_blend_hue_pipelines_;
879 mutable Variants<FramebufferBlendLightenPipeline>
880 framebuffer_blend_lighten_pipelines_;
881 mutable Variants<FramebufferBlendLuminosityPipeline>
882 framebuffer_blend_luminosity_pipelines_;
883 mutable Variants<FramebufferBlendMultiplyPipeline>
884 framebuffer_blend_multiply_pipelines_;
885 mutable Variants<FramebufferBlendOverlayPipeline>
886 framebuffer_blend_overlay_pipelines_;
887 mutable Variants<FramebufferBlendSaturationPipeline>
888 framebuffer_blend_saturation_pipelines_;
889 mutable Variants<FramebufferBlendScreenPipeline>
890 framebuffer_blend_screen_pipelines_;
891 mutable Variants<FramebufferBlendSoftLightPipeline>
892 framebuffer_blend_softlight_pipelines_;
893 mutable std::shared_ptr<Pipeline<ComputePipelineDescriptor>>
894 point_field_compute_pipelines_;
895 mutable std::shared_ptr<Pipeline<ComputePipelineDescriptor>>
896 uv_compute_pipelines_;
898 template <
class TypedPipeline>
899 std::shared_ptr<Pipeline<PipelineDescriptor>> GetPipeline(
900 Variants<TypedPipeline>& container,
901 ContentContextOptions opts)
const {
907 opts.wireframe =
true;
910 if (
auto found = container.Get(opts)) {
911 return found->WaitAndGet();
914 auto prototype = container.GetDefault();
917 FML_CHECK(prototype !=
nullptr);
919 auto pipeline = prototype->WaitAndGet();
924 auto variant_future = pipeline->CreateVariant(
925 [&opts, variants_count =
926 container.GetPipelineCount()](PipelineDescriptor& desc) {
927 opts.ApplyToPipelineDescriptor(desc);
929 SPrintF(
"%s V#%zu", desc.GetLabel().c_str(), variants_count));
931 auto variant = std::make_unique<TypedPipeline>(std::move(variant_future));
932 auto variant_pipeline = variant->WaitAndGet();
933 container.Set(opts, std::move(variant));
934 return variant_pipeline;
937 bool is_valid_ =
false;
938 std::shared_ptr<Tessellator> tessellator_;
939 #if IMPELLER_ENABLE_3D
940 std::shared_ptr<scene::SceneContext> scene_context_;
941 #endif // IMPELLER_ENABLE_3D
942 std::shared_ptr<RenderTargetAllocator> render_target_cache_;
943 bool wireframe_ =
false;
952 #endif // FLUTTER_IMPELLER_ENTITY_CONTENTS_CONTENT_CONTEXT_H_