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 "fml/trace_event.h"
13 #include "impeller/core/formats.h"
18 #include "impeller/entity/entity.h"
28 
29 namespace impeller {
30 
31 namespace {
32 
33 /// A generic version of `Variants` which mostly exists to reduce code size.
34 class GenericVariants {
35  public:
36  void Set(const ContentContextOptions& options,
37  std::unique_ptr<GenericRenderPipelineHandle> pipeline) {
38  uint64_t p_key = options.ToKey();
39  for (const auto& [key, pipeline] : pipelines_) {
40  if (key == p_key) {
41  return;
42  }
43  }
44  pipelines_.push_back(std::make_pair(p_key, std::move(pipeline)));
45  }
46 
47  void SetDefault(const ContentContextOptions& options,
48  std::unique_ptr<GenericRenderPipelineHandle> pipeline) {
49  default_options_ = options;
50  if (pipeline) {
51  Set(options, std::move(pipeline));
52  }
53  }
54 
55  GenericRenderPipelineHandle* Get(const ContentContextOptions& options) const {
56  uint64_t p_key = options.ToKey();
57  for (const auto& [key, pipeline] : pipelines_) {
58  if (key == p_key) {
59  return pipeline.get();
60  }
61  }
62  return nullptr;
63  }
64 
65  void SetDefaultDescriptor(std::optional<PipelineDescriptor> desc) {
66  desc_ = std::move(desc);
67  }
68 
69  size_t GetPipelineCount() const { return pipelines_.size(); }
70 
71  bool IsDefault(const ContentContextOptions& opts) {
72  return default_options_.has_value() &&
73  opts.ToKey() == default_options_.value().ToKey();
74  }
75 
76  protected:
77  std::optional<PipelineDescriptor> desc_;
78  std::optional<ContentContextOptions> default_options_;
79  std::vector<std::pair<uint64_t, std::unique_ptr<GenericRenderPipelineHandle>>>
81 };
82 
83 /// Holds multiple Pipelines associated with the same PipelineHandle types.
84 ///
85 /// For example, it may have multiple
86 /// RenderPipelineHandle<SolidFillVertexShader, SolidFillFragmentShader>
87 /// instances for different blend modes. From them you can access the
88 /// Pipeline.
89 ///
90 /// See also:
91 /// - impeller::ContentContextOptions - options from which variants are
92 /// created.
93 /// - impeller::Pipeline::CreateVariant
94 /// - impeller::RenderPipelineHandle<> - The type of objects this typically
95 /// contains.
96 template <class PipelineHandleT>
97 class Variants : public GenericVariants {
98  static_assert(
99  ShaderStageCompatibilityChecker<
100  typename PipelineHandleT::VertexShader,
101  typename PipelineHandleT::FragmentShader>::Check(),
102  "The output slots for the fragment shader don't have matches in the "
103  "vertex shader's output slots. This will result in a linker error.");
104 
105  public:
106  Variants() = default;
107 
108  void Set(const ContentContextOptions& options,
109  std::unique_ptr<PipelineHandleT> pipeline) {
110  GenericVariants::Set(options, std::move(pipeline));
111  }
112 
113  void SetDefault(const ContentContextOptions& options,
114  std::unique_ptr<PipelineHandleT> pipeline) {
115  GenericVariants::SetDefault(options, std::move(pipeline));
116  }
117 
118  void CreateDefault(const Context& context,
119  const ContentContextOptions& options,
120  const std::vector<Scalar>& constants = {}) {
121  std::optional<PipelineDescriptor> desc =
122  PipelineHandleT::Builder::MakeDefaultPipelineDescriptor(context,
123  constants);
124  if (!desc.has_value()) {
125  VALIDATION_LOG << "Failed to create default pipeline.";
126  return;
127  }
128  options.ApplyToPipelineDescriptor(*desc);
129  desc_ = desc;
130  if (context.GetFlags().lazy_shader_mode) {
131  SetDefault(options, nullptr);
132  } else {
133  SetDefault(options, std::make_unique<PipelineHandleT>(context, desc_,
134  /*async=*/true));
135  }
136  }
137 
138  PipelineHandleT* Get(const ContentContextOptions& options) const {
139  return static_cast<PipelineHandleT*>(GenericVariants::Get(options));
140  }
141 
142  PipelineHandleT* GetDefault(const Context& context) {
143  if (!default_options_.has_value()) {
144  return nullptr;
145  }
146  PipelineHandleT* result = Get(default_options_.value());
147  if (result != nullptr) {
148  return result;
149  }
150  SetDefault(default_options_.value(), std::make_unique<PipelineHandleT>(
151  context, desc_, /*async=*/false));
152  // NOLINTNEXTLINE(bugprone-unchecked-optional-access)
153  return Get(default_options_.value());
154  }
155 
156  private:
157  Variants(const Variants&) = delete;
158 
159  Variants& operator=(const Variants&) = delete;
160 };
161 
162 template <class RenderPipelineHandleT>
163 RenderPipelineHandleT* CreateIfNeeded(
164  const ContentContext* context,
165  Variants<RenderPipelineHandleT>& container,
166  ContentContextOptions opts) {
167  if (!context->IsValid()) {
168  return nullptr;
169  }
170 
171  if (RenderPipelineHandleT* found = container.Get(opts)) {
172  return found;
173  }
174 
175  RenderPipelineHandleT* default_handle =
176  container.GetDefault(*context->GetContext());
177  if (container.IsDefault(opts)) {
178  return default_handle;
179  }
180 
181  // The default must always be initialized in the constructor.
182  FML_CHECK(default_handle != nullptr);
183 
184  const std::shared_ptr<Pipeline<PipelineDescriptor>>& pipeline =
185  default_handle->WaitAndGet();
186  if (!pipeline) {
187  return nullptr;
188  }
189 
190  auto variant_future = pipeline->CreateVariant(
191  /*async=*/false, [&opts, variants_count = container.GetPipelineCount()](
192  PipelineDescriptor& desc) {
193  opts.ApplyToPipelineDescriptor(desc);
194  desc.SetLabel(std::format("{} V#{}", desc.GetLabel(), variants_count));
195  });
196  std::unique_ptr<RenderPipelineHandleT> variant =
197  std::make_unique<RenderPipelineHandleT>(std::move(variant_future));
198  container.Set(opts, std::move(variant));
199  return container.Get(opts);
200 }
201 
202 template <class TypedPipeline>
203 PipelineRef GetPipeline(const ContentContext* context,
204  Variants<TypedPipeline>& container,
205  ContentContextOptions opts) {
206  TypedPipeline* pipeline = CreateIfNeeded(context, container, opts);
207  if (!pipeline) {
208  return raw_ptr<Pipeline<PipelineDescriptor>>();
209  }
210  return raw_ptr(pipeline->WaitAndGet());
211 }
212 
213 } // namespace
214 
216  // clang-format off
217  Variants<BlendColorBurnPipeline> blend_colorburn;
218  Variants<BlendColorDodgePipeline> blend_colordodge;
219  Variants<BlendColorPipeline> blend_color;
220  Variants<BlendDarkenPipeline> blend_darken;
221  Variants<BlendDifferencePipeline> blend_difference;
222  Variants<BlendExclusionPipeline> blend_exclusion;
223  Variants<BlendHardLightPipeline> blend_hardlight;
224  Variants<BlendHuePipeline> blend_hue;
225  Variants<BlendLightenPipeline> blend_lighten;
226  Variants<BlendLuminosityPipeline> blend_luminosity;
227  Variants<BlendMultiplyPipeline> blend_multiply;
228  Variants<BlendOverlayPipeline> blend_overlay;
229  Variants<BlendSaturationPipeline> blend_saturation;
230  Variants<BlendScreenPipeline> blend_screen;
231  Variants<BlendSoftLightPipeline> blend_softlight;
232  Variants<BorderMaskBlurPipeline> border_mask_blur;
233  Variants<CirclePipeline> circle;
234  Variants<ClipPipeline> clip;
235  Variants<ColorMatrixColorFilterPipeline> color_matrix_color_filter;
236  Variants<ConicalGradientFillConicalPipeline> conical_gradient_fill;
237  Variants<ConicalGradientFillRadialPipeline> conical_gradient_fill_radial;
238  Variants<ConicalGradientFillStripPipeline> conical_gradient_fill_strip;
239  Variants<ConicalGradientFillStripRadialPipeline> conical_gradient_fill_strip_and_radial;
240  Variants<ConicalGradientSSBOFillPipeline> conical_gradient_ssbo_fill;
241  Variants<ConicalGradientSSBOFillPipeline> conical_gradient_ssbo_fill_radial;
242  Variants<ConicalGradientSSBOFillPipeline> conical_gradient_ssbo_fill_strip_and_radial;
243  Variants<ConicalGradientSSBOFillPipeline> conical_gradient_ssbo_fill_strip;
244  Variants<ConicalGradientUniformFillConicalPipeline> conical_gradient_uniform_fill;
245  Variants<ConicalGradientUniformFillRadialPipeline> conical_gradient_uniform_fill_radial;
246  Variants<ConicalGradientUniformFillStripPipeline> conical_gradient_uniform_fill_strip;
247  Variants<ConicalGradientUniformFillStripRadialPipeline> conical_gradient_uniform_fill_strip_and_radial;
248  Variants<FastGradientPipeline> fast_gradient;
249  Variants<FramebufferBlendColorBurnPipeline> framebuffer_blend_colorburn;
250  Variants<FramebufferBlendColorDodgePipeline> framebuffer_blend_colordodge;
251  Variants<FramebufferBlendColorPipeline> framebuffer_blend_color;
252  Variants<FramebufferBlendDarkenPipeline> framebuffer_blend_darken;
253  Variants<FramebufferBlendDifferencePipeline> framebuffer_blend_difference;
254  Variants<FramebufferBlendExclusionPipeline> framebuffer_blend_exclusion;
255  Variants<FramebufferBlendHardLightPipeline> framebuffer_blend_hardlight;
256  Variants<FramebufferBlendHuePipeline> framebuffer_blend_hue;
257  Variants<FramebufferBlendLightenPipeline> framebuffer_blend_lighten;
258  Variants<FramebufferBlendLuminosityPipeline> framebuffer_blend_luminosity;
259  Variants<FramebufferBlendMultiplyPipeline> framebuffer_blend_multiply;
260  Variants<FramebufferBlendOverlayPipeline> framebuffer_blend_overlay;
261  Variants<FramebufferBlendSaturationPipeline> framebuffer_blend_saturation;
262  Variants<FramebufferBlendScreenPipeline> framebuffer_blend_screen;
263  Variants<FramebufferBlendSoftLightPipeline> framebuffer_blend_softlight;
264  Variants<GaussianBlurPipeline> gaussian_blur;
265  Variants<GlyphAtlasPipeline> glyph_atlas;
266  Variants<LinePipeline> line;
267  Variants<LinearGradientFillPipeline> linear_gradient_fill;
268  Variants<LinearGradientSSBOFillPipeline> linear_gradient_ssbo_fill;
269  Variants<LinearGradientUniformFillPipeline> linear_gradient_uniform_fill;
270  Variants<LinearToSrgbFilterPipeline> linear_to_srgb_filter;
271  Variants<MorphologyFilterPipeline> morphology_filter;
272  Variants<PorterDuffBlendPipeline> clear_blend;
273  Variants<PorterDuffBlendPipeline> destination_a_top_blend;
274  Variants<PorterDuffBlendPipeline> destination_blend;
275  Variants<PorterDuffBlendPipeline> destination_in_blend;
276  Variants<PorterDuffBlendPipeline> destination_out_blend;
277  Variants<PorterDuffBlendPipeline> destination_over_blend;
278  Variants<PorterDuffBlendPipeline> modulate_blend;
279  Variants<PorterDuffBlendPipeline> plus_blend;
280  Variants<PorterDuffBlendPipeline> screen_blend;
281  Variants<PorterDuffBlendPipeline> source_a_top_blend;
282  Variants<PorterDuffBlendPipeline> source_blend;
283  Variants<PorterDuffBlendPipeline> source_in_blend;
284  Variants<PorterDuffBlendPipeline> source_out_blend;
285  Variants<PorterDuffBlendPipeline> source_over_blend;
286  Variants<PorterDuffBlendPipeline> xor_blend;
287  Variants<RadialGradientFillPipeline> radial_gradient_fill;
288  Variants<RadialGradientSSBOFillPipeline> radial_gradient_ssbo_fill;
289  Variants<RadialGradientUniformFillPipeline> radial_gradient_uniform_fill;
290  Variants<RRectBlurPipeline> rrect_blur;
291  Variants<RSuperellipseBlurPipeline> rsuperellipse_blur;
292  Variants<SolidFillPipeline> solid_fill;
293  Variants<SrgbToLinearFilterPipeline> srgb_to_linear_filter;
294  Variants<SweepGradientFillPipeline> sweep_gradient_fill;
295  Variants<SweepGradientSSBOFillPipeline> sweep_gradient_ssbo_fill;
296  Variants<SweepGradientUniformFillPipeline> sweep_gradient_uniform_fill;
297  Variants<TextureDownsamplePipeline> texture_downsample;
298  Variants<TexturePipeline> texture;
299  Variants<TextureStrictSrcPipeline> texture_strict_src;
300  Variants<TiledTexturePipeline> tiled_texture;
301  Variants<VerticesUber1Shader> vertices_uber_1_;
302  Variants<VerticesUber2Shader> vertices_uber_2_;
303  Variants<YUVToRGBFilterPipeline> yuv_to_rgb_filter;
304 
305 #ifdef IMPELLER_ENABLE_OPENGLES
306  Variants<TiledTextureExternalPipeline> tiled_texture_external;
307  Variants<TextureDownsampleGlesPipeline> texture_downsample_gles;
308  Variants<TiledTextureUvExternalPipeline> tiled_texture_uv_external;
309 #endif // IMPELLER_ENABLE_OPENGLES
310  // clang-format on
311 };
312 
314  PipelineDescriptor& desc) const {
315  auto pipeline_blend = blend_mode;
317  VALIDATION_LOG << "Cannot use blend mode " << static_cast<int>(blend_mode)
318  << " as a pipeline blend.";
319  pipeline_blend = BlendMode::kSrcOver;
320  }
321 
323 
329 
330  switch (pipeline_blend) {
331  case BlendMode::kClear:
339  } else {
344  }
345  break;
346  case BlendMode::kSrc:
347  color0.blending_enabled = false;
352  break;
353  case BlendMode::kDst:
359  break;
360  case BlendMode::kSrcOver:
365  break;
366  case BlendMode::kDstOver:
371  break;
372  case BlendMode::kSrcIn:
377  break;
378  case BlendMode::kDstIn:
383  break;
384  case BlendMode::kSrcOut:
389  break;
390  case BlendMode::kDstOut:
395  break;
396  case BlendMode::kSrcATop:
401  break;
402  case BlendMode::kDstATop:
407  break;
408  case BlendMode::kXor:
413  break;
414  case BlendMode::kPlus:
419  break;
425  break;
426  default:
427  FML_UNREACHABLE();
428  }
429  desc.SetColorAttachmentDescriptor(0u, color0);
430 
432  desc.ClearDepthAttachment();
434  }
435 
436  auto maybe_stencil = desc.GetFrontStencilAttachmentDescriptor();
437  auto maybe_depth = desc.GetDepthStencilAttachmentDescriptor();
438  FML_DCHECK(has_depth_stencil_attachments == maybe_depth.has_value())
439  << "Depth attachment doesn't match expected pipeline state. "
440  "has_depth_stencil_attachments="
442  FML_DCHECK(has_depth_stencil_attachments == maybe_stencil.has_value())
443  << "Stencil attachment doesn't match expected pipeline state. "
444  "has_depth_stencil_attachments="
446  if (maybe_stencil.has_value()) {
447  StencilAttachmentDescriptor front_stencil = maybe_stencil.value();
448  StencilAttachmentDescriptor back_stencil = front_stencil;
449 
450  switch (stencil_mode) {
454  desc.SetStencilAttachmentDescriptors(front_stencil);
455  break;
457  // The stencil ref should be 0 on commands that use this mode.
462  desc.SetStencilAttachmentDescriptors(front_stencil, back_stencil);
463  break;
465  // The stencil ref should be 0 on commands that use this mode.
469  desc.SetStencilAttachmentDescriptors(front_stencil);
470  break;
472  // The stencil ref should be 0 on commands that use this mode.
474  front_stencil.depth_stencil_pass =
476  desc.SetStencilAttachmentDescriptors(front_stencil);
477  break;
479  // The stencil ref should be 0 on commands that use this mode.
482  desc.SetStencilAttachmentDescriptors(front_stencil);
483  break;
487  desc.SetStencilAttachmentDescriptors(front_stencil);
488  break;
490  front_stencil.stencil_compare = CompareFunction::kLess;
491  front_stencil.depth_stencil_pass =
493  desc.SetStencilAttachmentDescriptors(front_stencil);
494  break;
495  }
496  }
497  if (maybe_depth.has_value()) {
498  DepthAttachmentDescriptor depth = maybe_depth.value();
502  }
503 
506 }
507 
508 std::array<std::vector<Scalar>, 15> GetPorterDuffSpecConstants(
509  bool supports_decal) {
510  Scalar x = supports_decal ? 1 : 0;
511  return {{
512  {x, 0, 0, 0, 0, 0}, // Clear
513  {x, 1, 0, 0, 0, 0}, // Source
514  {x, 0, 0, 1, 0, 0}, // Destination
515  {x, 1, 0, 1, -1, 0}, // SourceOver
516  {x, 1, -1, 1, 0, 0}, // DestinationOver
517  {x, 0, 1, 0, 0, 0}, // SourceIn
518  {x, 0, 0, 0, 1, 0}, // DestinationIn
519  {x, 1, -1, 0, 0, 0}, // SourceOut
520  {x, 0, 0, 1, -1, 0}, // DestinationOut
521  {x, 0, 1, 1, -1, 0}, // SourceATop
522  {x, 1, -1, 0, 1, 0}, // DestinationATop
523  {x, 1, -1, 1, -1, 0}, // Xor
524  {x, 1, 0, 1, 0, 0}, // Plus
525  {x, 0, 0, 0, 0, 1}, // Modulate
526  {x, 0, 0, 1, 0, -1}, // Screen
527  }};
528 }
529 
530 template <typename PipelineT>
531 static std::unique_ptr<PipelineT> CreateDefaultPipeline(
532  const Context& context) {
533  auto desc = PipelineT::Builder::MakeDefaultPipelineDescriptor(context);
534  if (!desc.has_value()) {
535  return nullptr;
536  }
537  // Apply default ContentContextOptions to the descriptor.
538  const auto default_color_format =
539  context.GetCapabilities()->GetDefaultColorFormat();
541  .primitive_type = PrimitiveType::kTriangleStrip,
542  .color_attachment_pixel_format = default_color_format}
543  .ApplyToPipelineDescriptor(*desc);
544  return std::make_unique<PipelineT>(context, desc);
545 }
546 
548  std::shared_ptr<Context> context,
549  std::shared_ptr<TypographerContext> typographer_context,
550  std::shared_ptr<RenderTargetAllocator> render_target_allocator)
551  : context_(std::move(context)),
552  lazy_glyph_atlas_(
553  std::make_shared<LazyGlyphAtlas>(std::move(typographer_context))),
554  pipelines_(new Pipelines()),
555  tessellator_(std::make_shared<Tessellator>()),
556  render_target_cache_(render_target_allocator == nullptr
557  ? std::make_shared<RenderTargetCache>(
558  context_->GetResourceAllocator())
559  : std::move(render_target_allocator)),
560  data_host_buffer_(HostBuffer::Create(
561  context_->GetResourceAllocator(),
562  context_->GetIdleWaiter(),
563  context_->GetCapabilities()->GetMinimumUniformAlignment())),
564  text_shadow_cache_(std::make_unique<TextShadowCache>()) {
565  if (!context_ || !context_->IsValid()) {
566  return;
567  }
568 
569  // On most backends, indexes and other data can be allocated into the same
570  // buffers. However, some backends (namely WebGL) require indexes used in
571  // indexed draws to be allocated separately from other data. For those
572  // backends, we allocate a separate host buffer just for indexes.
573  indexes_host_buffer_ =
574  context_->GetCapabilities()->NeedsPartitionedHostBuffer()
576  context_->GetResourceAllocator(), context_->GetIdleWaiter(),
577  context_->GetCapabilities()->GetMinimumUniformAlignment())
578  : data_host_buffer_;
579  {
580  TextureDescriptor desc;
583  desc.size = ISize{1, 1};
584  empty_texture_ = GetContext()->GetResourceAllocator()->CreateTexture(desc);
585 
586  std::array<uint8_t, 4> data = Color::BlackTransparent().ToR8G8B8A8();
587  std::shared_ptr<CommandBuffer> cmd_buffer =
588  GetContext()->CreateCommandBuffer();
589  std::shared_ptr<BlitPass> blit_pass = cmd_buffer->CreateBlitPass();
590  HostBuffer& data_host_buffer = GetTransientsDataBuffer();
591  BufferView buffer_view = data_host_buffer.Emplace(data);
592  blit_pass->AddCopy(buffer_view, empty_texture_);
593 
594  if (!blit_pass->EncodeCommands() || !GetContext()
595  ->GetCommandQueue()
596  ->Submit({std::move(cmd_buffer)})
597  .ok()) {
598  VALIDATION_LOG << "Failed to create empty texture.";
599  }
600  }
601 
602  auto options = ContentContextOptions{
604  .color_attachment_pixel_format =
605  context_->GetCapabilities()->GetDefaultColorFormat()};
606  auto options_trianglestrip = ContentContextOptions{
608  .primitive_type = PrimitiveType::kTriangleStrip,
609  .color_attachment_pixel_format =
610  context_->GetCapabilities()->GetDefaultColorFormat()};
611  auto options_no_msaa_no_depth_stencil = ContentContextOptions{
613  .primitive_type = PrimitiveType::kTriangleStrip,
614  .color_attachment_pixel_format =
615  context_->GetCapabilities()->GetDefaultColorFormat(),
616  .has_depth_stencil_attachments = false};
617  const auto supports_decal = static_cast<Scalar>(
618  context_->GetCapabilities()->SupportsDecalSamplerAddressMode());
619 
620  // Futures for the following pipelines may block in case the first frame is
621  // rendered without the pipelines being ready. Put pipelines that are more
622  // likely to be used first.
623  {
624  pipelines_->glyph_atlas.CreateDefault(
625  *context_, options,
626  {static_cast<Scalar>(
627  GetContext()->GetCapabilities()->GetDefaultGlyphAtlasFormat() ==
629  pipelines_->solid_fill.CreateDefault(*context_, options);
630  pipelines_->texture.CreateDefault(*context_, options);
631  pipelines_->fast_gradient.CreateDefault(*context_, options);
632  pipelines_->line.CreateDefault(*context_, options);
633  pipelines_->circle.CreateDefault(*context_, options);
634 
635  if (context_->GetCapabilities()->SupportsSSBO()) {
636  pipelines_->linear_gradient_ssbo_fill.CreateDefault(*context_, options);
637  pipelines_->radial_gradient_ssbo_fill.CreateDefault(*context_, options);
638  pipelines_->conical_gradient_ssbo_fill.CreateDefault(*context_, options,
639  {3.0});
640  pipelines_->conical_gradient_ssbo_fill_radial.CreateDefault(
641  *context_, options, {1.0});
642  pipelines_->conical_gradient_ssbo_fill_strip.CreateDefault(
643  *context_, options, {2.0});
644  pipelines_->conical_gradient_ssbo_fill_strip_and_radial.CreateDefault(
645  *context_, options, {0.0});
646  pipelines_->sweep_gradient_ssbo_fill.CreateDefault(*context_, options);
647  } else {
648  pipelines_->linear_gradient_uniform_fill.CreateDefault(*context_,
649  options);
650  pipelines_->radial_gradient_uniform_fill.CreateDefault(*context_,
651  options);
652  pipelines_->conical_gradient_uniform_fill.CreateDefault(*context_,
653  options);
654  pipelines_->conical_gradient_uniform_fill_radial.CreateDefault(*context_,
655  options);
656  pipelines_->conical_gradient_uniform_fill_strip.CreateDefault(*context_,
657  options);
658  pipelines_->conical_gradient_uniform_fill_strip_and_radial.CreateDefault(
659  *context_, options);
660  pipelines_->sweep_gradient_uniform_fill.CreateDefault(*context_, options);
661 
662  pipelines_->linear_gradient_fill.CreateDefault(*context_, options);
663  pipelines_->radial_gradient_fill.CreateDefault(*context_, options);
664  pipelines_->conical_gradient_fill.CreateDefault(*context_, options);
665  pipelines_->conical_gradient_fill_radial.CreateDefault(*context_,
666  options);
667  pipelines_->conical_gradient_fill_strip.CreateDefault(*context_, options);
668  pipelines_->conical_gradient_fill_strip_and_radial.CreateDefault(
669  *context_, options);
670  pipelines_->sweep_gradient_fill.CreateDefault(*context_, options);
671  }
672 
673  /// Setup default clip pipeline.
674  auto clip_pipeline_descriptor =
676  if (!clip_pipeline_descriptor.has_value()) {
677  return;
678  }
681  .color_attachment_pixel_format =
682  context_->GetCapabilities()->GetDefaultColorFormat()}
683  .ApplyToPipelineDescriptor(*clip_pipeline_descriptor);
684  // Disable write to all color attachments.
685  auto clip_color_attachments =
686  clip_pipeline_descriptor->GetColorAttachmentDescriptors();
687  for (auto& color_attachment : clip_color_attachments) {
688  color_attachment.second.write_mask = ColorWriteMaskBits::kNone;
689  }
690  clip_pipeline_descriptor->SetColorAttachmentDescriptors(
691  std::move(clip_color_attachments));
692  if (GetContext()->GetFlags().lazy_shader_mode) {
693  pipelines_->clip.SetDefaultDescriptor(clip_pipeline_descriptor);
694  pipelines_->clip.SetDefault(options, nullptr);
695  } else {
696  pipelines_->clip.SetDefault(
697  options,
698  std::make_unique<ClipPipeline>(*context_, clip_pipeline_descriptor));
699  }
700  pipelines_->texture_downsample.CreateDefault(
701  *context_, options_no_msaa_no_depth_stencil);
702  pipelines_->rrect_blur.CreateDefault(*context_, options_trianglestrip);
703  pipelines_->rsuperellipse_blur.CreateDefault(*context_,
704  options_trianglestrip);
705  pipelines_->texture_strict_src.CreateDefault(*context_, options);
706  pipelines_->tiled_texture.CreateDefault(*context_, options,
707  {supports_decal});
708  pipelines_->gaussian_blur.CreateDefault(
709  *context_, options_no_msaa_no_depth_stencil, {supports_decal});
710  pipelines_->border_mask_blur.CreateDefault(*context_,
711  options_trianglestrip);
712  pipelines_->color_matrix_color_filter.CreateDefault(*context_,
713  options_trianglestrip);
714  pipelines_->vertices_uber_1_.CreateDefault(*context_, options,
715  {supports_decal});
716  pipelines_->vertices_uber_2_.CreateDefault(*context_, options,
717  {supports_decal});
718 
719  const std::array<std::vector<Scalar>, 15> porter_duff_constants =
720  GetPorterDuffSpecConstants(supports_decal);
721  pipelines_->clear_blend.CreateDefault(*context_, options_trianglestrip,
722  porter_duff_constants[0]);
723  pipelines_->source_blend.CreateDefault(*context_, options_trianglestrip,
724  porter_duff_constants[1]);
725  pipelines_->destination_blend.CreateDefault(
726  *context_, options_trianglestrip, porter_duff_constants[2]);
727  pipelines_->source_over_blend.CreateDefault(
728  *context_, options_trianglestrip, porter_duff_constants[3]);
729  pipelines_->destination_over_blend.CreateDefault(
730  *context_, options_trianglestrip, porter_duff_constants[4]);
731  pipelines_->source_in_blend.CreateDefault(*context_, options_trianglestrip,
732  porter_duff_constants[5]);
733  pipelines_->destination_in_blend.CreateDefault(
734  *context_, options_trianglestrip, porter_duff_constants[6]);
735  pipelines_->source_out_blend.CreateDefault(*context_, options_trianglestrip,
736  porter_duff_constants[7]);
737  pipelines_->destination_out_blend.CreateDefault(
738  *context_, options_trianglestrip, porter_duff_constants[8]);
739  pipelines_->source_a_top_blend.CreateDefault(
740  *context_, options_trianglestrip, porter_duff_constants[9]);
741  pipelines_->destination_a_top_blend.CreateDefault(
742  *context_, options_trianglestrip, porter_duff_constants[10]);
743  pipelines_->xor_blend.CreateDefault(*context_, options_trianglestrip,
744  porter_duff_constants[11]);
745  pipelines_->plus_blend.CreateDefault(*context_, options_trianglestrip,
746  porter_duff_constants[12]);
747  pipelines_->modulate_blend.CreateDefault(*context_, options_trianglestrip,
748  porter_duff_constants[13]);
749  pipelines_->screen_blend.CreateDefault(*context_, options_trianglestrip,
750  porter_duff_constants[14]);
751  }
752 
753  if (context_->GetCapabilities()->SupportsFramebufferFetch()) {
754  pipelines_->framebuffer_blend_color.CreateDefault(
755  *context_, options_trianglestrip,
756  {static_cast<Scalar>(BlendSelectValues::kColor), supports_decal});
757  pipelines_->framebuffer_blend_colorburn.CreateDefault(
758  *context_, options_trianglestrip,
759  {static_cast<Scalar>(BlendSelectValues::kColorBurn), supports_decal});
760  pipelines_->framebuffer_blend_colordodge.CreateDefault(
761  *context_, options_trianglestrip,
762  {static_cast<Scalar>(BlendSelectValues::kColorDodge), supports_decal});
763  pipelines_->framebuffer_blend_darken.CreateDefault(
764  *context_, options_trianglestrip,
765  {static_cast<Scalar>(BlendSelectValues::kDarken), supports_decal});
766  pipelines_->framebuffer_blend_difference.CreateDefault(
767  *context_, options_trianglestrip,
768  {static_cast<Scalar>(BlendSelectValues::kDifference), supports_decal});
769  pipelines_->framebuffer_blend_exclusion.CreateDefault(
770  *context_, options_trianglestrip,
771  {static_cast<Scalar>(BlendSelectValues::kExclusion), supports_decal});
772  pipelines_->framebuffer_blend_hardlight.CreateDefault(
773  *context_, options_trianglestrip,
774  {static_cast<Scalar>(BlendSelectValues::kHardLight), supports_decal});
775  pipelines_->framebuffer_blend_hue.CreateDefault(
776  *context_, options_trianglestrip,
777  {static_cast<Scalar>(BlendSelectValues::kHue), supports_decal});
778  pipelines_->framebuffer_blend_lighten.CreateDefault(
779  *context_, options_trianglestrip,
780  {static_cast<Scalar>(BlendSelectValues::kLighten), supports_decal});
781  pipelines_->framebuffer_blend_luminosity.CreateDefault(
782  *context_, options_trianglestrip,
783  {static_cast<Scalar>(BlendSelectValues::kLuminosity), supports_decal});
784  pipelines_->framebuffer_blend_multiply.CreateDefault(
785  *context_, options_trianglestrip,
786  {static_cast<Scalar>(BlendSelectValues::kMultiply), supports_decal});
787  pipelines_->framebuffer_blend_overlay.CreateDefault(
788  *context_, options_trianglestrip,
789  {static_cast<Scalar>(BlendSelectValues::kOverlay), supports_decal});
790  pipelines_->framebuffer_blend_saturation.CreateDefault(
791  *context_, options_trianglestrip,
792  {static_cast<Scalar>(BlendSelectValues::kSaturation), supports_decal});
793  pipelines_->framebuffer_blend_screen.CreateDefault(
794  *context_, options_trianglestrip,
795  {static_cast<Scalar>(BlendSelectValues::kScreen), supports_decal});
796  pipelines_->framebuffer_blend_softlight.CreateDefault(
797  *context_, options_trianglestrip,
798  {static_cast<Scalar>(BlendSelectValues::kSoftLight), supports_decal});
799  } else {
800  pipelines_->blend_color.CreateDefault(
801  *context_, options_trianglestrip,
802  {static_cast<Scalar>(BlendSelectValues::kColor), supports_decal});
803  pipelines_->blend_colorburn.CreateDefault(
804  *context_, options_trianglestrip,
805  {static_cast<Scalar>(BlendSelectValues::kColorBurn), supports_decal});
806  pipelines_->blend_colordodge.CreateDefault(
807  *context_, options_trianglestrip,
808  {static_cast<Scalar>(BlendSelectValues::kColorDodge), supports_decal});
809  pipelines_->blend_darken.CreateDefault(
810  *context_, options_trianglestrip,
811  {static_cast<Scalar>(BlendSelectValues::kDarken), supports_decal});
812  pipelines_->blend_difference.CreateDefault(
813  *context_, options_trianglestrip,
814  {static_cast<Scalar>(BlendSelectValues::kDifference), supports_decal});
815  pipelines_->blend_exclusion.CreateDefault(
816  *context_, options_trianglestrip,
817  {static_cast<Scalar>(BlendSelectValues::kExclusion), supports_decal});
818  pipelines_->blend_hardlight.CreateDefault(
819  *context_, options_trianglestrip,
820  {static_cast<Scalar>(BlendSelectValues::kHardLight), supports_decal});
821  pipelines_->blend_hue.CreateDefault(
822  *context_, options_trianglestrip,
823  {static_cast<Scalar>(BlendSelectValues::kHue), supports_decal});
824  pipelines_->blend_lighten.CreateDefault(
825  *context_, options_trianglestrip,
826  {static_cast<Scalar>(BlendSelectValues::kLighten), supports_decal});
827  pipelines_->blend_luminosity.CreateDefault(
828  *context_, options_trianglestrip,
829  {static_cast<Scalar>(BlendSelectValues::kLuminosity), supports_decal});
830  pipelines_->blend_multiply.CreateDefault(
831  *context_, options_trianglestrip,
832  {static_cast<Scalar>(BlendSelectValues::kMultiply), supports_decal});
833  pipelines_->blend_overlay.CreateDefault(
834  *context_, options_trianglestrip,
835  {static_cast<Scalar>(BlendSelectValues::kOverlay), supports_decal});
836  pipelines_->blend_saturation.CreateDefault(
837  *context_, options_trianglestrip,
838  {static_cast<Scalar>(BlendSelectValues::kSaturation), supports_decal});
839  pipelines_->blend_screen.CreateDefault(
840  *context_, options_trianglestrip,
841  {static_cast<Scalar>(BlendSelectValues::kScreen), supports_decal});
842  pipelines_->blend_softlight.CreateDefault(
843  *context_, options_trianglestrip,
844  {static_cast<Scalar>(BlendSelectValues::kSoftLight), supports_decal});
845  }
846 
847  pipelines_->morphology_filter.CreateDefault(*context_, options_trianglestrip,
848  {supports_decal});
849  pipelines_->linear_to_srgb_filter.CreateDefault(*context_,
850  options_trianglestrip);
851  pipelines_->srgb_to_linear_filter.CreateDefault(*context_,
852  options_trianglestrip);
853  pipelines_->yuv_to_rgb_filter.CreateDefault(*context_, options_trianglestrip);
854 
855 #if defined(IMPELLER_ENABLE_OPENGLES)
856  if (GetContext()->GetBackendType() == Context::BackendType::kOpenGLES) {
857 #if !defined(FML_OS_MACOSX)
858  // GLES only shader that is unsupported on macOS.
859  pipelines_->tiled_texture_external.CreateDefault(*context_, options);
860  pipelines_->tiled_texture_uv_external.CreateDefault(*context_, options);
861 #endif // !defined(FML_OS_MACOSX)
862  pipelines_->texture_downsample_gles.CreateDefault(*context_,
863  options_trianglestrip);
864  }
865 #endif // IMPELLER_ENABLE_OPENGLES
866 
867  is_valid_ = true;
868  InitializeCommonlyUsedShadersIfNeeded();
869 }
870 
872 
874  return is_valid_;
875 }
876 
877 std::shared_ptr<Texture> ContentContext::GetEmptyTexture() const {
878  return empty_texture_;
879 }
880 
881 fml::StatusOr<RenderTarget> ContentContext::MakeSubpass(
882  std::string_view label,
883  ISize texture_size,
884  const std::shared_ptr<CommandBuffer>& command_buffer,
885  const SubpassCallback& subpass_callback,
886  bool msaa_enabled,
887  bool depth_stencil_enabled,
888  int32_t mip_count) const {
889  const std::shared_ptr<Context>& context = GetContext();
890  RenderTarget subpass_target;
891 
892  std::optional<RenderTarget::AttachmentConfig> depth_stencil_config =
893  depth_stencil_enabled ? RenderTarget::kDefaultStencilAttachmentConfig
894  : std::optional<RenderTarget::AttachmentConfig>();
895 
896  if (context->GetCapabilities()->SupportsOffscreenMSAA() && msaa_enabled) {
897  subpass_target = GetRenderTargetCache()->CreateOffscreenMSAA(
898  *context, texture_size,
899  /*mip_count=*/mip_count, label,
901  } else {
902  subpass_target = GetRenderTargetCache()->CreateOffscreen(
903  *context, texture_size,
904  /*mip_count=*/mip_count, label,
905  RenderTarget::kDefaultColorAttachmentConfig, depth_stencil_config);
906  }
907  return MakeSubpass(label, subpass_target, command_buffer, subpass_callback);
908 }
909 
910 fml::StatusOr<RenderTarget> ContentContext::MakeSubpass(
911  std::string_view label,
912  const RenderTarget& subpass_target,
913  const std::shared_ptr<CommandBuffer>& command_buffer,
914  const SubpassCallback& subpass_callback) const {
915  const std::shared_ptr<Context>& context = GetContext();
916 
917  auto subpass_texture = subpass_target.GetRenderTargetTexture();
918  if (!subpass_texture) {
919  return fml::Status(fml::StatusCode::kUnknown, "");
920  }
921 
922  auto sub_renderpass = command_buffer->CreateRenderPass(subpass_target);
923  if (!sub_renderpass) {
924  return fml::Status(fml::StatusCode::kUnknown, "");
925  }
926  sub_renderpass->SetLabel(label);
927 
928  if (!subpass_callback(*this, *sub_renderpass)) {
929  return fml::Status(fml::StatusCode::kUnknown, "");
930  }
931 
932  if (!sub_renderpass->EncodeCommands()) {
933  return fml::Status(fml::StatusCode::kUnknown, "");
934  }
935 
936  const std::shared_ptr<Texture>& target_texture =
937  subpass_target.GetRenderTargetTexture();
938  if (target_texture->GetMipCount() > 1) {
939  fml::Status mipmap_status =
940  AddMipmapGeneration(command_buffer, context, target_texture);
941  if (!mipmap_status.ok()) {
942  return mipmap_status;
943  }
944  }
945 
946  return subpass_target;
947 }
948 
950  return *tessellator_;
951 }
952 
953 std::shared_ptr<Context> ContentContext::GetContext() const {
954  return context_;
955 }
956 
958  return *context_->GetCapabilities();
959 }
960 
962  const std::string& unique_entrypoint_name,
963  const ContentContextOptions& options,
964  const std::function<std::shared_ptr<Pipeline<PipelineDescriptor>>()>&
965  create_callback) const {
966  RuntimeEffectPipelineKey key{unique_entrypoint_name, options};
967  auto it = runtime_effect_pipelines_.find(key);
968  if (it == runtime_effect_pipelines_.end()) {
969  it = runtime_effect_pipelines_.insert(it, {key, create_callback()});
970  }
971  return raw_ptr(it->second);
972 }
973 
975  const std::string& unique_entrypoint_name) const {
976 #ifdef IMPELLER_DEBUG
977  // destroying in-use pipleines is a validation error.
978  const auto& idle_waiter = GetContext()->GetIdleWaiter();
979  if (idle_waiter) {
980  idle_waiter->WaitIdle();
981  }
982 #endif // IMPELLER_DEBUG
983  for (auto it = runtime_effect_pipelines_.begin();
984  it != runtime_effect_pipelines_.end();) {
985  if (it->first.unique_entrypoint_name == unique_entrypoint_name) {
986  it = runtime_effect_pipelines_.erase(it);
987  } else {
988  it++;
989  }
990  }
991 }
992 
994  data_host_buffer_->Reset();
995 
996  // We should only reset the indexes host buffer if it is actually different
997  // from the data host buffer. Otherwise we'll end up resetting the same host
998  // buffer twice.
999  if (data_host_buffer_ != indexes_host_buffer_) {
1000  indexes_host_buffer_->Reset();
1001  }
1002 }
1003 
1004 void ContentContext::InitializeCommonlyUsedShadersIfNeeded() const {
1005  if (GetContext()->GetFlags().lazy_shader_mode) {
1006  return;
1007  }
1008  GetContext()->InitializeCommonlyUsedShadersIfNeeded();
1009 }
1010 
1012  ContentContextOptions opts) const {
1013  return GetPipeline(this, pipelines_->fast_gradient, opts);
1014 }
1015 
1017  ContentContextOptions opts) const {
1018  return GetPipeline(this, pipelines_->linear_gradient_fill, opts);
1019 }
1020 
1022  ContentContextOptions opts) const {
1023  return GetPipeline(this, pipelines_->linear_gradient_uniform_fill, opts);
1024 }
1025 
1027  ContentContextOptions opts) const {
1028  return GetPipeline(this, pipelines_->radial_gradient_uniform_fill, opts);
1029 }
1030 
1032  ContentContextOptions opts) const {
1033  return GetPipeline(this, pipelines_->sweep_gradient_uniform_fill, opts);
1034 }
1035 
1037  ContentContextOptions opts) const {
1038  FML_DCHECK(GetDeviceCapabilities().SupportsSSBO());
1039  return GetPipeline(this, pipelines_->linear_gradient_ssbo_fill, opts);
1040 }
1041 
1043  ContentContextOptions opts) const {
1044  FML_DCHECK(GetDeviceCapabilities().SupportsSSBO());
1045  return GetPipeline(this, pipelines_->radial_gradient_ssbo_fill, opts);
1046 }
1047 
1049  ContentContextOptions opts,
1050  ConicalKind kind) const {
1051  switch (kind) {
1052  case ConicalKind::kConical:
1053  return GetPipeline(this, pipelines_->conical_gradient_uniform_fill, opts);
1054  case ConicalKind::kRadial:
1055  return GetPipeline(this, pipelines_->conical_gradient_uniform_fill_radial,
1056  opts);
1057  case ConicalKind::kStrip:
1058  return GetPipeline(this, pipelines_->conical_gradient_uniform_fill_strip,
1059  opts);
1061  return GetPipeline(
1062  this, pipelines_->conical_gradient_uniform_fill_strip_and_radial,
1063  opts);
1064  }
1065 }
1066 
1068  ContentContextOptions opts,
1069  ConicalKind kind) const {
1070  FML_DCHECK(GetDeviceCapabilities().SupportsSSBO());
1071  switch (kind) {
1072  case ConicalKind::kConical:
1073  return GetPipeline(this, pipelines_->conical_gradient_ssbo_fill, opts);
1074  case ConicalKind::kRadial:
1075  return GetPipeline(this, pipelines_->conical_gradient_ssbo_fill_radial,
1076  opts);
1077  case ConicalKind::kStrip:
1078  return GetPipeline(this, pipelines_->conical_gradient_ssbo_fill_strip,
1079  opts);
1081  return GetPipeline(
1082  this, pipelines_->conical_gradient_ssbo_fill_strip_and_radial, opts);
1083  }
1084 }
1085 
1087  ContentContextOptions opts) const {
1088  FML_DCHECK(GetDeviceCapabilities().SupportsSSBO());
1089  return GetPipeline(this, pipelines_->sweep_gradient_ssbo_fill, opts);
1090 }
1091 
1093  ContentContextOptions opts) const {
1094  return GetPipeline(this, pipelines_->radial_gradient_fill, opts);
1095 }
1096 
1098  ContentContextOptions opts,
1099  ConicalKind kind) const {
1100  switch (kind) {
1101  case ConicalKind::kConical:
1102  return GetPipeline(this, pipelines_->conical_gradient_fill, opts);
1103  case ConicalKind::kRadial:
1104  return GetPipeline(this, pipelines_->conical_gradient_fill_radial, opts);
1105  case ConicalKind::kStrip:
1106  return GetPipeline(this, pipelines_->conical_gradient_fill_strip, opts);
1108  return GetPipeline(
1109  this, pipelines_->conical_gradient_fill_strip_and_radial, opts);
1110  }
1111 }
1112 
1114  ContentContextOptions opts) const {
1115  return GetPipeline(this, pipelines_->rrect_blur, opts);
1116 }
1117 
1119  ContentContextOptions opts) const {
1120  return GetPipeline(this, pipelines_->rsuperellipse_blur, opts);
1121 }
1122 
1124  ContentContextOptions opts) const {
1125  return GetPipeline(this, pipelines_->sweep_gradient_fill, opts);
1126 }
1127 
1129  ContentContextOptions opts) const {
1130  return GetPipeline(this, pipelines_->solid_fill, opts);
1131 }
1132 
1134  ContentContextOptions opts) const {
1135  return GetPipeline(this, pipelines_->texture, opts);
1136 }
1137 
1139  ContentContextOptions opts) const {
1140  return GetPipeline(this, pipelines_->texture_strict_src, opts);
1141 }
1142 
1144  ContentContextOptions opts) const {
1145  return GetPipeline(this, pipelines_->tiled_texture, opts);
1146 }
1147 
1149  ContentContextOptions opts) const {
1150  return GetPipeline(this, pipelines_->gaussian_blur, opts);
1151 }
1152 
1154  ContentContextOptions opts) const {
1155  return GetPipeline(this, pipelines_->border_mask_blur, opts);
1156 }
1157 
1159  ContentContextOptions opts) const {
1160  return GetPipeline(this, pipelines_->morphology_filter, opts);
1161 }
1162 
1164  ContentContextOptions opts) const {
1165  return GetPipeline(this, pipelines_->color_matrix_color_filter, opts);
1166 }
1167 
1169  ContentContextOptions opts) const {
1170  return GetPipeline(this, pipelines_->linear_to_srgb_filter, opts);
1171 }
1172 
1174  ContentContextOptions opts) const {
1175  return GetPipeline(this, pipelines_->srgb_to_linear_filter, opts);
1176 }
1177 
1179  return GetPipeline(this, pipelines_->clip, opts);
1180 }
1181 
1183  ContentContextOptions opts) const {
1184  return GetPipeline(this, pipelines_->glyph_atlas, opts);
1185 }
1186 
1188  ContentContextOptions opts) const {
1189  return GetPipeline(this, pipelines_->yuv_to_rgb_filter, opts);
1190 }
1191 
1193  BlendMode mode,
1194  ContentContextOptions opts) const {
1195  switch (mode) {
1196  case BlendMode::kClear:
1197  return GetClearBlendPipeline(opts);
1198  case BlendMode::kSrc:
1199  return GetSourceBlendPipeline(opts);
1200  case BlendMode::kDst:
1201  return GetDestinationBlendPipeline(opts);
1202  case BlendMode::kSrcOver:
1203  return GetSourceOverBlendPipeline(opts);
1204  case BlendMode::kDstOver:
1205  return GetDestinationOverBlendPipeline(opts);
1206  case BlendMode::kSrcIn:
1207  return GetSourceInBlendPipeline(opts);
1208  case BlendMode::kDstIn:
1209  return GetDestinationInBlendPipeline(opts);
1210  case BlendMode::kSrcOut:
1211  return GetSourceOutBlendPipeline(opts);
1212  case BlendMode::kDstOut:
1213  return GetDestinationOutBlendPipeline(opts);
1214  case BlendMode::kSrcATop:
1215  return GetSourceATopBlendPipeline(opts);
1216  case BlendMode::kDstATop:
1217  return GetDestinationATopBlendPipeline(opts);
1218  case BlendMode::kXor:
1219  return GetXorBlendPipeline(opts);
1220  case BlendMode::kPlus:
1221  return GetPlusBlendPipeline(opts);
1222  case BlendMode::kModulate:
1223  return GetModulateBlendPipeline(opts);
1224  case BlendMode::kScreen:
1225  return GetScreenBlendPipeline(opts);
1226  case BlendMode::kOverlay:
1227  case BlendMode::kDarken:
1228  case BlendMode::kLighten:
1230  case BlendMode::kColorBurn:
1231  case BlendMode::kHardLight:
1232  case BlendMode::kSoftLight:
1234  case BlendMode::kExclusion:
1235  case BlendMode::kMultiply:
1236  case BlendMode::kHue:
1238  case BlendMode::kColor:
1240  VALIDATION_LOG << "Invalid porter duff blend mode "
1241  << BlendModeToString(mode);
1242  return GetClearBlendPipeline(opts);
1243  break;
1244  }
1245 }
1246 
1248  ContentContextOptions opts) const {
1249  return GetPipeline(this, pipelines_->clear_blend, opts);
1250 }
1251 
1253  ContentContextOptions opts) const {
1254  return GetPipeline(this, pipelines_->source_blend, opts);
1255 }
1256 
1258  ContentContextOptions opts) const {
1259  return GetPipeline(this, pipelines_->destination_blend, opts);
1260 }
1261 
1263  ContentContextOptions opts) const {
1264  return GetPipeline(this, pipelines_->source_over_blend, opts);
1265 }
1266 
1268  ContentContextOptions opts) const {
1269  return GetPipeline(this, pipelines_->destination_over_blend, opts);
1270 }
1271 
1273  ContentContextOptions opts) const {
1274  return GetPipeline(this, pipelines_->source_in_blend, opts);
1275 }
1276 
1278  ContentContextOptions opts) const {
1279  return GetPipeline(this, pipelines_->destination_in_blend, opts);
1280 }
1281 
1283  ContentContextOptions opts) const {
1284  return GetPipeline(this, pipelines_->source_out_blend, opts);
1285 }
1286 
1288  ContentContextOptions opts) const {
1289  return GetPipeline(this, pipelines_->destination_out_blend, opts);
1290 }
1291 
1293  ContentContextOptions opts) const {
1294  return GetPipeline(this, pipelines_->source_a_top_blend, opts);
1295 }
1296 
1298  ContentContextOptions opts) const {
1299  return GetPipeline(this, pipelines_->destination_a_top_blend, opts);
1300 }
1301 
1303  ContentContextOptions opts) const {
1304  return GetPipeline(this, pipelines_->xor_blend, opts);
1305 }
1306 
1308  ContentContextOptions opts) const {
1309  return GetPipeline(this, pipelines_->plus_blend, opts);
1310 }
1311 
1313  ContentContextOptions opts) const {
1314  return GetPipeline(this, pipelines_->modulate_blend, opts);
1315 }
1316 
1318  ContentContextOptions opts) const {
1319  return GetPipeline(this, pipelines_->screen_blend, opts);
1320 }
1321 
1323  ContentContextOptions opts) const {
1324  return GetPipeline(this, pipelines_->blend_color, opts);
1325 }
1326 
1328  ContentContextOptions opts) const {
1329  return GetPipeline(this, pipelines_->blend_colorburn, opts);
1330 }
1331 
1333  ContentContextOptions opts) const {
1334  return GetPipeline(this, pipelines_->blend_colordodge, opts);
1335 }
1336 
1338  ContentContextOptions opts) const {
1339  return GetPipeline(this, pipelines_->blend_darken, opts);
1340 }
1341 
1343  ContentContextOptions opts) const {
1344  return GetPipeline(this, pipelines_->blend_difference, opts);
1345 }
1346 
1348  ContentContextOptions opts) const {
1349  return GetPipeline(this, pipelines_->blend_exclusion, opts);
1350 }
1351 
1353  ContentContextOptions opts) const {
1354  return GetPipeline(this, pipelines_->blend_hardlight, opts);
1355 }
1356 
1358  ContentContextOptions opts) const {
1359  return GetPipeline(this, pipelines_->blend_hue, opts);
1360 }
1361 
1363  ContentContextOptions opts) const {
1364  return GetPipeline(this, pipelines_->blend_lighten, opts);
1365 }
1366 
1368  ContentContextOptions opts) const {
1369  return GetPipeline(this, pipelines_->blend_luminosity, opts);
1370 }
1371 
1373  ContentContextOptions opts) const {
1374  return GetPipeline(this, pipelines_->blend_multiply, opts);
1375 }
1376 
1378  ContentContextOptions opts) const {
1379  return GetPipeline(this, pipelines_->blend_overlay, opts);
1380 }
1381 
1383  ContentContextOptions opts) const {
1384  return GetPipeline(this, pipelines_->blend_saturation, opts);
1385 }
1386 
1388  ContentContextOptions opts) const {
1389  return GetPipeline(this, pipelines_->blend_screen, opts);
1390 }
1391 
1393  ContentContextOptions opts) const {
1394  return GetPipeline(this, pipelines_->blend_softlight, opts);
1395 }
1396 
1398  ContentContextOptions opts) const {
1399  return GetPipeline(this, pipelines_->texture_downsample, opts);
1400 }
1401 
1403  ContentContextOptions opts) const {
1404  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1405  return GetPipeline(this, pipelines_->framebuffer_blend_color, opts);
1406 }
1407 
1409  ContentContextOptions opts) const {
1410  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1411  return GetPipeline(this, pipelines_->framebuffer_blend_colorburn, opts);
1412 }
1413 
1415  ContentContextOptions opts) const {
1416  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1417  return GetPipeline(this, pipelines_->framebuffer_blend_colordodge, opts);
1418 }
1419 
1421  ContentContextOptions opts) const {
1422  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1423  return GetPipeline(this, pipelines_->framebuffer_blend_darken, opts);
1424 }
1425 
1427  ContentContextOptions opts) const {
1428  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1429  return GetPipeline(this, pipelines_->framebuffer_blend_difference, opts);
1430 }
1431 
1433  ContentContextOptions opts) const {
1434  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1435  return GetPipeline(this, pipelines_->framebuffer_blend_exclusion, opts);
1436 }
1437 
1439  ContentContextOptions opts) const {
1440  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1441  return GetPipeline(this, pipelines_->framebuffer_blend_hardlight, opts);
1442 }
1443 
1445  ContentContextOptions opts) const {
1446  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1447  return GetPipeline(this, pipelines_->framebuffer_blend_hue, opts);
1448 }
1449 
1451  ContentContextOptions opts) const {
1452  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1453  return GetPipeline(this, pipelines_->framebuffer_blend_lighten, opts);
1454 }
1455 
1457  ContentContextOptions opts) const {
1458  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1459  return GetPipeline(this, pipelines_->framebuffer_blend_luminosity, opts);
1460 }
1461 
1463  ContentContextOptions opts) const {
1464  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1465  return GetPipeline(this, pipelines_->framebuffer_blend_multiply, opts);
1466 }
1467 
1469  ContentContextOptions opts) const {
1470  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1471  return GetPipeline(this, pipelines_->framebuffer_blend_overlay, opts);
1472 }
1473 
1475  ContentContextOptions opts) const {
1476  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1477  return GetPipeline(this, pipelines_->framebuffer_blend_saturation, opts);
1478 }
1479 
1481  ContentContextOptions opts) const {
1482  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1483  return GetPipeline(this, pipelines_->framebuffer_blend_screen, opts);
1484 }
1485 
1487  ContentContextOptions opts) const {
1488  FML_DCHECK(GetDeviceCapabilities().SupportsFramebufferFetch());
1489  return GetPipeline(this, pipelines_->framebuffer_blend_softlight, opts);
1490 }
1491 
1493  BlendMode blend_mode,
1494  ContentContextOptions opts) const {
1495  if (blend_mode <= BlendMode::kHardLight) {
1496  return GetPipeline(this, pipelines_->vertices_uber_1_, opts);
1497  } else {
1498  return GetPipeline(this, pipelines_->vertices_uber_2_, opts);
1499  }
1500 }
1501 
1503  ContentContextOptions opts) const {
1504  return GetPipeline(this, pipelines_->circle, opts);
1505 }
1506 
1508  return GetPipeline(this, pipelines_->line, opts);
1509 }
1510 
1511 #ifdef IMPELLER_ENABLE_OPENGLES
1512 PipelineRef ContentContext::GetDownsampleTextureGlesPipeline(
1513  ContentContextOptions opts) const {
1514  return GetPipeline(this, pipelines_->texture_downsample_gles, opts);
1515 }
1516 
1517 PipelineRef ContentContext::GetTiledTextureExternalPipeline(
1518  ContentContextOptions opts) const {
1519  FML_DCHECK(GetContext()->GetBackendType() == Context::BackendType::kOpenGLES);
1520  return GetPipeline(this, pipelines_->tiled_texture_external, opts);
1521 }
1522 
1523 PipelineRef ContentContext::GetTiledTextureUvExternalPipeline(
1524  ContentContextOptions opts) const {
1525  FML_DCHECK(GetContext()->GetBackendType() == Context::BackendType::kOpenGLES);
1526  return GetPipeline(this, pipelines_->tiled_texture_uv_external, opts);
1527 }
1528 #endif // IMPELLER_ENABLE_OPENGLES
1529 
1530 } // namespace impeller
BufferView buffer_view
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 > GetEmptyTexture() const
PipelineRef GetSourceOutBlendPipeline(ContentContextOptions opts) const
PipelineRef GetScreenBlendPipeline(ContentContextOptions opts) const
PipelineRef GetBlendColorPipeline(ContentContextOptions opts) const
PipelineRef GetLinePipeline(ContentContextOptions opts) const
PipelineRef GetFramebufferBlendLuminosityPipeline(ContentContextOptions opts) const
PipelineRef GetPlusBlendPipeline(ContentContextOptions opts) const
PipelineRef GetFastGradientPipeline(ContentContextOptions opts) const
ContentContext(std::shared_ptr< Context > context, std::shared_ptr< TypographerContext > typographer_context, std::shared_ptr< RenderTargetAllocator > render_target_allocator=nullptr)
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 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 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
PipelineRef GetConicalGradientSSBOFillPipeline(ContentContextOptions opts, ConicalKind kind) const
Tessellator & GetTessellator() const
PipelineRef GetBlendLightenPipeline(ContentContextOptions opts) const
PipelineRef GetBlendMultiplyPipeline(ContentContextOptions opts) const
PipelineRef GetSourceOverBlendPipeline(ContentContextOptions opts) const
PipelineRef GetBlendExclusionPipeline(ContentContextOptions opts) const
PipelineRef GetColorMatrixColorFilterPipeline(ContentContextOptions opts) const
PipelineRef GetConicalGradientFillPipeline(ContentContextOptions opts, ConicalKind kind) const
std::shared_ptr< Context > GetContext() const
PipelineRef GetDestinationInBlendPipeline(ContentContextOptions opts) const
PipelineRef 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:65
virtual const std::shared_ptr< const Capabilities > & GetCapabilities() const =0
Get the capabilities of Impeller context. All optionally supported feature of the platform,...
static constexpr BlendMode kLastPipelineBlendMode
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 one frame...
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:88
const char * BlendModeToString(BlendMode blend_mode)
Definition: color.cc:47
@ kEqual
Comparison test passes if new_value == current_value.
@ kAlways
Comparison test passes always passes.
@ kLess
Comparison test passes if new_value < current_value.
@ kNotEqual
Comparison test passes if new_value != current_value.
fml::Status AddMipmapGeneration(const std::shared_ptr< CommandBuffer > &command_buffer, const std::shared_ptr< Context > &context, const std::shared_ptr< Texture > &texture)
Adds a blit command to the render pass.
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.
@ kIncrementClamp
Increment the current stencil value by 1. Clamp it to the maximum.
@ kIncrementWrap
Increment the current stencil value by 1. If at maximum, set to zero.
@ kKeep
Don't modify the current stencil value.
BlendMode
Definition: color.h:58
std::array< std::vector< Scalar >, 15 > GetPorterDuffSpecConstants(bool supports_decal)
Definition: comparable.h:95
Describe the color attachment that will be used with this pipeline.
Definition: formats.h:518
std::array< uint8_t, 4 > ToR8G8B8A8() const
Convert to R8G8B8A8 representation.
Definition: color.h:246
static constexpr Color BlackTransparent()
Definition: color.h:270
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< ConicalGradientSSBOFillPipeline > conical_gradient_ssbo_fill
Variants< TextureDownsamplePipeline > texture_downsample
Variants< FramebufferBlendLuminosityPipeline > framebuffer_blend_luminosity
Variants< FramebufferBlendSoftLightPipeline > framebuffer_blend_softlight
Variants< SweepGradientUniformFillPipeline > sweep_gradient_uniform_fill
Variants< BlendColorBurnPipeline > blend_colorburn
Variants< ConicalGradientUniformFillStripRadialPipeline > conical_gradient_uniform_fill_strip_and_radial
Variants< PorterDuffBlendPipeline > source_in_blend
Variants< ConicalGradientFillConicalPipeline > conical_gradient_fill
Variants< 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< 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
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:629
A lightweight object that describes the attributes of a texture that can then used an allocator to cr...
std::shared_ptr< const fml::Mapping > data
Definition: texture_gles.cc:68
#define VALIDATION_LOG
Definition: validation.h:91