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/logging.h"
14 #include "flutter/fml/status_or.h"
26 #include "impeller/entity/border_mask_blur.frag.h"
27 #include "impeller/entity/clip.frag.h"
28 #include "impeller/entity/clip.vert.h"
29 #include "impeller/entity/color_matrix_color_filter.frag.h"
30 #include "impeller/entity/conical_gradient_fill.frag.h"
31 #include "impeller/entity/fast_gradient.frag.h"
32 #include "impeller/entity/fast_gradient.vert.h"
33 #include "impeller/entity/filter_position.vert.h"
34 #include "impeller/entity/filter_position_uv.vert.h"
35 #include "impeller/entity/gaussian.frag.h"
36 #include "impeller/entity/glyph_atlas.frag.h"
37 #include "impeller/entity/glyph_atlas.vert.h"
38 #include "impeller/entity/gradient_fill.vert.h"
39 #include "impeller/entity/linear_gradient_fill.frag.h"
40 #include "impeller/entity/linear_to_srgb_filter.frag.h"
41 #include "impeller/entity/morphology_filter.frag.h"
42 #include "impeller/entity/porter_duff_blend.frag.h"
43 #include "impeller/entity/porter_duff_blend.vert.h"
44 #include "impeller/entity/radial_gradient_fill.frag.h"
45 #include "impeller/entity/rrect_blur.frag.h"
46 #include "impeller/entity/rrect_blur.vert.h"
47 #include "impeller/entity/solid_fill.frag.h"
48 #include "impeller/entity/solid_fill.vert.h"
49 #include "impeller/entity/srgb_to_linear_filter.frag.h"
50 #include "impeller/entity/sweep_gradient_fill.frag.h"
51 #include "impeller/entity/texture_downsample.frag.h"
52 #include "impeller/entity/texture_fill.frag.h"
53 #include "impeller/entity/texture_fill.vert.h"
54 #include "impeller/entity/texture_fill_strict_src.frag.h"
55 #include "impeller/entity/texture_uv_fill.vert.h"
56 #include "impeller/entity/tiled_texture_fill.frag.h"
57 #include "impeller/entity/yuv_to_rgb_filter.frag.h"
59 #include "impeller/entity/conical_gradient_ssbo_fill.frag.h"
60 #include "impeller/entity/linear_gradient_ssbo_fill.frag.h"
61 #include "impeller/entity/radial_gradient_ssbo_fill.frag.h"
62 #include "impeller/entity/sweep_gradient_ssbo_fill.frag.h"
64 #include "impeller/entity/advanced_blend.frag.h"
65 #include "impeller/entity/advanced_blend.vert.h"
67 #include "impeller/entity/framebuffer_blend.frag.h"
68 #include "impeller/entity/framebuffer_blend.vert.h"
70 #include "impeller/entity/vertices_uber.frag.h"
72 #ifdef IMPELLER_ENABLE_OPENGLES
73 #include "impeller/entity/tiled_texture_fill_external.frag.h"
74 #endif // IMPELLER_ENABLE_OPENGLES
82 LinearGradientFillFragmentShader>;
87 RadialGradientFillFragmentShader>;
90 ConicalGradientFillFragmentShader>;
93 SweepGradientFillFragmentShader>;
96 LinearGradientSsboFillFragmentShader>;
99 ConicalGradientSsboFillFragmentShader>;
102 RadialGradientSsboFillFragmentShader>;
105 SweepGradientSsboFillFragmentShader>;
112 TextureDownsampleFragmentShader>;
115 TextureFillStrictSrcFragmentShader>;
118 TiledTextureFillFragmentShader>;
123 BorderMaskBlurFragmentShader>;
126 MorphologyFilterFragmentShader>;
129 ColorMatrixColorFilterFragmentShader>;
132 LinearToSrgbFilterFragmentShader>;
135 SrgbToLinearFilterFragmentShader>;
138 YuvToRgbFilterFragmentShader>;
145 PorterDuffBlendFragmentShader>;
150 AdvancedBlendFragmentShader>;
153 AdvancedBlendFragmentShader>;
156 AdvancedBlendFragmentShader>;
158 AdvancedBlendFragmentShader>;
161 AdvancedBlendFragmentShader>;
164 AdvancedBlendFragmentShader>;
167 AdvancedBlendFragmentShader>;
169 AdvancedBlendFragmentShader>;
171 AdvancedBlendFragmentShader>;
174 AdvancedBlendFragmentShader>;
176 AdvancedBlendFragmentShader>;
178 AdvancedBlendFragmentShader>;
181 AdvancedBlendFragmentShader>;
183 AdvancedBlendFragmentShader>;
186 AdvancedBlendFragmentShader>;
190 FramebufferBlendFragmentShader>;
193 FramebufferBlendFragmentShader>;
196 FramebufferBlendFragmentShader>;
199 FramebufferBlendFragmentShader>;
202 FramebufferBlendFragmentShader>;
205 FramebufferBlendFragmentShader>;
208 FramebufferBlendFragmentShader>;
211 FramebufferBlendFragmentShader>;
214 FramebufferBlendFragmentShader>;
217 FramebufferBlendFragmentShader>;
220 FramebufferBlendFragmentShader>;
223 FramebufferBlendFragmentShader>;
226 FramebufferBlendFragmentShader>;
229 FramebufferBlendFragmentShader>;
232 FramebufferBlendFragmentShader>;
236 VerticesUberFragmentShader>;
238 #ifdef IMPELLER_ENABLE_OPENGLES
239 using TiledTextureExternalPipeline =
241 TiledTextureFillExternalFragmentShader>;
242 #endif // IMPELLER_ENABLE_OPENGLES
364 class RenderTargetCache;
369 std::shared_ptr<Context> context,
370 std::shared_ptr<TypographerContext> typographer_context,
371 std::shared_ptr<RenderTargetAllocator> render_target_allocator =
nullptr);
381 return GetPipeline(fast_gradient_pipelines_, opts);
386 return GetPipeline(linear_gradient_fill_pipelines_, opts);
389 std::shared_ptr<Pipeline<PipelineDescriptor>>
392 return GetPipeline(linear_gradient_ssbo_fill_pipelines_, opts);
395 std::shared_ptr<Pipeline<PipelineDescriptor>>
398 return GetPipeline(radial_gradient_ssbo_fill_pipelines_, opts);
401 std::shared_ptr<Pipeline<PipelineDescriptor>>
404 return GetPipeline(conical_gradient_ssbo_fill_pipelines_, opts);
407 std::shared_ptr<Pipeline<PipelineDescriptor>>
410 return GetPipeline(sweep_gradient_ssbo_fill_pipelines_, opts);
415 return GetPipeline(radial_gradient_fill_pipelines_, opts);
420 return GetPipeline(conical_gradient_fill_pipelines_, opts);
425 return GetPipeline(rrect_blur_pipelines_, opts);
430 return GetPipeline(sweep_gradient_fill_pipelines_, opts);
435 return GetPipeline(solid_fill_pipelines_, opts);
440 return GetPipeline(texture_pipelines_, opts);
445 return GetPipeline(texture_strict_src_pipelines_, opts);
448 #ifdef IMPELLER_ENABLE_OPENGLES
449 std::shared_ptr<Pipeline<PipelineDescriptor>> GetTiledTextureExternalPipeline(
453 return GetPipeline(tiled_texture_external_pipelines_, opts);
455 #endif // IMPELLER_ENABLE_OPENGLES
459 return GetPipeline(tiled_texture_pipelines_, opts);
464 return GetPipeline(gaussian_blur_pipelines_, opts);
469 return GetPipeline(border_mask_blur_pipelines_, opts);
474 return GetPipeline(morphology_filter_pipelines_, opts);
477 std::shared_ptr<Pipeline<PipelineDescriptor>>
479 return GetPipeline(color_matrix_color_filter_pipelines_, opts);
484 return GetPipeline(linear_to_srgb_filter_pipelines_, opts);
489 return GetPipeline(srgb_to_linear_filter_pipelines_, opts);
494 return GetPipeline(clip_pipelines_, opts);
499 return GetPipeline(glyph_atlas_pipelines_, opts);
504 return GetPipeline(yuv_to_rgb_filter_pipelines_, opts);
509 return GetPipeline(porter_duff_blend_pipelines_, opts);
516 return GetPipeline(blend_color_pipelines_, opts);
521 return GetPipeline(blend_colorburn_pipelines_, opts);
526 return GetPipeline(blend_colordodge_pipelines_, opts);
531 return GetPipeline(blend_darken_pipelines_, opts);
536 return GetPipeline(blend_difference_pipelines_, opts);
541 return GetPipeline(blend_exclusion_pipelines_, opts);
546 return GetPipeline(blend_hardlight_pipelines_, opts);
551 return GetPipeline(blend_hue_pipelines_, opts);
556 return GetPipeline(blend_lighten_pipelines_, opts);
561 return GetPipeline(blend_luminosity_pipelines_, opts);
566 return GetPipeline(blend_multiply_pipelines_, opts);
571 return GetPipeline(blend_overlay_pipelines_, opts);
576 return GetPipeline(blend_saturation_pipelines_, opts);
581 return GetPipeline(blend_screen_pipelines_, opts);
586 return GetPipeline(blend_softlight_pipelines_, opts);
591 return GetPipeline(texture_downsample_pipelines_, opts);
595 std::shared_ptr<Pipeline<PipelineDescriptor>>
598 return GetPipeline(framebuffer_blend_color_pipelines_, opts);
601 std::shared_ptr<Pipeline<PipelineDescriptor>>
604 return GetPipeline(framebuffer_blend_colorburn_pipelines_, opts);
607 std::shared_ptr<Pipeline<PipelineDescriptor>>
610 return GetPipeline(framebuffer_blend_colordodge_pipelines_, opts);
613 std::shared_ptr<Pipeline<PipelineDescriptor>>
616 return GetPipeline(framebuffer_blend_darken_pipelines_, opts);
619 std::shared_ptr<Pipeline<PipelineDescriptor>>
622 return GetPipeline(framebuffer_blend_difference_pipelines_, opts);
625 std::shared_ptr<Pipeline<PipelineDescriptor>>
628 return GetPipeline(framebuffer_blend_exclusion_pipelines_, opts);
631 std::shared_ptr<Pipeline<PipelineDescriptor>>
634 return GetPipeline(framebuffer_blend_hardlight_pipelines_, opts);
640 return GetPipeline(framebuffer_blend_hue_pipelines_, opts);
643 std::shared_ptr<Pipeline<PipelineDescriptor>>
646 return GetPipeline(framebuffer_blend_lighten_pipelines_, opts);
649 std::shared_ptr<Pipeline<PipelineDescriptor>>
652 return GetPipeline(framebuffer_blend_luminosity_pipelines_, opts);
655 std::shared_ptr<Pipeline<PipelineDescriptor>>
658 return GetPipeline(framebuffer_blend_multiply_pipelines_, opts);
661 std::shared_ptr<Pipeline<PipelineDescriptor>>
664 return GetPipeline(framebuffer_blend_overlay_pipelines_, opts);
667 std::shared_ptr<Pipeline<PipelineDescriptor>>
670 return GetPipeline(framebuffer_blend_saturation_pipelines_, opts);
673 std::shared_ptr<Pipeline<PipelineDescriptor>>
676 return GetPipeline(framebuffer_blend_screen_pipelines_, opts);
679 std::shared_ptr<Pipeline<PipelineDescriptor>>
682 return GetPipeline(framebuffer_blend_softlight_pipelines_, opts);
687 return GetPipeline(vertices_uber_shader_, opts);
706 std::string_view label,
708 const std::shared_ptr<CommandBuffer>& command_buffer,
710 bool msaa_enabled =
true,
711 bool depth_stencil_enabled =
false,
712 int32_t mip_count = 1)
const;
716 std::string_view label,
718 const std::shared_ptr<CommandBuffer>& command_buffer,
722 return lazy_glyph_atlas_;
726 return render_target_cache_;
739 const std::string& unique_entrypoint_name,
742 create_callback)
const;
747 const std::string& unique_entrypoint_name)
const;
756 std::shared_ptr<Context> context_;
757 std::shared_ptr<LazyGlyphAtlas> lazy_glyph_atlas_;
765 void InitializeCommonlyUsedShadersIfNeeded()
const;
767 struct RuntimeEffectPipelineKey {
768 std::string unique_entrypoint_name;
772 std::size_t
operator()(
const RuntimeEffectPipelineKey& key)
const {
773 return fml::HashCombine(key.unique_entrypoint_name,
779 constexpr
bool operator()(
const RuntimeEffectPipelineKey& lhs,
780 const RuntimeEffectPipelineKey& rhs)
const {
781 return lhs.unique_entrypoint_name == rhs.unique_entrypoint_name &&
787 mutable std::unordered_map<RuntimeEffectPipelineKey,
788 std::shared_ptr<Pipeline<PipelineDescriptor>>,
789 RuntimeEffectPipelineKey::Hash,
790 RuntimeEffectPipelineKey::Equal>
791 runtime_effect_pipelines_;
806 template <
class PipelineHandleT>
809 Variants() =
default;
812 std::unique_ptr<PipelineHandleT> pipeline) {
813 pipelines_[options] = std::move(pipeline);
816 void SetDefault(
const ContentContextOptions& options,
817 std::unique_ptr<PipelineHandleT> pipeline) {
818 default_options_ = options;
819 Set(options, std::move(pipeline));
822 void CreateDefault(
const Context& context,
823 const ContentContextOptions& options,
824 const std::initializer_list<Scalar>& constants = {}) {
825 auto desc = PipelineHandleT::Builder::MakeDefaultPipelineDescriptor(
827 if (!desc.has_value()) {
831 options.ApplyToPipelineDescriptor(*desc);
832 SetDefault(options, std::make_unique<PipelineHandleT>(context, desc));
835 PipelineHandleT* Get(
const ContentContextOptions& options)
const {
836 if (
auto found = pipelines_.find(options); found != pipelines_.end()) {
837 return found->second.get();
842 PipelineHandleT* GetDefault()
const {
843 if (!default_options_.has_value()) {
846 return Get(default_options_.value());
849 size_t GetPipelineCount()
const {
return pipelines_.size(); }
852 std::optional<ContentContextOptions> default_options_;
853 std::unordered_map<ContentContextOptions,
854 std::unique_ptr<PipelineHandleT>,
855 ContentContextOptions::Hash,
856 ContentContextOptions::Equal>
859 Variants(
const Variants&) =
delete;
861 Variants& operator=(
const Variants&) =
delete;
868 mutable Variants<SolidFillPipeline> solid_fill_pipelines_;
869 mutable Variants<FastGradientPipeline> fast_gradient_pipelines_;
870 mutable Variants<LinearGradientFillPipeline> linear_gradient_fill_pipelines_;
871 mutable Variants<RadialGradientFillPipeline> radial_gradient_fill_pipelines_;
872 mutable Variants<ConicalGradientFillPipeline>
873 conical_gradient_fill_pipelines_;
874 mutable Variants<SweepGradientFillPipeline> sweep_gradient_fill_pipelines_;
875 mutable Variants<LinearGradientSSBOFillPipeline>
876 linear_gradient_ssbo_fill_pipelines_;
877 mutable Variants<RadialGradientSSBOFillPipeline>
878 radial_gradient_ssbo_fill_pipelines_;
879 mutable Variants<ConicalGradientSSBOFillPipeline>
880 conical_gradient_ssbo_fill_pipelines_;
881 mutable Variants<SweepGradientSSBOFillPipeline>
882 sweep_gradient_ssbo_fill_pipelines_;
883 mutable Variants<RRectBlurPipeline> rrect_blur_pipelines_;
884 mutable Variants<TexturePipeline> texture_pipelines_;
885 mutable Variants<TextureDownsamplePipeline> texture_downsample_pipelines_;
886 mutable Variants<TextureStrictSrcPipeline> texture_strict_src_pipelines_;
887 #ifdef IMPELLER_ENABLE_OPENGLES
888 mutable Variants<TiledTextureExternalPipeline>
889 tiled_texture_external_pipelines_;
890 #endif // IMPELLER_ENABLE_OPENGLES
891 mutable Variants<TiledTexturePipeline> tiled_texture_pipelines_;
892 mutable Variants<GaussianBlurPipeline> gaussian_blur_pipelines_;
893 mutable Variants<BorderMaskBlurPipeline> border_mask_blur_pipelines_;
894 mutable Variants<MorphologyFilterPipeline> morphology_filter_pipelines_;
895 mutable Variants<ColorMatrixColorFilterPipeline>
896 color_matrix_color_filter_pipelines_;
897 mutable Variants<LinearToSrgbFilterPipeline> linear_to_srgb_filter_pipelines_;
898 mutable Variants<SrgbToLinearFilterPipeline> srgb_to_linear_filter_pipelines_;
899 mutable Variants<ClipPipeline> clip_pipelines_;
900 mutable Variants<GlyphAtlasPipeline> glyph_atlas_pipelines_;
901 mutable Variants<YUVToRGBFilterPipeline> yuv_to_rgb_filter_pipelines_;
902 mutable Variants<PorterDuffBlendPipeline> porter_duff_blend_pipelines_;
904 mutable Variants<BlendColorPipeline> blend_color_pipelines_;
905 mutable Variants<BlendColorBurnPipeline> blend_colorburn_pipelines_;
906 mutable Variants<BlendColorDodgePipeline> blend_colordodge_pipelines_;
907 mutable Variants<BlendDarkenPipeline> blend_darken_pipelines_;
908 mutable Variants<BlendDifferencePipeline> blend_difference_pipelines_;
909 mutable Variants<BlendExclusionPipeline> blend_exclusion_pipelines_;
910 mutable Variants<BlendHardLightPipeline> blend_hardlight_pipelines_;
911 mutable Variants<BlendHuePipeline> blend_hue_pipelines_;
912 mutable Variants<BlendLightenPipeline> blend_lighten_pipelines_;
913 mutable Variants<BlendLuminosityPipeline> blend_luminosity_pipelines_;
914 mutable Variants<BlendMultiplyPipeline> blend_multiply_pipelines_;
915 mutable Variants<BlendOverlayPipeline> blend_overlay_pipelines_;
916 mutable Variants<BlendSaturationPipeline> blend_saturation_pipelines_;
917 mutable Variants<BlendScreenPipeline> blend_screen_pipelines_;
918 mutable Variants<BlendSoftLightPipeline> blend_softlight_pipelines_;
920 mutable Variants<FramebufferBlendColorPipeline>
921 framebuffer_blend_color_pipelines_;
922 mutable Variants<FramebufferBlendColorBurnPipeline>
923 framebuffer_blend_colorburn_pipelines_;
924 mutable Variants<FramebufferBlendColorDodgePipeline>
925 framebuffer_blend_colordodge_pipelines_;
926 mutable Variants<FramebufferBlendDarkenPipeline>
927 framebuffer_blend_darken_pipelines_;
928 mutable Variants<FramebufferBlendDifferencePipeline>
929 framebuffer_blend_difference_pipelines_;
930 mutable Variants<FramebufferBlendExclusionPipeline>
931 framebuffer_blend_exclusion_pipelines_;
932 mutable Variants<FramebufferBlendHardLightPipeline>
933 framebuffer_blend_hardlight_pipelines_;
934 mutable Variants<FramebufferBlendHuePipeline>
935 framebuffer_blend_hue_pipelines_;
936 mutable Variants<FramebufferBlendLightenPipeline>
937 framebuffer_blend_lighten_pipelines_;
938 mutable Variants<FramebufferBlendLuminosityPipeline>
939 framebuffer_blend_luminosity_pipelines_;
940 mutable Variants<FramebufferBlendMultiplyPipeline>
941 framebuffer_blend_multiply_pipelines_;
942 mutable Variants<FramebufferBlendOverlayPipeline>
943 framebuffer_blend_overlay_pipelines_;
944 mutable Variants<FramebufferBlendSaturationPipeline>
945 framebuffer_blend_saturation_pipelines_;
946 mutable Variants<FramebufferBlendScreenPipeline>
947 framebuffer_blend_screen_pipelines_;
948 mutable Variants<FramebufferBlendSoftLightPipeline>
949 framebuffer_blend_softlight_pipelines_;
950 mutable Variants<VerticesUberShader> vertices_uber_shader_;
952 template <
class TypedPipeline>
953 std::shared_ptr<Pipeline<PipelineDescriptor>> GetPipeline(
954 Variants<TypedPipeline>& container,
955 ContentContextOptions opts)
const {
956 TypedPipeline* pipeline = CreateIfNeeded(container, opts);
960 return pipeline->WaitAndGet();
963 template <
class RenderPipelineHandleT>
964 RenderPipelineHandleT* CreateIfNeeded(
965 Variants<RenderPipelineHandleT>& container,
966 ContentContextOptions opts)
const {
972 opts.wireframe =
true;
975 if (RenderPipelineHandleT* found = container.Get(opts)) {
979 RenderPipelineHandleT* default_handle = container.GetDefault();
982 FML_CHECK(default_handle !=
nullptr);
984 std::shared_ptr<Pipeline<PipelineDescriptor>> pipeline =
985 default_handle->WaitAndGet();
990 auto variant_future = pipeline->CreateVariant(
991 false, [&opts, variants_count = container.GetPipelineCount()](
992 PipelineDescriptor& desc) {
993 opts.ApplyToPipelineDescriptor(desc);
995 SPrintF(
"%s V#%zu", desc.GetLabel().c_str(), variants_count));
997 std::unique_ptr<RenderPipelineHandleT> variant =
998 std::make_unique<RenderPipelineHandleT>(std::move(variant_future));
999 container.Set(opts, std::move(variant));
1000 return container.Get(opts);
1003 bool is_valid_ =
false;
1004 std::shared_ptr<Tessellator> tessellator_;
1005 std::shared_ptr<RenderTargetAllocator> render_target_cache_;
1006 std::shared_ptr<HostBuffer> host_buffer_;
1007 std::shared_ptr<Texture> empty_texture_;
1008 bool wireframe_ =
false;
1017 #endif // FLUTTER_IMPELLER_ENTITY_CONTENTS_CONTENT_CONTEXT_H_