Flutter Impeller
content_context.cc
Go to the documentation of this file.
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
6 
7 #include <format>
8 #include <memory>
9 #include <utility>
10 
11 #include "flutter/display_list/image/dl_image.h"
12 #include "fml/trace_event.h"
14 #include "impeller/core/formats.h"
19 #include "impeller/entity/entity.h"
29 
30 namespace impeller {
31 
32 namespace {
33 
34 /// A generic version of `Variants` which mostly exists to reduce code size.
35 class GenericVariants {
36  public:
37  void Set(const ContentContextOptions& options,
38  std::unique_ptr<GenericRenderPipelineHandle> pipeline) {
39  uint64_t p_key = options.ToKey();
40  for (const auto& [key, pipeline] : pipelines_) {
41  if (key == p_key) {
42  return;
43  }
44  }
45  pipelines_.push_back(std::make_pair(p_key, std::move(pipeline)));
46  }
47 
48  void SetDefault(const ContentContextOptions& options,
49  std::unique_ptr<GenericRenderPipelineHandle> pipeline) {
50  default_options_ = options;
51  if (pipeline) {
52  Set(options, std::move(pipeline));
53  }
54  }
55 
56  GenericRenderPipelineHandle* Get(const ContentContextOptions& options) const {
57  uint64_t p_key = options.ToKey();
58  for (const auto& [key, pipeline] : pipelines_) {
59  if (key == p_key) {
60  return pipeline.get();
61  }
62  }
63  return nullptr;
64  }
65 
66  void SetDefaultDescriptor(std::optional<PipelineDescriptor> desc) {
67  desc_ = std::move(desc);
68  }
69 
70  size_t GetPipelineCount() const { return pipelines_.size(); }
71 
72  bool IsDefault(const ContentContextOptions& opts) {
73  return default_options_.has_value() &&
74  opts.ToKey() == default_options_.value().ToKey();
75  }
76 
77  protected:
78  std::optional<PipelineDescriptor> desc_;
79  std::optional<ContentContextOptions> default_options_;
80  std::vector<std::pair<uint64_t, std::unique_ptr<GenericRenderPipelineHandle>>>
82 };
83 
84 /// Holds multiple Pipelines associated with the same PipelineHandle types.
85 ///
86 /// For example, it may have multiple
87 /// RenderPipelineHandle<SolidFillVertexShader, SolidFillFragmentShader>
88 /// instances for different blend modes. From them you can access the
89 /// Pipeline.
90 ///
91 /// See also:
92 /// - impeller::ContentContextOptions - options from which variants are
93 /// created.
94 /// - impeller::Pipeline::CreateVariant
95 /// - impeller::RenderPipelineHandle<> - The type of objects this typically
96 /// contains.
97 template <class PipelineHandleT>
98 class Variants : public GenericVariants {
99  static_assert(
100  ShaderStageCompatibilityChecker<
101  typename PipelineHandleT::VertexShader,
102  typename PipelineHandleT::FragmentShader>::Check(),
103  "The output slots for the fragment shader don't have matches in the "
104  "vertex shader's output slots. This will result in a linker error.");
105 
106  public:
107  Variants() = default;
108 
109  void Set(const ContentContextOptions& options,
110  std::unique_ptr<PipelineHandleT> pipeline) {
111  GenericVariants::Set(options, std::move(pipeline));
112  }
113 
114  void SetDefault(const ContentContextOptions& options,
115  std::unique_ptr<PipelineHandleT> pipeline) {
116  GenericVariants::SetDefault(options, std::move(pipeline));
117  }
118 
119  void CreateDefault(const Context& context,
120  const ContentContextOptions& options,
121  const std::vector<Scalar>& constants = {}) {
122  std::optional<PipelineDescriptor> desc =
123  PipelineHandleT::Builder::MakeDefaultPipelineDescriptor(context,
124  constants);
125  if (!desc.has_value()) {
126  VALIDATION_LOG << "Failed to create default pipeline.";
127  return;
128  }
129  context.GetPipelineLibrary()->LogPipelineCreation(*desc);
130  options.ApplyToPipelineDescriptor(*desc);
131  desc_ = desc;
132  SetDefault(options, std::make_unique<PipelineHandleT>(context, desc_,
133  /*async=*/true));
134  }
135 
136  PipelineHandleT* Get(const ContentContextOptions& options) const {
137  return static_cast<PipelineHandleT*>(GenericVariants::Get(options));
138  }
139 
140  PipelineHandleT* GetDefault(const Context& context) {
141  if (!default_options_.has_value()) {
142  return nullptr;
143  }
144  PipelineHandleT* result = Get(default_options_.value());
145  if (result != nullptr) {
146  return result;
147  }
148  SetDefault(default_options_.value(), std::make_unique<PipelineHandleT>(
149  context, desc_, /*async=*/false));
150  // NOLINTNEXTLINE(bugprone-unchecked-optional-access)
151  return Get(default_options_.value());
152  }
153 
154  private:
155  Variants(const Variants&) = delete;
156 
157  Variants& operator=(const Variants&) = delete;
158 };
159 
160 template <class RenderPipelineHandleT>
161 RenderPipelineHandleT* CreateIfNeeded(
162  const ContentContext* context,
163  Variants<RenderPipelineHandleT>& container,
164  ContentContextOptions opts,
165  PipelineCompileQueue* compile_queue) {
166  if (!context->IsValid()) {
167  return nullptr;
168  }
169 
170  if (RenderPipelineHandleT* found = container.Get(opts)) {
171  return found;
172  }
173 
174  RenderPipelineHandleT* default_handle =
175  container.GetDefault(*context->GetContext());
176  if (container.IsDefault(opts)) {
177  return default_handle;
178  }
179 
180  // The default must always be initialized in the constructor.
181  FML_CHECK(default_handle != nullptr);
182 
183  const std::shared_ptr<Pipeline<PipelineDescriptor>>& pipeline =
184  default_handle->WaitAndGet(compile_queue);
185  if (!pipeline) {
186  return nullptr;
187  }
188 
189  auto variant_future = pipeline->CreateVariant(
190  /*async=*/false, [&opts, variants_count = container.GetPipelineCount()](
191  PipelineDescriptor& desc) {
192  opts.ApplyToPipelineDescriptor(desc);
193  desc.SetLabel(std::format("{} V#{}", desc.GetLabel(), variants_count));
194  });
195  std::unique_ptr<RenderPipelineHandleT> variant =
196  std::make_unique<RenderPipelineHandleT>(std::move(variant_future));
197  container.Set(opts, std::move(variant));
198  return container.Get(opts);
199 }
200 
201 template <class TypedPipeline>
202 PipelineRef GetPipeline(const ContentContext* context,
203  Variants<TypedPipeline>& container,
204  ContentContextOptions opts) {
205  auto compile_queue =
206  context->GetContext()->GetPipelineLibrary()->GetPipelineCompileQueue();
207  TypedPipeline* pipeline =
208  CreateIfNeeded(context, container, opts, compile_queue);
209  if (!pipeline) {
210  return raw_ptr<Pipeline<PipelineDescriptor>>();
211  }
212  return raw_ptr(pipeline->WaitAndGet(compile_queue));
213 }
214 
215 } // namespace
216 
218  // clang-format off
219  Variants<BlendColorBurnPipeline> blend_colorburn;
220  Variants<BlendColorDodgePipeline> blend_colordodge;
221  Variants<BlendColorPipeline> blend_color;
222  Variants<BlendDarkenPipeline> blend_darken;
223  Variants<BlendDifferencePipeline> blend_difference;
224  Variants<BlendExclusionPipeline> blend_exclusion;
225  Variants<BlendHardLightPipeline> blend_hardlight;
226  Variants<BlendHuePipeline> blend_hue;
227  Variants<BlendLightenPipeline> blend_lighten;
228  Variants<BlendLuminosityPipeline> blend_luminosity;
229  Variants<BlendMultiplyPipeline> blend_multiply;
230  Variants<BlendOverlayPipeline> blend_overlay;
231  Variants<BlendSaturationPipeline> blend_saturation;
232  Variants<BlendScreenPipeline> blend_screen;
233  Variants<BlendSoftLightPipeline> blend_softlight;
234  Variants<BorderMaskBlurPipeline> border_mask_blur;
235  Variants<CirclePipeline> circle;
236  Variants<ClipPipeline> clip;
237  Variants<ColorMatrixColorFilterPipeline> color_matrix_color_filter;
238  Variants<ConicalGradientFillConicalPipeline> conical_gradient_fill;
239  Variants<ConicalGradientFillRadialPipeline> conical_gradient_fill_radial;
240  Variants<ConicalGradientFillStripPipeline> conical_gradient_fill_strip;
241  Variants<ConicalGradientFillStripRadialPipeline> conical_gradient_fill_strip_and_radial;
242  Variants<ConicalGradientSSBOFillPipeline> conical_gradient_ssbo_fill;
243  Variants<ConicalGradientSSBOFillPipeline> conical_gradient_ssbo_fill_radial;
244  Variants<ConicalGradientSSBOFillPipeline> conical_gradient_ssbo_fill_strip_and_radial;
245  Variants<ConicalGradientSSBOFillPipeline> conical_gradient_ssbo_fill_strip;
246  Variants<ConicalGradientUniformFillConicalPipeline> conical_gradient_uniform_fill;
247  Variants<ConicalGradientUniformFillRadialPipeline> conical_gradient_uniform_fill_radial;
248  Variants<ConicalGradientUniformFillStripPipeline> conical_gradient_uniform_fill_strip;
249  Variants<ConicalGradientUniformFillStripRadialPipeline> conical_gradient_uniform_fill_strip_and_radial;
250  Variants<FastGradientPipeline> fast_gradient;
251  Variants<FramebufferBlendColorBurnPipeline> framebuffer_blend_colorburn;
252  Variants<FramebufferBlendColorDodgePipeline> framebuffer_blend_colordodge;
253  Variants<FramebufferBlendColorPipeline> framebuffer_blend_color;
254  Variants<FramebufferBlendDarkenPipeline> framebuffer_blend_darken;
255  Variants<FramebufferBlendDifferencePipeline> framebuffer_blend_difference;
256  Variants<FramebufferBlendExclusionPipeline> framebuffer_blend_exclusion;
257  Variants<FramebufferBlendHardLightPipeline> framebuffer_blend_hardlight;
258  Variants<FramebufferBlendHuePipeline> framebuffer_blend_hue;
259  Variants<FramebufferBlendLightenPipeline> framebuffer_blend_lighten;
260  Variants<FramebufferBlendLuminosityPipeline> framebuffer_blend_luminosity;
261  Variants<FramebufferBlendMultiplyPipeline> framebuffer_blend_multiply;
262  Variants<FramebufferBlendOverlayPipeline> framebuffer_blend_overlay;
263  Variants<FramebufferBlendSaturationPipeline> framebuffer_blend_saturation;
264  Variants<FramebufferBlendScreenPipeline> framebuffer_blend_screen;
265  Variants<FramebufferBlendSoftLightPipeline> framebuffer_blend_softlight;
266  Variants<GaussianBlurPipeline> gaussian_blur;
267  Variants<GlyphAtlasPipeline> glyph_atlas;
268  Variants<LinePipeline> line;
269  Variants<LinearGradientFillPipeline> linear_gradient_fill;
270  Variants<LinearGradientSSBOFillPipeline> linear_gradient_ssbo_fill;
271  Variants<LinearGradientUniformFillPipeline> linear_gradient_uniform_fill;
272  Variants<LinearToSrgbFilterPipeline> linear_to_srgb_filter;
273  Variants<MorphologyFilterPipeline> morphology_filter;
274  Variants<PorterDuffBlendPipeline> clear_blend;
275  Variants<PorterDuffBlendPipeline> destination_a_top_blend;
276  Variants<PorterDuffBlendPipeline> destination_blend;
277  Variants<PorterDuffBlendPipeline> destination_in_blend;
278  Variants<PorterDuffBlendPipeline> destination_out_blend;
279  Variants<PorterDuffBlendPipeline> destination_over_blend;
280  Variants<PorterDuffBlendPipeline> modulate_blend;
281  Variants<PorterDuffBlendPipeline> plus_blend;
282  Variants<PorterDuffBlendPipeline> screen_blend;
283  Variants<PorterDuffBlendPipeline> source_a_top_blend;
284  Variants<PorterDuffBlendPipeline> source_blend;
285  Variants<PorterDuffBlendPipeline> source_in_blend;
286  Variants<PorterDuffBlendPipeline> source_out_blend;
287  Variants<PorterDuffBlendPipeline> source_over_blend;
288  Variants<PorterDuffBlendPipeline> xor_blend;
289  Variants<RadialGradientFillPipeline> radial_gradient_fill;
290  Variants<RadialGradientSSBOFillPipeline> radial_gradient_ssbo_fill;
291  Variants<RadialGradientUniformFillPipeline> radial_gradient_uniform_fill;
292  Variants<RRectBlurPipeline> rrect_blur;
293  Variants<RSuperellipseBlurPipeline> rsuperellipse_blur;
294  Variants<ShadowVerticesShader> shadow_vertices_;
295  Variants<SolidFillPipeline> solid_fill;
296  Variants<SrgbToLinearFilterPipeline> srgb_to_linear_filter;
297  Variants<SweepGradientFillPipeline> sweep_gradient_fill;
298  Variants<SweepGradientSSBOFillPipeline> sweep_gradient_ssbo_fill;
299  Variants<SweepGradientUniformFillPipeline> sweep_gradient_uniform_fill;
300  Variants<TextureDownsamplePipeline> texture_downsample;
301  Variants<TextureDownsampleBoundedPipeline> texture_downsample_bounded;
302  Variants<TexturePipeline> texture;
303  Variants<TextureStrictSrcPipeline> texture_strict_src;
304  Variants<TiledTexturePipeline> tiled_texture;
305  Variants<VerticesUber1Shader> vertices_uber_1_;
306  Variants<VerticesUber2Shader> vertices_uber_2_;
307  Variants<UberSDFPipeline> uber_sdf;
308  Variants<ComplexRSEPipeline> complex_rse;
309  Variants<YUVToRGBFilterPipeline> yuv_to_rgb_filter;
310 
311 // Web doesn't support external texture OpenGL extensions
312 #if defined(IMPELLER_ENABLE_OPENGLES) && !defined(FML_OS_EMSCRIPTEN)
313  Variants<TiledTextureExternalPipeline> tiled_texture_external;
314  Variants<TiledTextureUvExternalPipeline> tiled_texture_uv_external;
315 #endif
316 
317 #if defined(IMPELLER_ENABLE_OPENGLES)
318  Variants<TextureDownsampleGlesPipeline> texture_downsample_gles;
319 #endif // IMPELLER_ENABLE_OPENGLES
320  // clang-format on
321 };
322 
324  PipelineDescriptor& desc) const {
325  auto pipeline_blend = blend_mode;
327  VALIDATION_LOG << "Cannot use blend mode " << static_cast<int>(blend_mode)
328  << " as a pipeline blend.";
329  pipeline_blend = BlendMode::kSrcOver;
330  }
331 
333 
339 
340  switch (pipeline_blend) {
341  case BlendMode::kClear:
349  } else {
354  }
355  break;
356  case BlendMode::kSrc:
357  color0.blending_enabled = false;
362  break;
363  case BlendMode::kDst:
369  break;
370  case BlendMode::kSrcOver:
375  break;
376  case BlendMode::kDstOver:
381  break;
382  case BlendMode::kSrcIn:
387  break;
388  case BlendMode::kDstIn:
393  break;
394  case BlendMode::kSrcOut:
399  break;
400  case BlendMode::kDstOut:
405  break;
406  case BlendMode::kSrcATop:
411  break;
412  case BlendMode::kDstATop:
417  break;
418  case BlendMode::kXor:
423  break;
424  case BlendMode::kPlus:
429  break;
435  break;
436  default:
437  FML_UNREACHABLE();
438  }
439  desc.SetColorAttachmentDescriptor(0u, color0);
440 
442  desc.ClearDepthAttachment();
444  }
445 
446  auto maybe_stencil = desc.GetFrontStencilAttachmentDescriptor();
447  auto maybe_depth = desc.GetDepthStencilAttachmentDescriptor();
448  FML_DCHECK(has_depth_stencil_attachments == maybe_depth.has_value())
449  << "Depth attachment doesn't match expected pipeline state. "
450  "has_depth_stencil_attachments="
452  FML_DCHECK(has_depth_stencil_attachments == maybe_stencil.has_value())
453  << "Stencil attachment doesn't match expected pipeline state. "
454  "has_depth_stencil_attachments="
456  if (maybe_stencil.has_value()) {
457  StencilAttachmentDescriptor front_stencil = maybe_stencil.value();
458  StencilAttachmentDescriptor back_stencil = front_stencil;
459 
460  switch (stencil_mode) {
464  desc.SetStencilAttachmentDescriptors(front_stencil);
465  break;
467  // The stencil ref should be 0 on commands that use this mode.
472  desc.SetStencilAttachmentDescriptors(front_stencil, back_stencil);
473  break;
475  // The stencil ref should be 0 on commands that use this mode.
479  desc.SetStencilAttachmentDescriptors(front_stencil);
480  break;
482  // The stencil ref should be 0 on commands that use this mode.
485  desc.SetStencilAttachmentDescriptors(front_stencil);
486  break;
488  // The stencil ref should be 0 on commands that use this mode.
490  front_stencil.depth_stencil_pass =
492  desc.SetStencilAttachmentDescriptors(front_stencil);
493  break;
495  // The stencil ref should be 0 on commands that use this mode.
498  desc.SetStencilAttachmentDescriptors(front_stencil);
499  break;
500  }
501  }
502  if (maybe_depth.has_value()) {
503  DepthAttachmentDescriptor depth = maybe_depth.value();
507  }
508 
511 }
512 
513 std::array<std::vector<Scalar>, 15> GetPorterDuffSpecConstants(
514  bool supports_decal) {
515  Scalar x = supports_decal ? 1 : 0;
516  return {{
517  {x, 0, 0, 0, 0, 0}, // Clear
518  {x, 1, 0, 0, 0, 0}, // Source
519  {x, 0, 0, 1, 0, 0}, // Destination
520  {x, 1, 0, 1, -1, 0}, // SourceOver
521  {x, 1, -1, 1, 0, 0}, // DestinationOver
522  {x, 0, 1, 0, 0, 0}, // SourceIn
523  {x, 0, 0, 0, 1, 0}, // DestinationIn
524  {x, 1, -1, 0, 0, 0}, // SourceOut
525  {x, 0, 0, 1, -1, 0}, // DestinationOut
526  {x, 0, 1, 1, -1, 0}, // SourceATop
527  {x, 1, -1, 0, 1, 0}, // DestinationATop
528  {x, 1, -1, 1, -1, 0}, // Xor
529  {x, 1, 0, 1, 0, 0}, // Plus
530  {x, 0, 0, 0, 0, 1}, // Modulate
531  {x, 0, 0, 1, 0, -1}, // Screen
532  }};
533 }
534 
535 template <typename PipelineT>
536 static std::unique_ptr<PipelineT> CreateDefaultPipeline(
537  const Context& context) {
538  auto desc = PipelineT::Builder::MakeDefaultPipelineDescriptor(context);
539  if (!desc.has_value()) {
540  return nullptr;
541  }
542  // Apply default ContentContextOptions to the descriptor.
543  const auto default_color_format =
544  context.GetCapabilities()->GetDefaultColorFormat();
546  .primitive_type = PrimitiveType::kTriangleStrip,
547  .color_attachment_pixel_format = default_color_format}
548  .ApplyToPipelineDescriptor(*desc);
549  return std::make_unique<PipelineT>(context, desc);
550 }
551 
553  std::shared_ptr<Context> context,
554  std::shared_ptr<TypographerContext> typographer_context,
555  std::shared_ptr<RenderTargetAllocator> render_target_allocator)
556  : context_(std::move(context)),
557  lazy_glyph_atlas_(
558  std::make_shared<LazyGlyphAtlas>(std::move(typographer_context))),
559  pipelines_(new Pipelines()),
560  tessellator_(std::make_shared<Tessellator>(
561  context_->GetCapabilities()->Supports32BitPrimitiveIndices())),
562  render_target_cache_(render_target_allocator == nullptr
563  ? std::make_shared<RenderTargetCache>(
564  context_->GetResourceAllocator())
565  : std::move(render_target_allocator)),
566  data_host_buffer_(HostBuffer::Create(
567  context_->GetResourceAllocator(),
568  context_->GetIdleWaiter(),
569  context_->GetCapabilities()->GetMinimumUniformAlignment())),
570  text_shadow_cache_(std::make_unique<TextShadowCache>()) {
571  if (!context_ || !context_->IsValid()) {
572  return;
573  }
574 
575  // On most backends, indexes and other data can be allocated into the same
576  // buffers. However, some backends (namely WebGL) require indexes used in
577  // indexed draws to be allocated separately from other data. For those
578  // backends, we allocate a separate host buffer just for indexes.
579  indexes_host_buffer_ =
580  context_->GetCapabilities()->NeedsPartitionedHostBuffer()
582  context_->GetResourceAllocator(), context_->GetIdleWaiter(),
583  context_->GetCapabilities()->GetMinimumUniformAlignment())
584  : data_host_buffer_;
585  {
586  TextureDescriptor desc;
589  desc.size = ISize{1, 1};
590  empty_texture_ = GetContext()->GetResourceAllocator()->CreateTexture(desc);
591 
592  std::array<uint8_t, 4> data = Color::BlackTransparent().ToR8G8B8A8();
593  std::shared_ptr<CommandBuffer> cmd_buffer =
594  GetContext()->CreateCommandBuffer();
595  std::shared_ptr<BlitPass> blit_pass = cmd_buffer->CreateBlitPass();
596  HostBuffer& data_host_buffer = GetTransientsDataBuffer();
597  BufferView buffer_view = data_host_buffer.Emplace(data);
598  blit_pass->AddCopy(buffer_view, empty_texture_);
599 
600  if (!blit_pass->EncodeCommands() || !GetContext()
601  ->GetCommandQueue()
602  ->Submit({std::move(cmd_buffer)})
603  .ok()) {
604  VALIDATION_LOG << "Failed to create empty texture.";
605  }
606  }
607 
608  auto options = ContentContextOptions{
610  .color_attachment_pixel_format =
611  context_->GetCapabilities()->GetDefaultColorFormat()};
612  auto options_trianglestrip = ContentContextOptions{
614  .primitive_type = PrimitiveType::kTriangleStrip,
615  .color_attachment_pixel_format =
616  context_->GetCapabilities()->GetDefaultColorFormat()};
617  auto options_no_msaa_no_depth_stencil = ContentContextOptions{
619  .primitive_type = PrimitiveType::kTriangleStrip,
620  .color_attachment_pixel_format =
621  context_->GetCapabilities()->GetDefaultColorFormat(),
622  .has_depth_stencil_attachments = false};
623  const auto supports_decal = static_cast<Scalar>(
624  context_->GetCapabilities()->SupportsDecalSamplerAddressMode());
625 
626  // Futures for the following pipelines may block in case the first frame is
627  // rendered without the pipelines being ready. Put pipelines that are more
628  // likely to be used first.
629  {
630  pipelines_->glyph_atlas.CreateDefault(
631  *context_, options,
632  {static_cast<Scalar>(
633  GetContext()->GetCapabilities()->GetDefaultGlyphAtlasFormat() ==
635  pipelines_->solid_fill.CreateDefault(*context_, options);
636  pipelines_->texture.CreateDefault(*context_, options);
637  pipelines_->fast_gradient.CreateDefault(*context_, options);
638  pipelines_->line.CreateDefault(*context_, options);
639  pipelines_->circle.CreateDefault(*context_, options);
640  if (context_->GetFlags().use_sdfs ||
641  context_->GetFlags().antialiased_lines) {
642  pipelines_->uber_sdf.CreateDefault(*context_, options);
643  pipelines_->complex_rse.CreateDefault(*context_, options);
644  }
645 
646  if (context_->GetCapabilities()->SupportsSSBO()) {
647  pipelines_->linear_gradient_ssbo_fill.CreateDefault(*context_, options);
648  pipelines_->radial_gradient_ssbo_fill.CreateDefault(*context_, options);
649  pipelines_->conical_gradient_ssbo_fill.CreateDefault(*context_, options,
650  {3.0});
651  pipelines_->conical_gradient_ssbo_fill_radial.CreateDefault(
652  *context_, options, {1.0});
653  pipelines_->conical_gradient_ssbo_fill_strip.CreateDefault(
654  *context_, options, {2.0});
655  pipelines_->conical_gradient_ssbo_fill_strip_and_radial.CreateDefault(
656  *context_, options, {0.0});
657  pipelines_->sweep_gradient_ssbo_fill.CreateDefault(*context_, options);
658  } else {
659  pipelines_->linear_gradient_uniform_fill.CreateDefault(*context_,
660  options);
661  pipelines_->radial_gradient_uniform_fill.CreateDefault(*context_,
662  options);
663  pipelines_->conical_gradient_uniform_fill.CreateDefault(*context_,
664  options);
665  pipelines_->conical_gradient_uniform_fill_radial.CreateDefault(*context_,
666  options);
667  pipelines_->conical_gradient_uniform_fill_strip.CreateDefault(*context_,
668  options);
669  pipelines_->conical_gradient_uniform_fill_strip_and_radial.CreateDefault(
670  *context_, options);
671  pipelines_->sweep_gradient_uniform_fill.CreateDefault(*context_, options);
672 
673  pipelines_->linear_gradient_fill.CreateDefault(*context_, options);
674  pipelines_->radial_gradient_fill.CreateDefault(*context_, options);
675  pipelines_->conical_gradient_fill.CreateDefault(*context_, options);
676  pipelines_->conical_gradient_fill_radial.CreateDefault(*context_,
677  options);
678  pipelines_->conical_gradient_fill_strip.CreateDefault(*context_, options);
679  pipelines_->conical_gradient_fill_strip_and_radial.CreateDefault(
680  *context_, options);
681  pipelines_->sweep_gradient_fill.CreateDefault(*context_, options);
682  }
683 
684  /// Setup default clip pipeline.
685  auto clip_pipeline_descriptor =
687  if (!clip_pipeline_descriptor.has_value()) {
688  return;
689  }
692  .color_attachment_pixel_format =
693  context_->GetCapabilities()->GetDefaultColorFormat()}
694  .ApplyToPipelineDescriptor(*clip_pipeline_descriptor);
695  // Disable write to all color attachments.
696  auto clip_color_attachments =
697  clip_pipeline_descriptor->GetColorAttachmentDescriptors();
698  for (auto& color_attachment : clip_color_attachments) {
699  color_attachment.second.write_mask = ColorWriteMaskBits::kNone;
700  }
701  clip_pipeline_descriptor->SetColorAttachmentDescriptors(
702  std::move(clip_color_attachments));
703  pipelines_->clip.SetDefault(
704  options,
705  std::make_unique<ClipPipeline>(*context_, clip_pipeline_descriptor));
706  pipelines_->texture_downsample.CreateDefault(
707  *context_, options_no_msaa_no_depth_stencil);
708  pipelines_->texture_downsample_bounded.CreateDefault(
709  *context_, options_no_msaa_no_depth_stencil);
710  pipelines_->rrect_blur.CreateDefault(*context_, options_trianglestrip);
711  pipelines_->rsuperellipse_blur.CreateDefault(*context_,
712  options_trianglestrip);
713  pipelines_->texture_strict_src.CreateDefault(*context_, options);
714  pipelines_->tiled_texture.CreateDefault(*context_, options,
715  {supports_decal});
716  pipelines_->gaussian_blur.CreateDefault(
717  *context_, options_no_msaa_no_depth_stencil, {supports_decal});
718  pipelines_->border_mask_blur.CreateDefault(*context_,
719  options_trianglestrip);
720  pipelines_->color_matrix_color_filter.CreateDefault(*context_,
721  options_trianglestrip);
722  pipelines_->shadow_vertices_.CreateDefault(*context_, options);
723  pipelines_->vertices_uber_1_.CreateDefault(*context_, options,
724  {supports_decal});
725  pipelines_->vertices_uber_2_.CreateDefault(*context_, options,
726  {supports_decal});
727 
728  const std::array<std::vector<Scalar>, 15> porter_duff_constants =
729  GetPorterDuffSpecConstants(supports_decal);
730  pipelines_->clear_blend.CreateDefault(*context_, options_trianglestrip,
731  porter_duff_constants[0]);
732  pipelines_->source_blend.CreateDefault(*context_, options_trianglestrip,
733  porter_duff_constants[1]);
734  pipelines_->destination_blend.CreateDefault(
735  *context_, options_trianglestrip, porter_duff_constants[2]);
736  pipelines_->source_over_blend.CreateDefault(
737  *context_, options_trianglestrip, porter_duff_constants[3]);
738  pipelines_->destination_over_blend.CreateDefault(
739  *context_, options_trianglestrip, porter_duff_constants[4]);
740  pipelines_->source_in_blend.CreateDefault(*context_, options_trianglestrip,
741  porter_duff_constants[5]);
742  pipelines_->destination_in_blend.CreateDefault(
743  *context_, options_trianglestrip, porter_duff_constants[6]);
744  pipelines_->source_out_blend.CreateDefault(*context_, options_trianglestrip,
745  porter_duff_constants[7]);
746  pipelines_->destination_out_blend.CreateDefault(
747  *context_, options_trianglestrip, porter_duff_constants[8]);
748  pipelines_->source_a_top_blend.CreateDefault(
749  *context_, options_trianglestrip, porter_duff_constants[9]);
750  pipelines_->destination_a_top_blend.CreateDefault(
751  *context_, options_trianglestrip, porter_duff_constants[10]);
752  pipelines_->xor_blend.CreateDefault(*context_, options_trianglestrip,
753  porter_duff_constants[11]);
754  pipelines_->plus_blend.CreateDefault(*context_, options_trianglestrip,
755  porter_duff_constants[12]);
756  pipelines_->modulate_blend.CreateDefault(*context_, options_trianglestrip,
757  porter_duff_constants[13]);
758  pipelines_->screen_blend.CreateDefault(*context_, options_trianglestrip,
759  porter_duff_constants[14]);
760  }
761 
762  if (context_->GetCapabilities()->SupportsFramebufferFetch()) {
763  pipelines_->framebuffer_blend_color.CreateDefault(
764  *context_, options_trianglestrip,
765  {static_cast<Scalar>(BlendSelectValues::kColor), supports_decal});
766  pipelines_->framebuffer_blend_colorburn.CreateDefault(
767  *context_, options_trianglestrip,
768  {static_cast<Scalar>(BlendSelectValues::kColorBurn), supports_decal});
769  pipelines_->framebuffer_blend_colordodge.CreateDefault(
770  *context_, options_trianglestrip,
771  {static_cast<Scalar>(BlendSelectValues::kColorDodge), supports_decal});
772  pipelines_->framebuffer_blend_darken.CreateDefault(
773  *context_, options_trianglestrip,
774  {static_cast<Scalar>(BlendSelectValues::kDarken), supports_decal});
775  pipelines_->framebuffer_blend_difference.CreateDefault(
776  *context_, options_trianglestrip,
777  {static_cast<Scalar>(BlendSelectValues::kDifference), supports_decal});
778  pipelines_->framebuffer_blend_exclusion.CreateDefault(
779  *context_, options_trianglestrip,
780  {static_cast<Scalar>(BlendSelectValues::kExclusion), supports_decal});
781  pipelines_->framebuffer_blend_hardlight.CreateDefault(
782  *context_, options_trianglestrip,
783  {static_cast<Scalar>(BlendSelectValues::kHardLight), supports_decal});
784  pipelines_->framebuffer_blend_hue.CreateDefault(
785  *context_, options_trianglestrip,
786  {static_cast<Scalar>(BlendSelectValues::kHue), supports_decal});
787  pipelines_->framebuffer_blend_lighten.CreateDefault(
788  *context_, options_trianglestrip,
789  {static_cast<Scalar>(BlendSelectValues::kLighten), supports_decal});
790  pipelines_->framebuffer_blend_luminosity.CreateDefault(
791  *context_, options_trianglestrip,
792  {static_cast<Scalar>(BlendSelectValues::kLuminosity), supports_decal});
793  pipelines_->framebuffer_blend_multiply.CreateDefault(
794  *context_, options_trianglestrip,
795  {static_cast<Scalar>(BlendSelectValues::kMultiply), supports_decal});
796  pipelines_->framebuffer_blend_overlay.CreateDefault(
797  *context_, options_trianglestrip,
798  {static_cast<Scalar>(BlendSelectValues::kOverlay), supports_decal});
799  pipelines_->framebuffer_blend_saturation.CreateDefault(
800  *context_, options_trianglestrip,
801  {static_cast<Scalar>(BlendSelectValues::kSaturation), supports_decal});
802  pipelines_->framebuffer_blend_screen.CreateDefault(
803  *context_, options_trianglestrip,
804  {static_cast<Scalar>(BlendSelectValues::kScreen), supports_decal});
805  pipelines_->framebuffer_blend_softlight.CreateDefault(
806  *context_, options_trianglestrip,
807  {static_cast<Scalar>(BlendSelectValues::kSoftLight), supports_decal});
808  } else {
809  pipelines_->blend_color.CreateDefault(
810  *context_, options_trianglestrip,
811  {static_cast<Scalar>(BlendSelectValues::kColor), supports_decal});
812  pipelines_->blend_colorburn.CreateDefault(
813  *context_, options_trianglestrip,
814  {static_cast<Scalar>(BlendSelectValues::kColorBurn), supports_decal});
815  pipelines_->blend_colordodge.CreateDefault(
816  *context_, options_trianglestrip,
817  {static_cast<Scalar>(BlendSelectValues::kColorDodge), supports_decal});
818  pipelines_->blend_darken.CreateDefault(
819  *context_, options_trianglestrip,
820  {static_cast<Scalar>(BlendSelectValues::kDarken), supports_decal});
821  pipelines_->blend_difference.CreateDefault(
822  *context_, options_trianglestrip,
823  {static_cast<Scalar>(BlendSelectValues::kDifference), supports_decal});
824  pipelines_->blend_exclusion.CreateDefault(
825  *context_, options_trianglestrip,
826  {static_cast<Scalar>(BlendSelectValues::kExclusion), supports_decal});
827  pipelines_->blend_hardlight.CreateDefault(
828  *context_, options_trianglestrip,
829  {static_cast<Scalar>(BlendSelectValues::kHardLight), supports_decal});
830  pipelines_->blend_hue.CreateDefault(
831  *context_, options_trianglestrip,
832  {static_cast<Scalar>(BlendSelectValues::kHue), supports_decal});
833  pipelines_->blend_lighten.CreateDefault(
834  *context_, options_trianglestrip,
835  {static_cast<Scalar>(BlendSelectValues::kLighten), supports_decal});
836  pipelines_->blend_luminosity.CreateDefault(
837  *context_, options_trianglestrip,
838  {static_cast<Scalar>(BlendSelectValues::kLuminosity), supports_decal});
839  pipelines_->blend_multiply.CreateDefault(
840  *context_, options_trianglestrip,
841  {static_cast<Scalar>(BlendSelectValues::kMultiply), supports_decal});
842  pipelines_->blend_overlay.CreateDefault(
843  *context_, options_trianglestrip,
844  {static_cast<Scalar>(BlendSelectValues::kOverlay), supports_decal});
845  pipelines_->blend_saturation.CreateDefault(
846  *context_, options_trianglestrip,
847  {static_cast<Scalar>(BlendSelectValues::kSaturation), supports_decal});
848  pipelines_->blend_screen.CreateDefault(
849  *context_, options_trianglestrip,
850  {static_cast<Scalar>(BlendSelectValues::kScreen), supports_decal});
851  pipelines_->blend_softlight.CreateDefault(
852  *context_, options_trianglestrip,
853  {static_cast<Scalar>(BlendSelectValues::kSoftLight), supports_decal});
854  }
855 
856  pipelines_->morphology_filter.CreateDefault(*context_, options_trianglestrip,
857  {supports_decal});
858  pipelines_->linear_to_srgb_filter.CreateDefault(*context_,
859  options_trianglestrip);
860  pipelines_->srgb_to_linear_filter.CreateDefault(*context_,
861  options_trianglestrip);
862  pipelines_->yuv_to_rgb_filter.CreateDefault(*context_, options_trianglestrip);
863 
864  if (GetContext()->GetBackendType() == Context::BackendType::kOpenGLES) {
865 #if defined(IMPELLER_ENABLE_OPENGLES) && !defined(FML_OS_MACOSX) && \
866  !defined(FML_OS_EMSCRIPTEN)
867  // GLES only shader that is unsupported on macOS and web.
868  pipelines_->tiled_texture_external.CreateDefault(*context_, options);
869  pipelines_->tiled_texture_uv_external.CreateDefault(*context_, options);
870 #endif // !defined(FML_OS_MACOSX)
871 
872 #if defined(IMPELLER_ENABLE_OPENGLES)
873  pipelines_->texture_downsample_gles.CreateDefault(*context_,
874  options_trianglestrip);
875 #endif // IMPELLER_ENABLE_OPENGLES
876  }
877 
878  is_valid_ = true;
879  InitializeCommonlyUsedShadersIfNeeded();
880 }
881 
883 
885  return is_valid_;
886 }
887 
888 std::shared_ptr<Texture> ContentContext::GetEmptyTexture() const {
889  return empty_texture_;
890 }
891 
892 fml::StatusOr<RenderTarget> ContentContext::MakeSubpass(
893  std::string_view label,
894  ISize texture_size,
895  const std::shared_ptr<CommandBuffer>& command_buffer,
896  const SubpassCallback& subpass_callback,
897  bool msaa_enabled,
898  bool depth_stencil_enabled,
899  int32_t mip_count) const {
900  const std::shared_ptr<Context>& context = GetContext();
901  RenderTarget subpass_target;
902 
903  std::optional<RenderTarget::AttachmentConfig> depth_stencil_config =
904  depth_stencil_enabled ? RenderTarget::kDefaultStencilAttachmentConfig
905  : std::optional<RenderTarget::AttachmentConfig>();
906 
907  if (context->GetCapabilities()->SupportsOffscreenMSAA() && msaa_enabled) {
908  subpass_target = GetRenderTargetCache()->CreateOffscreenMSAA(
909  /*context=*/*context,
910  /*size=*/texture_size,
911  /*mip_count=*/mip_count,
912  /*label=*/label,
913  /*color_attachment_config=*/
915  /*stencil_attachment_config=*/depth_stencil_config,
916  /*existing_color_msaa_texture=*/nullptr,
917  /*existing_color_resolve_texture=*/nullptr,
918  /*existing_depth_stencil_texture=*/nullptr,
919  /*target_pixel_format=*/std::nullopt);
920  } else {
921  subpass_target = GetRenderTargetCache()->CreateOffscreen(
922  *context, texture_size,
923  /*mip_count=*/mip_count, label,
924  RenderTarget::kDefaultColorAttachmentConfig, depth_stencil_config);
925  }
926  return MakeSubpass(label, subpass_target, command_buffer, subpass_callback);
927 }
928 
929 fml::StatusOr<RenderTarget> ContentContext::MakeSubpass(
930  std::string_view label,
931  const RenderTarget& subpass_target,
932  const std::shared_ptr<CommandBuffer>& command_buffer,
933  const SubpassCallback& subpass_callback) const {
934  const std::shared_ptr<Context>& context = GetContext();
935 
936  auto subpass_texture = subpass_target.GetRenderTargetTexture();
937  if (!subpass_texture) {
938  return fml::Status(fml::StatusCode::kUnknown, "");
939  }
940 
941  auto sub_renderpass = command_buffer->CreateRenderPass(subpass_target);
942  if (!sub_renderpass) {
943  return fml::Status(fml::StatusCode::kUnknown, "");
944  }
945  sub_renderpass->SetLabel(label);
946 
947  if (!subpass_callback(*this, *sub_renderpass)) {
948  return fml::Status(fml::StatusCode::kUnknown, "");
949  }
950 
951  if (!sub_renderpass->EncodeCommands()) {
952  return fml::Status(fml::StatusCode::kUnknown, "");
953  }
954 
955  const std::shared_ptr<Texture>& target_texture =
956  subpass_target.GetRenderTargetTexture();
957  if (target_texture->GetMipCount() > 1) {
958  fml::Status mipmap_status =
959  AddMipmapGeneration(command_buffer, context, target_texture);
960  if (!mipmap_status.ok()) {
961  return mipmap_status;
962  }
963  }
964 
965  return subpass_target;
966 }
967 
969  return *tessellator_;
970 }
971 
972 std::shared_ptr<Context> ContentContext::GetContext() const {
973  return context_;
974 }
975 
977  return *context_->GetCapabilities();
978 }
979 
981  const std::string& unique_entrypoint_name,
982  const ContentContextOptions& options,
983  const std::function<std::shared_ptr<Pipeline<PipelineDescriptor>>()>&
984  create_callback) const {
985  RuntimeEffectPipelineKey key{unique_entrypoint_name, options};
986  auto it = runtime_effect_pipelines_.find(key);
987  if (it == runtime_effect_pipelines_.end()) {
988  it = runtime_effect_pipelines_.insert(it, {key, create_callback()});
989  }
990  return raw_ptr(it->second);
991 }
992 
994  const std::string& unique_entrypoint_name) const {
995 #ifdef IMPELLER_DEBUG
996  // destroying in-use pipleines is a validation error.
997  const auto& idle_waiter = GetContext()->GetIdleWaiter();
998  if (idle_waiter) {
999  idle_waiter->WaitIdle();
1000  }
1001 #endif // IMPELLER_DEBUG
1002  for (auto it = runtime_effect_pipelines_.begin();
1003  it != runtime_effect_pipelines_.end();) {
1004  if (it->first.unique_entrypoint_name == unique_entrypoint_name) {
1005  it = runtime_effect_pipelines_.erase(it);
1006  } else {
1007  it++;
1008  }
1009  }
1010 }
1011 
1013  data_host_buffer_->Reset();
1014 
1015  // We should only reset the indexes host buffer if it is actually different
1016  // from the data host buffer. Otherwise we'll end up resetting the same host
1017  // buffer twice.
1018  if (data_host_buffer_ != indexes_host_buffer_) {
1019  indexes_host_buffer_->Reset();
1020  }
1021 }
1022 
1023 void ContentContext::InitializeCommonlyUsedShadersIfNeeded() const {
1024  GetContext()->InitializeCommonlyUsedShadersIfNeeded();
1025 }
1026 
1028  ContentContextOptions opts) const {
1029  return GetPipeline(this, pipelines_->fast_gradient, opts);
1030 }
1031 
1033  ContentContextOptions opts) const {
1034  return GetPipeline(this, pipelines_->linear_gradient_fill, opts);
1035 }
1036 
1038  ContentContextOptions opts) const {
1039  return GetPipeline(this, pipelines_->linear_gradient_uniform_fill, opts);
1040 }
1041 
1043  ContentContextOptions opts) const {
1044  return GetPipeline(this, pipelines_->radial_gradient_uniform_fill, opts);
1045 }
1046 
1048  ContentContextOptions opts) const {
1049  return GetPipeline(this, pipelines_->sweep_gradient_uniform_fill, opts);
1050 }
1051 
1053  ContentContextOptions opts) const {
1054  FML_DCHECK(GetDeviceCapabilities().SupportsSSBO());
1055  return GetPipeline(this, pipelines_->linear_gradient_ssbo_fill, opts);
1056 }
1057 
1059  ContentContextOptions opts) const {
1060  FML_DCHECK(GetDeviceCapabilities().SupportsSSBO());
1061  return GetPipeline(this, pipelines_->radial_gradient_ssbo_fill, opts);
1062 }
1063 
1065  ContentContextOptions opts,
1066  ConicalKind kind) const {
1067  switch (kind) {
1068  case ConicalKind::kConical:
1069  return GetPipeline(this, pipelines_->conical_gradient_uniform_fill, opts);
1070  case ConicalKind::kRadial:
1071  return GetPipeline(this, pipelines_->conical_gradient_uniform_fill_radial,
1072  opts);
1073  case ConicalKind::kStrip:
1074  return GetPipeline(this, pipelines_->conical_gradient_uniform_fill_strip,
1075  opts);
1077  return GetPipeline(
1078  this, pipelines_->conical_gradient_uniform_fill_strip_and_radial,
1079  opts);
1080  }
1081 }
1082 
1084  ContentContextOptions opts,
1085  ConicalKind kind) const {
1086  FML_DCHECK(GetDeviceCapabilities().SupportsSSBO());
1087  switch (kind) {
1088  case ConicalKind::kConical:
1089  return GetPipeline(this, pipelines_->conical_gradient_ssbo_fill, opts);
1090  case ConicalKind::kRadial:
1091  return GetPipeline(this, pipelines_->conical_gradient_ssbo_fill_radial,
1092  opts);
1093  case ConicalKind::kStrip:
1094  return GetPipeline(this, pipelines_->conical_gradient_ssbo_fill_strip,
1095  opts);
1097  return GetPipeline(
1098  this, pipelines_->conical_gradient_ssbo_fill_strip_and_radial, opts);
1099  }
1100 }
1101 
1103  ContentContextOptions opts) const {
1104  FML_DCHECK(GetDeviceCapabilities().SupportsSSBO());
1105  return GetPipeline(this, pipelines_->sweep_gradient_ssbo_fill, opts);
1106 }
1107 
1109  ContentContextOptions opts) const {
1110  return GetPipeline(this, pipelines_->radial_gradient_fill, opts);
1111 }
1112 
1114  ContentContextOptions opts,
1115  ConicalKind kind) const {
1116  switch (kind) {
1117  case ConicalKind::kConical:
1118  return GetPipeline(this, pipelines_->conical_gradient_fill, opts);
1119  case ConicalKind::kRadial:
1120  return GetPipeline(this, pipelines_->conical_gradient_fill_radial, opts);
1121  case ConicalKind::kStrip:
1122  return GetPipeline(this, pipelines_->conical_gradient_fill_strip, opts);
1124  return GetPipeline(
1125  this, pipelines_->conical_gradient_fill_strip_and_radial, opts);
1126  }
1127 }
1128 
1130  ContentContextOptions opts) const {
1131  return GetPipeline(this, pipelines_->rrect_blur, opts);
1132 }
1133 
1135  ContentContextOptions opts) const {
1136  return GetPipeline(this, pipelines_->rsuperellipse_blur, opts);
1137 }
1138 
1140  ContentContextOptions opts) const {
1141  return GetPipeline(this, pipelines_->sweep_gradient_fill, opts);
1142 }
1143 
1145  ContentContextOptions opts) const {
1146  return GetPipeline(this, pipelines_->solid_fill, opts);
1147 }
1148 
1150  ContentContextOptions opts) const {
1151  return GetPipeline(this, pipelines_->texture, opts);
1152 }
1153 
1155  ContentContextOptions opts) const {
1156  return GetPipeline(this, pipelines_->texture_strict_src, opts);
1157 }
1158 
1160  ContentContextOptions opts) const {
1161  return GetPipeline(this, pipelines_->tiled_texture, opts);
1162 }
1163 
1165  ContentContextOptions opts) const {
1166  return GetPipeline(this, pipelines_->gaussian_blur, opts);
1167 }
1168 
1170  ContentContextOptions opts) const {
1171  return GetPipeline(this, pipelines_->border_mask_blur, opts);
1172 }
1173 
1175  ContentContextOptions opts) const {
1176  return GetPipeline(this, pipelines_->morphology_filter, opts);
1177 }
1178 
1180  ContentContextOptions opts) const {
1181  return GetPipeline(this, pipelines_->color_matrix_color_filter, opts);
1182 }
1183 
1185  ContentContextOptions opts) const {
1186  return GetPipeline(this, pipelines_->linear_to_srgb_filter, opts);
1187 }
1188 
1190  ContentContextOptions opts) const {
1191  return GetPipeline(this, pipelines_->srgb_to_linear_filter, opts);
1192 }
1193 
1195  return GetPipeline(this, pipelines_->clip, opts);
1196 }
1197 
1199  ContentContextOptions opts) const {
1200  return GetPipeline(this, pipelines_->glyph_atlas, opts);
1201 }
1202 
1204  ContentContextOptions opts) const {
1205  return GetPipeline(this, pipelines_->yuv_to_rgb_filter, opts);
1206 }
1207 
1209  ContentContextOptions opts) const {
1210  return GetPipeline(this, pipelines_->uber_sdf, opts);
1211 }
1212 
1214  ContentContextOptions opts) const {
1215  return GetPipeline(this, pipelines_->complex_rse, opts);
1216 }
1217 
1219  BlendMode mode,
1220  ContentContextOptions opts) const {
1221  switch (mode) {
1222  case BlendMode::kClear:
1223  return GetClearBlendPipeline(opts);
1224  case BlendMode::kSrc:
1225  return GetSourceBlendPipeline(opts);
1226  case BlendMode::kDst:
1227  return GetDestinationBlendPipeline(opts);
1228  case BlendMode::kSrcOver:
1229  return GetSourceOverBlendPipeline(opts);
1230  case BlendMode::kDstOver:
1231  return GetDestinationOverBlendPipeline(opts);
1232  case BlendMode::kSrcIn:
1233  return GetSourceInBlendPipeline(opts);
1234  case BlendMode::kDstIn:
1235  return GetDestinationInBlendPipeline(opts);
1236  case BlendMode::kSrcOut:
1237  return GetSourceOutBlendPipeline(opts);
1238  case BlendMode::kDstOut:
1239  return GetDestinationOutBlendPipeline(opts);
1240  case BlendMode::kSrcATop:
1241  return GetSourceATopBlendPipeline(opts);
1242  case BlendMode::kDstATop:
1243  return GetDestinationATopBlendPipeline(opts);
1244  case BlendMode::kXor:
1245  return GetXorBlendPipeline(opts);
1246  case BlendMode::kPlus:
1247  return GetPlusBlendPipeline(opts);
1248  case BlendMode::kModulate:
1249  return GetModulateBlendPipeline(opts);
1250  case BlendMode::kScreen:
1251  return GetScreenBlendPipeline(opts);
1252  case BlendMode::kOverlay:
1253  case BlendMode::kDarken:
1254  case BlendMode::kLighten:
1256  case BlendMode::kColorBurn:
1257  case BlendMode::kHardLight:
1258  case BlendMode::kSoftLight:
1260  case BlendMode::kExclusion:
1261  case BlendMode::kMultiply:
1262  case BlendMode::kHue:
1264  case BlendMode::kColor:
1266  VALIDATION_LOG << "Invalid porter duff blend mode "
1267  << BlendModeToString(mode);
1268  return GetClearBlendPipeline(opts);
1269  break;
1270  }
1271 }
1272 
1274  ContentContextOptions opts) const {
1275  return GetPipeline(this, pipelines_->clear_blend, opts);
1276 }
1277 
1279  ContentContextOptions opts) const {
1280  return GetPipeline(this, pipelines_->source_blend, opts);
1281 }
1282 
1284  ContentContextOptions opts) const {
1285  return GetPipeline(this, pipelines_->destination_blend, opts);
1286 }
1287 
1289  ContentContextOptions opts) const {
1290  return GetPipeline(this, pipelines_->source_over_blend, opts);
1291 }
1292 
1294  ContentContextOptions opts) const {
1295  return GetPipeline(this, pipelines_->destination_over_blend, opts);
1296 }
1297 
1299  ContentContextOptions opts) const {
1300  return GetPipeline(this, pipelines_->source_in_blend, opts);
1301 }
1302 
1304  ContentContextOptions opts) const {
1305  return GetPipeline(this, pipelines_->destination_in_blend, opts);
1306 }
1307 
1309  ContentContextOptions opts) const {
1310  return GetPipeline(this, pipelines_->source_out_blend, opts);
1311 }
1312 
1314  ContentContextOptions opts) const {
1315  return GetPipeline(this, pipelines_->destination_out_blend, opts);
1316 }
1317 
1319  ContentContextOptions opts) const {
1320  return GetPipeline(this, pipelines_->source_a_top_blend, opts);
1321 }
1322 
1324  ContentContextOptions opts) const {
1325  return GetPipeline(this, pipelines_->destination_a_top_blend, opts);
1326 }
1327 
1329  ContentContextOptions opts) const {
1330  return GetPipeline(this, pipelines_->xor_blend, opts);
1331 }
1332 
1334  ContentContextOptions opts) const {
1335  return GetPipeline(this, pipelines_->plus_blend, opts);
1336 }
1337 
1339  ContentContextOptions opts) const {
1340  return GetPipeline(this, pipelines_->modulate_blend, opts);
1341 }
1342 
1344  ContentContextOptions opts) const {
1345  return GetPipeline(this, pipelines_->screen_blend, opts);
1346 }
1347 
1349  ContentContextOptions opts) const {
1350  return GetPipeline(this, pipelines_->blend_color, opts);
1351 }
1352 
1354  ContentContextOptions opts) const {
1355  return GetPipeline(this, pipelines_->blend_colorburn, opts);
1356 }
1357 
1359  ContentContextOptions opts) const {
1360  return GetPipeline(this, pipelines_->blend_colordodge, opts);
1361 }
1362 
1364  ContentContextOptions opts) const {
1365  return GetPipeline(this, pipelines_->blend_darken, opts);
1366 }
1367 
1369  ContentContextOptions opts) const {
1370  return GetPipeline(this, pipelines_->blend_difference, opts);
1371 }
1372 
1374  ContentContextOptions opts) const {
1375  return GetPipeline(this, pipelines_->blend_exclusion, opts);
1376 }
1377 
1379  ContentContextOptions opts) const {
1380  return GetPipeline(this, pipelines_->blend_hardlight, opts);
1381 }
1382 
1384  ContentContextOptions opts) const {
1385  return GetPipeline(this, pipelines_->blend_hue, opts);
1386 }
1387 
1389  ContentContextOptions opts) const {
1390  return GetPipeline(this, pipelines_->blend_lighten, opts);
1391 }
1392 
1394  ContentContextOptions opts) const {
1395  return GetPipeline(this, pipelines_->blend_luminosity, opts);
1396 }
1397 
1399  ContentContextOptions opts) const {
1400  return GetPipeline(this, pipelines_->blend_multiply, opts);
1401 }
1402 
1404  ContentContextOptions opts) const {
1405  return GetPipeline(this, pipelines_->blend_overlay, opts);
1406 }
1407 
1409  ContentContextOptions opts) const {
1410  return GetPipeline(this, pipelines_->blend_saturation, opts);
1411 }
1412 
1414  ContentContextOptions opts) const {
1415  return GetPipeline(this, pipelines_->blend_screen, opts);
1416 }
1417 
1419  ContentContextOptions opts) const {
1420  return GetPipeline(this, pipelines_->blend_softlight, opts);
1421 }
1422 
1424  ContentContextOptions opts) const {
1425  return GetPipeline(this, pipelines_->texture_downsample, opts);
1426 }
1427 
1429  ContentContextOptions opts) const {
1430  return GetPipeline(this, pipelines_->texture_downsample_bounded, opts);
1431 }
1432 
1434  ContentContextOptions opts) const {
1435  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1436  return GetPipeline(this, pipelines_->framebuffer_blend_color, opts);
1437 }
1438 
1440  ContentContextOptions opts) const {
1441  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1442  return GetPipeline(this, pipelines_->framebuffer_blend_colorburn, opts);
1443 }
1444 
1446  ContentContextOptions opts) const {
1447  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1448  return GetPipeline(this, pipelines_->framebuffer_blend_colordodge, opts);
1449 }
1450 
1452  ContentContextOptions opts) const {
1453  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1454  return GetPipeline(this, pipelines_->framebuffer_blend_darken, opts);
1455 }
1456 
1458  ContentContextOptions opts) const {
1459  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1460  return GetPipeline(this, pipelines_->framebuffer_blend_difference, opts);
1461 }
1462 
1464  ContentContextOptions opts) const {
1465  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1466  return GetPipeline(this, pipelines_->framebuffer_blend_exclusion, opts);
1467 }
1468 
1470  ContentContextOptions opts) const {
1471  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1472  return GetPipeline(this, pipelines_->framebuffer_blend_hardlight, opts);
1473 }
1474 
1476  ContentContextOptions opts) const {
1477  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1478  return GetPipeline(this, pipelines_->framebuffer_blend_hue, opts);
1479 }
1480 
1482  ContentContextOptions opts) const {
1483  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1484  return GetPipeline(this, pipelines_->framebuffer_blend_lighten, opts);
1485 }
1486 
1488  ContentContextOptions opts) const {
1489  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1490  return GetPipeline(this, pipelines_->framebuffer_blend_luminosity, opts);
1491 }
1492 
1494  ContentContextOptions opts) const {
1495  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1496  return GetPipeline(this, pipelines_->framebuffer_blend_multiply, opts);
1497 }
1498 
1500  ContentContextOptions opts) const {
1501  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1502  return GetPipeline(this, pipelines_->framebuffer_blend_overlay, opts);
1503 }
1504 
1506  ContentContextOptions opts) const {
1507  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1508  return GetPipeline(this, pipelines_->framebuffer_blend_saturation, opts);
1509 }
1510 
1512  ContentContextOptions opts) const {
1513  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1514  return GetPipeline(this, pipelines_->framebuffer_blend_screen, opts);
1515 }
1516 
1518  ContentContextOptions opts) const {
1519  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1520  return GetPipeline(this, pipelines_->framebuffer_blend_softlight, opts);
1521 }
1522 
1524  ContentContextOptions opts) const {
1525  return GetPipeline(this, pipelines_->shadow_vertices_, opts);
1526 }
1527 
1529  BlendMode blend_mode,
1530  ContentContextOptions opts) const {
1531  if (blend_mode <= BlendMode::kHardLight) {
1532  return GetPipeline(this, pipelines_->vertices_uber_1_, opts);
1533  } else {
1534  return GetPipeline(this, pipelines_->vertices_uber_2_, opts);
1535  }
1536 }
1537 
1539  ContentContextOptions opts) const {
1540  return GetPipeline(this, pipelines_->circle, opts);
1541 }
1542 
1544  return GetPipeline(this, pipelines_->line, opts);
1545 }
1546 
1547 #ifdef IMPELLER_ENABLE_OPENGLES
1548 
1549 #if !defined(FML_OS_EMSCRIPTEN)
1550 PipelineRef ContentContext::GetTiledTextureUvExternalPipeline(
1551  ContentContextOptions opts) const {
1552  FML_DCHECK(GetContext()->GetBackendType() == Context::BackendType::kOpenGLES);
1553  return GetPipeline(this, pipelines_->tiled_texture_uv_external, opts);
1554 }
1555 
1556 PipelineRef ContentContext::GetTiledTextureExternalPipeline(
1557  ContentContextOptions opts) const {
1558  FML_DCHECK(GetContext()->GetBackendType() == Context::BackendType::kOpenGLES);
1559  return GetPipeline(this, pipelines_->tiled_texture_external, opts);
1560 }
1561 #endif
1562 
1563 PipelineRef ContentContext::GetDownsampleTextureGlesPipeline(
1564  ContentContextOptions opts) const {
1565  return GetPipeline(this, pipelines_->texture_downsample_gles, opts);
1566 }
1567 
1568 #endif // IMPELLER_ENABLE_OPENGLES
1569 
1571  is_texture_caching_enabled_ = enabled;
1572  if (!enabled) {
1573  texture_cache_.clear();
1574  }
1575 }
1576 
1577 std::shared_ptr<Texture> ContentContext::GetCachedTexture(
1578  const flutter::DlImage* image) const {
1579  if (!image) {
1580  return nullptr;
1581  }
1582  if (is_texture_caching_enabled_) {
1583  auto it = texture_cache_.find(image);
1584  if (it != texture_cache_.end()) {
1585  return it->second;
1586  }
1587  }
1588  return nullptr;
1589 }
1590 
1592  const flutter::DlImage* image,
1593  const std::shared_ptr<Texture>& texture) const {
1594  if (!image || !texture) {
1595  return;
1596  }
1597  if (is_texture_caching_enabled_) {
1598  texture_cache_[image] = texture;
1599  }
1600 }
1601 
1602 void ContentContext::RemoveCachedTexture(const flutter::DlImage* image) const {
1603  texture_cache_.erase(image);
1604 }
1605 
1607  texture_cache_.clear();
1608 }
1609 
1610 } // namespace impeller
PipelineRef GetBlendLuminosityPipeline(ContentContextOptions opts) const
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 > GetCachedTexture(const flutter::DlImage *image) const
Get a cached texture for the given image.
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 GetDownsampleBoundedPipeline(ContentContextOptions opts) const
PipelineRef GetPlusBlendPipeline(ContentContextOptions opts) const
PipelineRef GetUberSDFPipeline(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)
void ResetTransientsBuffers()
Resets the transients buffers held onto by the content context.
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 GetDrawShadowVerticesPipeline(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 GetCirclePipeline(ContentContextOptions opts) const
PipelineRef GetConicalGradientUniformFillPipeline(ContentContextOptions opts, ConicalKind kind) const
PipelineRef GetComplexRSEPipeline(ContentContextOptions opts) 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
HostBuffer & GetTransientsDataBuffer() const
Retrieve the current host buffer for transient storage of other non-index data.
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
void SetTextureCachingEnabled(bool enabled)
Enable or disable texture caching.
PipelineRef GetConicalGradientSSBOFillPipeline(ContentContextOptions opts, ConicalKind kind) const
Tessellator & GetTessellator() const
void SetCachedTexture(const flutter::DlImage *image, const std::shared_ptr< Texture > &texture) const
Set a cached texture for the given image.
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
void RemoveCachedTexture(const flutter::DlImage *image) const
Remove a cached texture for the given image.
PipelineRef GetConicalGradientFillPipeline(ContentContextOptions opts, ConicalKind kind) const
std::shared_ptr< Context > GetContext() const
void ClearCachedTextures() const
Clear all cached textures.
PipelineRef GetDestinationInBlendPipeline(ContentContextOptions opts) const
PipelineRef GetRSuperellipseBlurPipeline(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.
Definition: context.h:69
static constexpr BlendMode kLastPipelineBlendMode
Definition: entity.h:28
BufferView Emplace(const BufferType &buffer, size_t alignment=0)
Emplace non-uniform data (like contiguous vertices) onto the host buffer.
Definition: host_buffer.h:92
static std::shared_ptr< HostBuffer > Create(const std::shared_ptr< Allocator > &allocator, const std::shared_ptr< const IdleWaiter > &idle_waiter, size_t minimum_uniform_alignment)
Definition: host_buffer.cc:21
PipelineDescriptor & SetDepthStencilAttachmentDescriptor(std::optional< DepthAttachmentDescriptor > desc)
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)
std::optional< StencilAttachmentDescriptor > GetFrontStencilAttachmentDescriptor() const
An implementation of the [RenderTargetAllocator] that caches all allocated texture data for at least ...
std::shared_ptr< Texture > GetRenderTargetTexture() const
static constexpr AttachmentConfig kDefaultColorAttachmentConfig
Definition: render_target.h:55
static constexpr AttachmentConfigMSAA kDefaultColorAttachmentConfigMSAA
Definition: render_target.h:61
static constexpr AttachmentConfig kDefaultStencilAttachmentConfig
Definition: render_target.h:68
A utility that generates triangles of the specified fill type given a polyline. This happens on the C...
Definition: tessellator.h:37
A cache for blurred text that re-uses these across frames.
std::optional< PipelineDescriptor > desc_
std::vector< std::pair< uint64_t, std::unique_ptr< GenericRenderPipelineHandle > > > pipelines_
std::optional< ContentContextOptions > default_options_
int32_t x
ScopedObject< Object > Create(CtorArgs &&... args)
Definition: object.h:161
float Scalar
Definition: scalar.h:19
static std::unique_ptr< PipelineT > CreateDefaultPipeline(const Context &context)
raw_ptr< Pipeline< PipelineDescriptor > > PipelineRef
A raw ptr to a pipeline object.
Definition: pipeline.h:89
const char * BlendModeToString(BlendMode blend_mode)
Definition: color.cc:45
@ kEqual
Comparison test passes if new_value == current_value.
@ kAlways
Comparison test passes always passes.
@ 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.
Definition: texture_util.cc:37
@ kDecrementWrap
Decrement the current stencil value by 1. If at zero, set to maximum.
@ kSetToReferenceValue
Reset the stencil value to the reference value.
@ kIncrementWrap
Increment the current stencil value by 1. If at maximum, set to zero.
@ kKeep
Don't modify the current stencil value.
BlendMode
Definition: color.h:58
std::array< std::vector< Scalar >, 15 > GetPorterDuffSpecConstants(bool supports_decal)
Definition: comparable.h:93
std::shared_ptr< ContextGLES > context
std::shared_ptr< PipelineGLES > pipeline
std::shared_ptr< CommandBuffer > command_buffer
Describe the color attachment that will be used with this pipeline.
Definition: formats.h:770
std::array< uint8_t, 4 > ToR8G8B8A8() const
Convert to R8G8B8A8 representation.
Definition: color.h:246
static constexpr Color BlackTransparent()
Definition: color.h:275
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< PorterDuffBlendPipeline > clear_blend
Variants< ConicalGradientUniformFillConicalPipeline > conical_gradient_uniform_fill
Variants< FramebufferBlendMultiplyPipeline > framebuffer_blend_multiply
Variants< ComplexRSEPipeline > complex_rse
Variants< ConicalGradientSSBOFillPipeline > conical_gradient_ssbo_fill
Variants< TextureDownsamplePipeline > texture_downsample
Variants< TextureDownsampleBoundedPipeline > texture_downsample_bounded
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< ShadowVerticesShader > shadow_vertices_
Variants< CirclePipeline > circle
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< PorterDuffBlendPipeline > destination_over_blend
Variants< BlendExclusionPipeline > blend_exclusion
Variants< RSuperellipseBlurPipeline > rsuperellipse_blur
Variants< SrgbToLinearFilterPipeline > srgb_to_linear_filter
Variants< UberSDFPipeline > uber_sdf
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_
void ApplyToPipelineDescriptor(PipelineDescriptor &desc) const
@ kIgnore
Turn the stencil test off. Used when drawing without stencil-then-cover.
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 depth_stencil_pass
Definition: formats.h:881
A lightweight object that describes the attributes of a texture that can then used an allocator to cr...
#define VALIDATION_LOG
Definition: validation.h:91