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"
28 #include "impeller/entity/checkerboard.frag.h"
29 #include "impeller/entity/checkerboard.vert.h"
30 #endif // IMPELLER_DEBUG
32 #include "impeller/entity/blend.frag.h"
33 #include "impeller/entity/blend.vert.h"
34 #include "impeller/entity/border_mask_blur.frag.h"
35 #include "impeller/entity/border_mask_blur.vert.h"
36 #include "impeller/entity/clip.frag.h"
37 #include "impeller/entity/clip.vert.h"
38 #include "impeller/entity/color_matrix_color_filter.frag.h"
39 #include "impeller/entity/color_matrix_color_filter.vert.h"
40 #include "impeller/entity/conical_gradient_fill.frag.h"
41 #include "impeller/entity/glyph_atlas.frag.h"
42 #include "impeller/entity/glyph_atlas.vert.h"
43 #include "impeller/entity/glyph_atlas_color.frag.h"
44 #include "impeller/entity/gradient_fill.vert.h"
45 #include "impeller/entity/linear_gradient_fill.frag.h"
46 #include "impeller/entity/linear_to_srgb_filter.frag.h"
47 #include "impeller/entity/linear_to_srgb_filter.vert.h"
48 #include "impeller/entity/morphology_filter.frag.h"
49 #include "impeller/entity/morphology_filter.vert.h"
50 #include "impeller/entity/points.comp.h"
51 #include "impeller/entity/porter_duff_blend.frag.h"
52 #include "impeller/entity/porter_duff_blend.vert.h"
53 #include "impeller/entity/radial_gradient_fill.frag.h"
54 #include "impeller/entity/rrect_blur.frag.h"
55 #include "impeller/entity/rrect_blur.vert.h"
56 #include "impeller/entity/solid_fill.frag.h"
57 #include "impeller/entity/solid_fill.vert.h"
58 #include "impeller/entity/srgb_to_linear_filter.frag.h"
59 #include "impeller/entity/srgb_to_linear_filter.vert.h"
60 #include "impeller/entity/sweep_gradient_fill.frag.h"
61 #include "impeller/entity/texture_fill.frag.h"
62 #include "impeller/entity/texture_fill.vert.h"
63 #include "impeller/entity/texture_fill_strict_src.frag.h"
64 #include "impeller/entity/tiled_texture_fill.frag.h"
65 #include "impeller/entity/uv.comp.h"
66 #include "impeller/entity/vertices.frag.h"
67 #include "impeller/entity/yuv_to_rgb_filter.frag.h"
68 #include "impeller/entity/yuv_to_rgb_filter.vert.h"
70 #include "impeller/entity/gaussian_blur.vert.h"
71 #include "impeller/entity/gaussian_blur_noalpha_decal.frag.h"
72 #include "impeller/entity/gaussian_blur_noalpha_nodecal.frag.h"
73 #include "impeller/entity/kernel_decal.frag.h"
74 #include "impeller/entity/kernel_nodecal.frag.h"
76 #include "impeller/entity/position_color.vert.h"
80 #include "impeller/entity/conical_gradient_ssbo_fill.frag.h"
81 #include "impeller/entity/linear_gradient_ssbo_fill.frag.h"
82 #include "impeller/entity/radial_gradient_ssbo_fill.frag.h"
83 #include "impeller/entity/sweep_gradient_ssbo_fill.frag.h"
85 #include "impeller/entity/advanced_blend.frag.h"
86 #include "impeller/entity/advanced_blend.vert.h"
88 #include "impeller/entity/framebuffer_blend.frag.h"
89 #include "impeller/entity/framebuffer_blend.vert.h"
91 #ifdef IMPELLER_ENABLE_OPENGLES
92 #include "impeller/entity/texture_fill_external.frag.h"
93 #include "impeller/entity/tiled_texture_fill_external.frag.h"
94 #endif // IMPELLER_ENABLE_OPENGLES
96 #if IMPELLER_ENABLE_3D
102 #ifdef IMPELLER_DEBUG
103 using CheckerboardPipeline =
104 RenderPipelineT<CheckerboardVertexShader, CheckerboardFragmentShader>;
105 #endif // IMPELLER_DEBUG
115 ConicalGradientFillFragmentShader>;
120 LinearGradientSsboFillFragmentShader>;
123 ConicalGradientSsboFillFragmentShader>;
126 RadialGradientSsboFillFragmentShader>;
129 SweepGradientSsboFillFragmentShader>;
137 TextureFillStrictSrcFragmentShader>;
144 GaussianBlurNoalphaDecalFragmentShader>;
147 GaussianBlurNoalphaNodecalFragmentShader>;
156 MorphologyFilterFragmentShader>;
159 ColorMatrixColorFilterFragmentShader>;
162 LinearToSrgbFilterFragmentShader>;
165 SrgbToLinearFilterFragmentShader>;
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>;
254 FramebufferBlendFragmentShader>;
257 FramebufferBlendFragmentShader>;
263 #ifdef IMPELLER_ENABLE_OPENGLES
264 using TextureExternalPipeline =
267 using TiledTextureExternalPipeline =
269 TiledTextureFillExternalFragmentShader>;
270 #endif // IMPELLER_ENABLE_OPENGLES
390 class RenderTargetCache;
395 std::shared_ptr<Context> context,
396 std::shared_ptr<TypographerContext> typographer_context,
397 std::shared_ptr<RenderTargetAllocator> render_target_allocator =
nullptr);
413 #if IMPELLER_ENABLE_3D
414 std::shared_ptr<scene::SceneContext> GetSceneContext()
const;
415 #endif // IMPELLER_ENABLE_3D
419 #ifdef IMPELLER_DEBUG
420 std::shared_ptr<Pipeline<PipelineDescriptor>> GetCheckerboardPipeline(
422 return GetPipeline(checkerboard_pipelines_, opts);
424 #endif // IMPELLER_DEBUG
428 return GetPipeline(linear_gradient_fill_pipelines_, opts);
431 std::shared_ptr<Pipeline<PipelineDescriptor>>
434 return GetPipeline(linear_gradient_ssbo_fill_pipelines_, opts);
437 std::shared_ptr<Pipeline<PipelineDescriptor>>
440 return GetPipeline(radial_gradient_ssbo_fill_pipelines_, opts);
443 std::shared_ptr<Pipeline<PipelineDescriptor>>
446 return GetPipeline(conical_gradient_ssbo_fill_pipelines_, opts);
449 std::shared_ptr<Pipeline<PipelineDescriptor>>
452 return GetPipeline(sweep_gradient_ssbo_fill_pipelines_, opts);
457 return GetPipeline(radial_gradient_fill_pipelines_, opts);
462 return GetPipeline(conical_gradient_fill_pipelines_, opts);
467 return GetPipeline(rrect_blur_pipelines_, opts);
472 return GetPipeline(sweep_gradient_fill_pipelines_, opts);
477 return GetPipeline(solid_fill_pipelines_, opts);
482 return GetPipeline(texture_blend_pipelines_, opts);
487 return GetPipeline(texture_pipelines_, opts);
492 return GetPipeline(texture_strict_src_pipelines_, opts);
495 #ifdef IMPELLER_ENABLE_OPENGLES
496 std::shared_ptr<Pipeline<PipelineDescriptor>> GetTextureExternalPipeline(
500 return GetPipeline(texture_external_pipelines_, opts);
503 std::shared_ptr<Pipeline<PipelineDescriptor>> GetTiledTextureExternalPipeline(
504 ContentContextOptions opts)
const {
507 return GetPipeline(tiled_texture_external_pipelines_, opts);
509 #endif // IMPELLER_ENABLE_OPENGLES
513 return GetPipeline(position_uv_pipelines_, opts);
518 return GetPipeline(tiled_texture_pipelines_, opts);
523 return GetPipeline(gaussian_blur_noalpha_decal_pipelines_, opts);
528 return GetPipeline(gaussian_blur_noalpha_nodecal_pipelines_, opts);
533 return GetPipeline(kernel_decal_pipelines_, opts);
538 return GetPipeline(kernel_nodecal_pipelines_, opts);
543 return GetPipeline(border_mask_blur_pipelines_, opts);
548 return GetPipeline(morphology_filter_pipelines_, opts);
551 std::shared_ptr<Pipeline<PipelineDescriptor>>
553 return GetPipeline(color_matrix_color_filter_pipelines_, opts);
558 return GetPipeline(linear_to_srgb_filter_pipelines_, opts);
563 return GetPipeline(srgb_to_linear_filter_pipelines_, opts);
568 return GetPipeline(clip_pipelines_, opts);
573 return GetPipeline(glyph_atlas_pipelines_, opts);
578 return GetPipeline(glyph_atlas_color_pipelines_, opts);
583 return GetPipeline(geometry_color_pipelines_, opts);
588 return GetPipeline(yuv_to_rgb_filter_pipelines_, opts);
593 return GetPipeline(porter_duff_blend_pipelines_, opts);
600 return GetPipeline(blend_color_pipelines_, opts);
605 return GetPipeline(blend_colorburn_pipelines_, opts);
610 return GetPipeline(blend_colordodge_pipelines_, opts);
615 return GetPipeline(blend_darken_pipelines_, opts);
620 return GetPipeline(blend_difference_pipelines_, opts);
625 return GetPipeline(blend_exclusion_pipelines_, opts);
630 return GetPipeline(blend_hardlight_pipelines_, opts);
635 return GetPipeline(blend_hue_pipelines_, opts);
640 return GetPipeline(blend_lighten_pipelines_, opts);
645 return GetPipeline(blend_luminosity_pipelines_, opts);
650 return GetPipeline(blend_multiply_pipelines_, opts);
655 return GetPipeline(blend_overlay_pipelines_, opts);
660 return GetPipeline(blend_saturation_pipelines_, opts);
665 return GetPipeline(blend_screen_pipelines_, opts);
670 return GetPipeline(blend_softlight_pipelines_, opts);
674 std::shared_ptr<Pipeline<PipelineDescriptor>>
677 return GetPipeline(framebuffer_blend_color_pipelines_, opts);
680 std::shared_ptr<Pipeline<PipelineDescriptor>>
683 return GetPipeline(framebuffer_blend_colorburn_pipelines_, opts);
686 std::shared_ptr<Pipeline<PipelineDescriptor>>
689 return GetPipeline(framebuffer_blend_colordodge_pipelines_, opts);
692 std::shared_ptr<Pipeline<PipelineDescriptor>>
695 return GetPipeline(framebuffer_blend_darken_pipelines_, opts);
698 std::shared_ptr<Pipeline<PipelineDescriptor>>
701 return GetPipeline(framebuffer_blend_difference_pipelines_, opts);
704 std::shared_ptr<Pipeline<PipelineDescriptor>>
707 return GetPipeline(framebuffer_blend_exclusion_pipelines_, opts);
710 std::shared_ptr<Pipeline<PipelineDescriptor>>
713 return GetPipeline(framebuffer_blend_hardlight_pipelines_, opts);
719 return GetPipeline(framebuffer_blend_hue_pipelines_, opts);
722 std::shared_ptr<Pipeline<PipelineDescriptor>>
725 return GetPipeline(framebuffer_blend_lighten_pipelines_, opts);
728 std::shared_ptr<Pipeline<PipelineDescriptor>>
731 return GetPipeline(framebuffer_blend_luminosity_pipelines_, opts);
734 std::shared_ptr<Pipeline<PipelineDescriptor>>
737 return GetPipeline(framebuffer_blend_multiply_pipelines_, opts);
740 std::shared_ptr<Pipeline<PipelineDescriptor>>
743 return GetPipeline(framebuffer_blend_overlay_pipelines_, opts);
746 std::shared_ptr<Pipeline<PipelineDescriptor>>
749 return GetPipeline(framebuffer_blend_saturation_pipelines_, opts);
752 std::shared_ptr<Pipeline<PipelineDescriptor>>
755 return GetPipeline(framebuffer_blend_screen_pipelines_, opts);
758 std::shared_ptr<Pipeline<PipelineDescriptor>>
761 return GetPipeline(framebuffer_blend_softlight_pipelines_, opts);
767 return point_field_compute_pipelines_;
773 return uv_compute_pipelines_;
788 const std::string& label,
791 bool msaa_enabled =
true,
792 bool depth_stencil_enabled =
false,
793 int32_t mip_count = 1)
const;
797 const std::string& label,
802 return lazy_glyph_atlas_;
806 return render_target_cache_;
819 const std::string& unique_entrypoint_name,
822 create_callback)
const;
827 const std::string& unique_entrypoint_name)
const;
836 std::shared_ptr<Context> context_;
837 std::shared_ptr<LazyGlyphAtlas> lazy_glyph_atlas_;
845 void InitializeCommonlyUsedShadersIfNeeded()
const;
847 struct RuntimeEffectPipelineKey {
848 std::string unique_entrypoint_name;
852 std::size_t
operator()(
const RuntimeEffectPipelineKey& key)
const {
853 return fml::HashCombine(key.unique_entrypoint_name,
859 constexpr
bool operator()(
const RuntimeEffectPipelineKey& lhs,
860 const RuntimeEffectPipelineKey& rhs)
const {
861 return lhs.unique_entrypoint_name == rhs.unique_entrypoint_name &&
867 mutable std::unordered_map<RuntimeEffectPipelineKey,
868 std::shared_ptr<Pipeline<PipelineDescriptor>>,
869 RuntimeEffectPipelineKey::Hash,
870 RuntimeEffectPipelineKey::Equal>
871 runtime_effect_pipelines_;
873 template <
class PipelineT>
876 Variants() =
default;
879 std::unique_ptr<PipelineT> pipeline) {
880 pipelines_[options] = std::move(pipeline);
883 void SetDefault(
const ContentContextOptions& options,
884 std::unique_ptr<PipelineT> pipeline) {
885 default_options_ = options;
886 Set(options, std::move(pipeline));
889 void CreateDefault(
const Context& context,
890 const ContentContextOptions& options,
891 const std::initializer_list<Scalar>& constants = {}) {
893 PipelineT::Builder::MakeDefaultPipelineDescriptor(context, constants);
894 if (!desc.has_value()) {
898 options.ApplyToPipelineDescriptor(*desc);
899 SetDefault(options, std::make_unique<PipelineT>(context, desc));
902 PipelineT* Get(
const ContentContextOptions& options)
const {
903 if (
auto found = pipelines_.find(options); found != pipelines_.end()) {
904 return found->second.get();
909 PipelineT* GetDefault()
const {
910 if (!default_options_.has_value()) {
913 return Get(default_options_.value());
916 size_t GetPipelineCount()
const {
return pipelines_.size(); }
919 std::optional<ContentContextOptions> default_options_;
920 std::unordered_map<ContentContextOptions,
921 std::unique_ptr<PipelineT>,
922 ContentContextOptions::Hash,
923 ContentContextOptions::Equal>
926 Variants(
const Variants&) =
delete;
928 Variants& operator=(
const Variants&) =
delete;
935 #ifdef IMPELLER_DEBUG
936 mutable Variants<CheckerboardPipeline> checkerboard_pipelines_;
937 #endif // IMPELLER_DEBUG
939 mutable Variants<SolidFillPipeline> solid_fill_pipelines_;
940 mutable Variants<LinearGradientFillPipeline> linear_gradient_fill_pipelines_;
941 mutable Variants<RadialGradientFillPipeline> radial_gradient_fill_pipelines_;
942 mutable Variants<ConicalGradientFillPipeline>
943 conical_gradient_fill_pipelines_;
944 mutable Variants<SweepGradientFillPipeline> sweep_gradient_fill_pipelines_;
945 mutable Variants<LinearGradientSSBOFillPipeline>
946 linear_gradient_ssbo_fill_pipelines_;
947 mutable Variants<RadialGradientSSBOFillPipeline>
948 radial_gradient_ssbo_fill_pipelines_;
949 mutable Variants<ConicalGradientSSBOFillPipeline>
950 conical_gradient_ssbo_fill_pipelines_;
951 mutable Variants<SweepGradientSSBOFillPipeline>
952 sweep_gradient_ssbo_fill_pipelines_;
953 mutable Variants<RRectBlurPipeline> rrect_blur_pipelines_;
954 mutable Variants<BlendPipeline> texture_blend_pipelines_;
955 mutable Variants<TexturePipeline> texture_pipelines_;
956 mutable Variants<TextureStrictSrcPipeline> texture_strict_src_pipelines_;
957 #ifdef IMPELLER_ENABLE_OPENGLES
958 mutable Variants<TextureExternalPipeline> texture_external_pipelines_;
959 mutable Variants<TiledTextureExternalPipeline>
960 tiled_texture_external_pipelines_;
961 #endif // IMPELLER_ENABLE_OPENGLES
962 mutable Variants<PositionUVPipeline> position_uv_pipelines_;
963 mutable Variants<TiledTexturePipeline> tiled_texture_pipelines_;
964 mutable Variants<GaussianBlurDecalPipeline>
965 gaussian_blur_noalpha_decal_pipelines_;
966 mutable Variants<GaussianBlurPipeline>
967 gaussian_blur_noalpha_nodecal_pipelines_;
968 mutable Variants<KernelDecalPipeline> kernel_decal_pipelines_;
969 mutable Variants<KernelPipeline> kernel_nodecal_pipelines_;
970 mutable Variants<BorderMaskBlurPipeline> border_mask_blur_pipelines_;
971 mutable Variants<MorphologyFilterPipeline> morphology_filter_pipelines_;
972 mutable Variants<ColorMatrixColorFilterPipeline>
973 color_matrix_color_filter_pipelines_;
974 mutable Variants<LinearToSrgbFilterPipeline> linear_to_srgb_filter_pipelines_;
975 mutable Variants<SrgbToLinearFilterPipeline> srgb_to_linear_filter_pipelines_;
976 mutable Variants<ClipPipeline> clip_pipelines_;
977 mutable Variants<GlyphAtlasPipeline> glyph_atlas_pipelines_;
978 mutable Variants<GlyphAtlasColorPipeline> glyph_atlas_color_pipelines_;
979 mutable Variants<GeometryColorPipeline> geometry_color_pipelines_;
980 mutable Variants<YUVToRGBFilterPipeline> yuv_to_rgb_filter_pipelines_;
981 mutable Variants<PorterDuffBlendPipeline> porter_duff_blend_pipelines_;
983 mutable Variants<BlendColorPipeline> blend_color_pipelines_;
984 mutable Variants<BlendColorBurnPipeline> blend_colorburn_pipelines_;
985 mutable Variants<BlendColorDodgePipeline> blend_colordodge_pipelines_;
986 mutable Variants<BlendDarkenPipeline> blend_darken_pipelines_;
987 mutable Variants<BlendDifferencePipeline> blend_difference_pipelines_;
988 mutable Variants<BlendExclusionPipeline> blend_exclusion_pipelines_;
989 mutable Variants<BlendHardLightPipeline> blend_hardlight_pipelines_;
990 mutable Variants<BlendHuePipeline> blend_hue_pipelines_;
991 mutable Variants<BlendLightenPipeline> blend_lighten_pipelines_;
992 mutable Variants<BlendLuminosityPipeline> blend_luminosity_pipelines_;
993 mutable Variants<BlendMultiplyPipeline> blend_multiply_pipelines_;
994 mutable Variants<BlendOverlayPipeline> blend_overlay_pipelines_;
995 mutable Variants<BlendSaturationPipeline> blend_saturation_pipelines_;
996 mutable Variants<BlendScreenPipeline> blend_screen_pipelines_;
997 mutable Variants<BlendSoftLightPipeline> blend_softlight_pipelines_;
999 mutable Variants<FramebufferBlendColorPipeline>
1000 framebuffer_blend_color_pipelines_;
1001 mutable Variants<FramebufferBlendColorBurnPipeline>
1002 framebuffer_blend_colorburn_pipelines_;
1003 mutable Variants<FramebufferBlendColorDodgePipeline>
1004 framebuffer_blend_colordodge_pipelines_;
1005 mutable Variants<FramebufferBlendDarkenPipeline>
1006 framebuffer_blend_darken_pipelines_;
1007 mutable Variants<FramebufferBlendDifferencePipeline>
1008 framebuffer_blend_difference_pipelines_;
1009 mutable Variants<FramebufferBlendExclusionPipeline>
1010 framebuffer_blend_exclusion_pipelines_;
1011 mutable Variants<FramebufferBlendHardLightPipeline>
1012 framebuffer_blend_hardlight_pipelines_;
1013 mutable Variants<FramebufferBlendHuePipeline>
1014 framebuffer_blend_hue_pipelines_;
1015 mutable Variants<FramebufferBlendLightenPipeline>
1016 framebuffer_blend_lighten_pipelines_;
1017 mutable Variants<FramebufferBlendLuminosityPipeline>
1018 framebuffer_blend_luminosity_pipelines_;
1019 mutable Variants<FramebufferBlendMultiplyPipeline>
1020 framebuffer_blend_multiply_pipelines_;
1021 mutable Variants<FramebufferBlendOverlayPipeline>
1022 framebuffer_blend_overlay_pipelines_;
1023 mutable Variants<FramebufferBlendSaturationPipeline>
1024 framebuffer_blend_saturation_pipelines_;
1025 mutable Variants<FramebufferBlendScreenPipeline>
1026 framebuffer_blend_screen_pipelines_;
1027 mutable Variants<FramebufferBlendSoftLightPipeline>
1028 framebuffer_blend_softlight_pipelines_;
1029 mutable std::shared_ptr<Pipeline<ComputePipelineDescriptor>>
1030 point_field_compute_pipelines_;
1031 mutable std::shared_ptr<Pipeline<ComputePipelineDescriptor>>
1032 uv_compute_pipelines_;
1034 template <
class TypedPipeline>
1035 std::shared_ptr<Pipeline<PipelineDescriptor>> GetPipeline(
1036 Variants<TypedPipeline>& container,
1037 ContentContextOptions opts)
const {
1038 TypedPipeline* pipeline = CreateIfNeeded(container, opts);
1042 return pipeline->WaitAndGet();
1045 template <
class TypedPipeline>
1046 TypedPipeline* CreateIfNeeded(Variants<TypedPipeline>& container,
1047 ContentContextOptions opts)
const {
1053 opts.wireframe =
true;
1056 if (TypedPipeline* found = container.Get(opts)) {
1060 TypedPipeline* prototype = container.GetDefault();
1063 FML_CHECK(prototype !=
nullptr);
1065 std::shared_ptr<Pipeline<PipelineDescriptor>> pipeline =
1066 prototype->WaitAndGet();
1071 auto variant_future = pipeline->CreateVariant(
1072 [&opts, variants_count =
1073 container.GetPipelineCount()](PipelineDescriptor& desc) {
1074 opts.ApplyToPipelineDescriptor(desc);
1076 SPrintF(
"%s V#%zu", desc.GetLabel().c_str(), variants_count));
1078 std::unique_ptr<TypedPipeline> variant =
1079 std::make_unique<TypedPipeline>(std::move(variant_future));
1080 container.Set(opts, std::move(variant));
1081 return container.Get(opts);
1084 bool is_valid_ =
false;
1085 std::shared_ptr<Tessellator> tessellator_;
1086 #if IMPELLER_ENABLE_3D
1087 std::shared_ptr<scene::SceneContext> scene_context_;
1088 #endif // IMPELLER_ENABLE_3D
1089 std::shared_ptr<RenderTargetAllocator> render_target_cache_;
1090 std::shared_ptr<HostBuffer> host_buffer_;
1091 std::unique_ptr<PendingCommandBuffers> pending_command_buffers_;
1092 bool wireframe_ =
false;
1101 #endif // FLUTTER_IMPELLER_ENTITY_CONTENTS_CONTENT_CONTEXT_H_