10 #include "fml/trace_event.h"
33 <<
" as a pipeline blend.";
45 switch (pipeline_blend) {
154 <<
"Depth attachment doesn't match expected pipeline state. "
155 "has_depth_stencil_attachments="
158 <<
"Stencil attachment doesn't match expected pipeline state. "
159 "has_depth_stencil_attachments="
161 if (maybe_stencil.has_value()) {
212 if (maybe_depth.has_value()) {
224 template <
typename PipelineT>
227 auto desc = PipelineT::Builder::MakeDefaultPipelineDescriptor(context);
228 if (!desc.has_value()) {
232 const auto default_color_format =
236 .color_attachment_pixel_format = default_color_format}
237 .ApplyToPipelineDescriptor(*desc);
238 return std::make_unique<PipelineT>(context, desc);
242 std::shared_ptr<Context> context,
243 std::shared_ptr<TypographerContext> typographer_context,
244 std::shared_ptr<RenderTargetAllocator> render_target_allocator)
245 : context_(
std::move(context)),
249 render_target_cache_(render_target_allocator == nullptr
251 context_->GetResourceAllocator())
252 :
std::move(render_target_allocator)),
254 if (!context_ || !context_->IsValid()) {
263 empty_texture_ =
GetContext()->GetResourceAllocator()->CreateTexture(desc);
265 auto cmd_buffer =
GetContext()->CreateCommandBuffer();
266 auto blit_pass = cmd_buffer->CreateBlitPass();
271 if (!blit_pass->EncodeCommands(
GetContext()->GetResourceAllocator()) ||
274 ->Submit({std::move(cmd_buffer)})
282 .color_attachment_pixel_format =
283 context_->GetCapabilities()->GetDefaultColorFormat()};
287 .color_attachment_pixel_format =
288 context_->GetCapabilities()->GetDefaultColorFormat()};
289 const auto supports_decal =
static_cast<Scalar>(
290 context_->GetCapabilities()->SupportsDecalSamplerAddressMode());
296 glyph_atlas_pipelines_.CreateDefault(
299 GetContext()->GetCapabilities()->GetDefaultGlyphAtlasFormat() ==
301 solid_fill_pipelines_.CreateDefault(*context_, options);
302 texture_pipelines_.CreateDefault(*context_, options);
303 fast_gradient_pipelines_.CreateDefault(*context_, options);
305 if (context_->GetCapabilities()->SupportsSSBO()) {
306 linear_gradient_ssbo_fill_pipelines_.CreateDefault(*context_, options);
307 radial_gradient_ssbo_fill_pipelines_.CreateDefault(*context_, options);
308 conical_gradient_ssbo_fill_pipelines_.CreateDefault(*context_, options);
309 sweep_gradient_ssbo_fill_pipelines_.CreateDefault(*context_, options);
311 linear_gradient_fill_pipelines_.CreateDefault(*context_, options);
312 radial_gradient_fill_pipelines_.CreateDefault(*context_, options);
313 conical_gradient_fill_pipelines_.CreateDefault(*context_, options);
314 sweep_gradient_fill_pipelines_.CreateDefault(*context_, options);
318 auto clip_pipeline_descriptor =
320 if (!clip_pipeline_descriptor.has_value()) {
325 .color_attachment_pixel_format =
326 context_->GetCapabilities()->GetDefaultColorFormat()}
327 .ApplyToPipelineDescriptor(*clip_pipeline_descriptor);
329 auto clip_color_attachments =
330 clip_pipeline_descriptor->GetColorAttachmentDescriptors();
331 for (
auto& color_attachment : clip_color_attachments) {
334 clip_pipeline_descriptor->SetColorAttachmentDescriptors(
335 std::move(clip_color_attachments));
336 clip_pipelines_.SetDefault(
338 std::make_unique<ClipPipeline>(*context_, clip_pipeline_descriptor));
339 texture_downsample_pipelines_.CreateDefault(*context_,
340 options_trianglestrip);
341 rrect_blur_pipelines_.CreateDefault(*context_, options_trianglestrip);
342 texture_strict_src_pipelines_.CreateDefault(*context_, options);
343 tiled_texture_pipelines_.CreateDefault(*context_, options,
345 gaussian_blur_pipelines_.CreateDefault(*context_, options_trianglestrip,
347 border_mask_blur_pipelines_.CreateDefault(*context_, options_trianglestrip);
348 color_matrix_color_filter_pipelines_.CreateDefault(*context_,
349 options_trianglestrip);
350 porter_duff_blend_pipelines_.CreateDefault(*context_, options_trianglestrip,
352 vertices_uber_shader_.CreateDefault(*context_, options, {supports_decal});
355 if (context_->GetCapabilities()->SupportsFramebufferFetch()) {
356 framebuffer_blend_color_pipelines_.CreateDefault(
357 *context_, options_trianglestrip,
359 framebuffer_blend_colorburn_pipelines_.CreateDefault(
360 *context_, options_trianglestrip,
362 framebuffer_blend_colordodge_pipelines_.CreateDefault(
363 *context_, options_trianglestrip,
365 framebuffer_blend_darken_pipelines_.CreateDefault(
366 *context_, options_trianglestrip,
368 framebuffer_blend_difference_pipelines_.CreateDefault(
369 *context_, options_trianglestrip,
371 framebuffer_blend_exclusion_pipelines_.CreateDefault(
372 *context_, options_trianglestrip,
374 framebuffer_blend_hardlight_pipelines_.CreateDefault(
375 *context_, options_trianglestrip,
377 framebuffer_blend_hue_pipelines_.CreateDefault(
378 *context_, options_trianglestrip,
380 framebuffer_blend_lighten_pipelines_.CreateDefault(
381 *context_, options_trianglestrip,
383 framebuffer_blend_luminosity_pipelines_.CreateDefault(
384 *context_, options_trianglestrip,
386 framebuffer_blend_multiply_pipelines_.CreateDefault(
387 *context_, options_trianglestrip,
389 framebuffer_blend_overlay_pipelines_.CreateDefault(
390 *context_, options_trianglestrip,
392 framebuffer_blend_saturation_pipelines_.CreateDefault(
393 *context_, options_trianglestrip,
395 framebuffer_blend_screen_pipelines_.CreateDefault(
396 *context_, options_trianglestrip,
398 framebuffer_blend_softlight_pipelines_.CreateDefault(
399 *context_, options_trianglestrip,
402 blend_color_pipelines_.CreateDefault(
403 *context_, options_trianglestrip,
405 blend_colorburn_pipelines_.CreateDefault(
406 *context_, options_trianglestrip,
408 blend_colordodge_pipelines_.CreateDefault(
409 *context_, options_trianglestrip,
411 blend_darken_pipelines_.CreateDefault(
412 *context_, options_trianglestrip,
414 blend_difference_pipelines_.CreateDefault(
415 *context_, options_trianglestrip,
417 blend_exclusion_pipelines_.CreateDefault(
418 *context_, options_trianglestrip,
420 blend_hardlight_pipelines_.CreateDefault(
421 *context_, options_trianglestrip,
423 blend_hue_pipelines_.CreateDefault(
424 *context_, options_trianglestrip,
426 blend_lighten_pipelines_.CreateDefault(
427 *context_, options_trianglestrip,
429 blend_luminosity_pipelines_.CreateDefault(
430 *context_, options_trianglestrip,
432 blend_multiply_pipelines_.CreateDefault(
433 *context_, options_trianglestrip,
435 blend_overlay_pipelines_.CreateDefault(
436 *context_, options_trianglestrip,
438 blend_saturation_pipelines_.CreateDefault(
439 *context_, options_trianglestrip,
441 blend_screen_pipelines_.CreateDefault(
442 *context_, options_trianglestrip,
444 blend_softlight_pipelines_.CreateDefault(
445 *context_, options_trianglestrip,
449 morphology_filter_pipelines_.CreateDefault(*context_, options_trianglestrip,
451 linear_to_srgb_filter_pipelines_.CreateDefault(*context_,
452 options_trianglestrip);
453 srgb_to_linear_filter_pipelines_.CreateDefault(*context_,
454 options_trianglestrip);
455 yuv_to_rgb_filter_pipelines_.CreateDefault(*context_, options_trianglestrip);
458 #if defined(IMPELLER_ENABLE_OPENGLES) && !defined(FML_OS_MACOSX)
460 tiled_texture_external_pipelines_.CreateDefault(*context_, options);
462 #endif // IMPELLER_ENABLE_OPENGLES
465 InitializeCommonlyUsedShadersIfNeeded();
475 return empty_texture_;
479 std::string_view label,
481 const std::shared_ptr<CommandBuffer>& command_buffer,
484 bool depth_stencil_enabled,
485 int32_t mip_count)
const {
486 const std::shared_ptr<Context>& context =
GetContext();
489 std::optional<RenderTarget::AttachmentConfig> depth_stencil_config =
491 : std::optional<RenderTarget::AttachmentConfig>();
493 if (context->GetCapabilities()->SupportsOffscreenMSAA() && msaa_enabled) {
495 *context, texture_size,
496 mip_count,
SPrintF(
"%s Offscreen", label.data()),
500 *context, texture_size,
501 mip_count,
SPrintF(
"%s Offscreen", label.data()),
504 return MakeSubpass(label, subpass_target, command_buffer, subpass_callback);
508 std::string_view label,
510 const std::shared_ptr<CommandBuffer>& command_buffer,
512 const std::shared_ptr<Context>& context =
GetContext();
515 if (!subpass_texture) {
516 return fml::Status(fml::StatusCode::kUnknown,
"");
519 auto sub_renderpass = command_buffer->CreateRenderPass(subpass_target);
520 if (!sub_renderpass) {
521 return fml::Status(fml::StatusCode::kUnknown,
"");
523 sub_renderpass->SetLabel(
SPrintF(
"%s RenderPass", label.data()));
525 if (!subpass_callback(*
this, *sub_renderpass)) {
526 return fml::Status(fml::StatusCode::kUnknown,
"");
529 if (!sub_renderpass->EncodeCommands()) {
530 return fml::Status(fml::StatusCode::kUnknown,
"");
533 const std::shared_ptr<Texture>& target_texture =
535 if (target_texture->GetMipCount() > 1) {
536 fml::Status mipmap_status =
538 if (!mipmap_status.ok()) {
539 return mipmap_status;
543 return subpass_target;
555 return *context_->GetCapabilities();
559 wireframe_ = wireframe;
562 std::shared_ptr<Pipeline<PipelineDescriptor>>
564 const std::string& unique_entrypoint_name,
567 create_callback)
const {
568 RuntimeEffectPipelineKey key{unique_entrypoint_name, options};
569 auto it = runtime_effect_pipelines_.find(key);
570 if (it == runtime_effect_pipelines_.end()) {
571 it = runtime_effect_pipelines_.insert(it, {key, create_callback()});
577 const std::string& unique_entrypoint_name)
const {
578 for (
auto it = runtime_effect_pipelines_.begin();
579 it != runtime_effect_pipelines_.end();) {
580 if (it->first.unique_entrypoint_name == unique_entrypoint_name) {
581 it = runtime_effect_pipelines_.erase(it);
588 void ContentContext::InitializeCommonlyUsedShadersIfNeeded()
const {
589 TRACE_EVENT0(
"flutter",
"InitializeCommonlyUsedShadersIfNeeded");
590 GetContext()->InitializeCommonlyUsedShadersIfNeeded();