10 #include "fml/trace_event.h"
32 <<
" as a pipeline blend.";
43 switch (pipeline_blend) {
151 <<
"Depth attachment doesn't match expected pipeline state. "
152 "has_depth_stencil_attachments="
155 <<
"Stencil attachment doesn't match expected pipeline state. "
156 "has_depth_stencil_attachments="
158 if (maybe_stencil.has_value()) {
219 if (maybe_depth.has_value()) {
231 template <
typename PipelineT>
234 auto desc = PipelineT::Builder::MakeDefaultPipelineDescriptor(context);
235 if (!desc.has_value()) {
239 const auto default_color_format =
243 .color_attachment_pixel_format = default_color_format}
244 .ApplyToPipelineDescriptor(*desc);
245 return std::make_unique<PipelineT>(context, desc);
249 std::shared_ptr<Context> context,
250 std::shared_ptr<TypographerContext> typographer_context,
251 std::shared_ptr<RenderTargetAllocator> render_target_allocator)
252 : context_(
std::move(context)),
256 #if IMPELLER_ENABLE_3D
257 scene_context_(
std::make_shared<scene::SceneContext>(context_)),
259 render_target_cache_(render_target_allocator == nullptr
261 context_->GetResourceAllocator())
262 :
std::move(render_target_allocator)),
263 host_buffer_(
HostBuffer::Create(context_->GetResourceAllocator())),
265 if (!context_ || !context_->IsValid()) {
271 .color_attachment_pixel_format =
272 context_->GetCapabilities()->GetDefaultColorFormat()};
276 .color_attachment_pixel_format =
277 context_->GetCapabilities()->GetDefaultColorFormat()};
278 const auto supports_decal =
static_cast<Scalar>(
279 context_->GetCapabilities()->SupportsDecalSamplerAddressMode());
281 #ifdef IMPELLER_DEBUG
282 checkerboard_pipelines_.CreateDefault(*context_, options);
283 #endif // IMPELLER_DEBUG
285 solid_fill_pipelines_.CreateDefault(*context_, options);
287 if (context_->GetCapabilities()->SupportsSSBO()) {
288 linear_gradient_ssbo_fill_pipelines_.CreateDefault(*context_, options);
289 radial_gradient_ssbo_fill_pipelines_.CreateDefault(*context_, options);
290 conical_gradient_ssbo_fill_pipelines_.CreateDefault(*context_, options);
291 sweep_gradient_ssbo_fill_pipelines_.CreateDefault(*context_, options);
293 linear_gradient_fill_pipelines_.CreateDefault(*context_, options);
294 radial_gradient_fill_pipelines_.CreateDefault(*context_, options);
295 conical_gradient_fill_pipelines_.CreateDefault(*context_, options);
296 sweep_gradient_fill_pipelines_.CreateDefault(*context_, options);
299 if (context_->GetCapabilities()->SupportsFramebufferFetch()) {
300 framebuffer_blend_color_pipelines_.CreateDefault(
301 *context_, options_trianglestrip,
303 framebuffer_blend_colorburn_pipelines_.CreateDefault(
304 *context_, options_trianglestrip,
306 framebuffer_blend_colordodge_pipelines_.CreateDefault(
307 *context_, options_trianglestrip,
309 framebuffer_blend_darken_pipelines_.CreateDefault(
310 *context_, options_trianglestrip,
312 framebuffer_blend_difference_pipelines_.CreateDefault(
313 *context_, options_trianglestrip,
315 framebuffer_blend_exclusion_pipelines_.CreateDefault(
316 *context_, options_trianglestrip,
318 framebuffer_blend_hardlight_pipelines_.CreateDefault(
319 *context_, options_trianglestrip,
321 framebuffer_blend_hue_pipelines_.CreateDefault(
322 *context_, options_trianglestrip,
324 framebuffer_blend_lighten_pipelines_.CreateDefault(
325 *context_, options_trianglestrip,
327 framebuffer_blend_luminosity_pipelines_.CreateDefault(
328 *context_, options_trianglestrip,
330 framebuffer_blend_multiply_pipelines_.CreateDefault(
331 *context_, options_trianglestrip,
333 framebuffer_blend_overlay_pipelines_.CreateDefault(
334 *context_, options_trianglestrip,
336 framebuffer_blend_saturation_pipelines_.CreateDefault(
337 *context_, options_trianglestrip,
339 framebuffer_blend_screen_pipelines_.CreateDefault(
340 *context_, options_trianglestrip,
342 framebuffer_blend_softlight_pipelines_.CreateDefault(
343 *context_, options_trianglestrip,
347 blend_color_pipelines_.CreateDefault(
348 *context_, options_trianglestrip,
350 blend_colorburn_pipelines_.CreateDefault(
351 *context_, options_trianglestrip,
353 blend_colordodge_pipelines_.CreateDefault(
354 *context_, options_trianglestrip,
356 blend_darken_pipelines_.CreateDefault(
357 *context_, options_trianglestrip,
359 blend_difference_pipelines_.CreateDefault(
360 *context_, options_trianglestrip,
362 blend_exclusion_pipelines_.CreateDefault(
363 *context_, options_trianglestrip,
365 blend_hardlight_pipelines_.CreateDefault(
366 *context_, options_trianglestrip,
368 blend_hue_pipelines_.CreateDefault(
369 *context_, options_trianglestrip,
371 blend_lighten_pipelines_.CreateDefault(
372 *context_, options_trianglestrip,
374 blend_luminosity_pipelines_.CreateDefault(
375 *context_, options_trianglestrip,
377 blend_multiply_pipelines_.CreateDefault(
378 *context_, options_trianglestrip,
380 blend_overlay_pipelines_.CreateDefault(
381 *context_, options_trianglestrip,
383 blend_saturation_pipelines_.CreateDefault(
384 *context_, options_trianglestrip,
386 blend_screen_pipelines_.CreateDefault(
387 *context_, options_trianglestrip,
389 blend_softlight_pipelines_.CreateDefault(
390 *context_, options_trianglestrip,
393 rrect_blur_pipelines_.CreateDefault(*context_, options_trianglestrip);
394 texture_blend_pipelines_.CreateDefault(*context_, options);
395 texture_pipelines_.CreateDefault(*context_, options);
396 texture_strict_src_pipelines_.CreateDefault(*context_, options);
397 position_uv_pipelines_.CreateDefault(*context_, options);
398 tiled_texture_pipelines_.CreateDefault(*context_, options);
399 gaussian_blur_noalpha_decal_pipelines_.CreateDefault(*context_,
400 options_trianglestrip);
401 gaussian_blur_noalpha_nodecal_pipelines_.CreateDefault(*context_,
402 options_trianglestrip);
403 kernel_decal_pipelines_.CreateDefault(*context_, options_trianglestrip);
404 kernel_nodecal_pipelines_.CreateDefault(*context_, options_trianglestrip);
405 border_mask_blur_pipelines_.CreateDefault(*context_, options_trianglestrip);
406 morphology_filter_pipelines_.CreateDefault(*context_, options_trianglestrip,
408 color_matrix_color_filter_pipelines_.CreateDefault(*context_,
409 options_trianglestrip);
410 linear_to_srgb_filter_pipelines_.CreateDefault(*context_,
411 options_trianglestrip);
412 srgb_to_linear_filter_pipelines_.CreateDefault(*context_,
413 options_trianglestrip);
414 glyph_atlas_pipelines_.CreateDefault(
417 GetContext()->GetCapabilities()->GetDefaultGlyphAtlasFormat() ==
419 glyph_atlas_color_pipelines_.CreateDefault(*context_, options);
420 geometry_color_pipelines_.CreateDefault(*context_, options);
421 yuv_to_rgb_filter_pipelines_.CreateDefault(*context_, options_trianglestrip);
422 porter_duff_blend_pipelines_.CreateDefault(*context_, options_trianglestrip,
425 #if defined(IMPELLER_ENABLE_OPENGLES) && !defined(FML_OS_MACOSX)
427 texture_external_pipelines_.CreateDefault(*context_, options);
430 tiled_texture_external_pipelines_.CreateDefault(*context_, options);
432 #endif // IMPELLER_ENABLE_OPENGLES
433 if (context_->GetCapabilities()->SupportsCompute()) {
436 point_field_compute_pipelines_ =
437 context_->GetPipelineLibrary()->GetPipeline(pipeline_desc).Get();
439 auto uv_pipeline_desc =
441 uv_compute_pipelines_ =
442 context_->GetPipelineLibrary()->GetPipeline(uv_pipeline_desc).Get();
447 auto clip_pipeline_descriptor =
449 if (!clip_pipeline_descriptor.has_value()) {
454 .color_attachment_pixel_format =
455 context_->GetCapabilities()->GetDefaultColorFormat()}
456 .ApplyToPipelineDescriptor(*clip_pipeline_descriptor);
458 auto clip_color_attachments =
459 clip_pipeline_descriptor->GetColorAttachmentDescriptors();
460 for (
auto& color_attachment : clip_color_attachments) {
463 clip_pipeline_descriptor->SetColorAttachmentDescriptors(
464 std::move(clip_color_attachments));
465 clip_pipelines_.SetDefault(options, std::make_unique<ClipPipeline>(
466 *context_, clip_pipeline_descriptor));
469 InitializeCommonlyUsedShadersIfNeeded();
479 const std::string& label,
483 bool depth_stencil_enabled,
484 int32_t mip_count)
const {
485 const std::shared_ptr<Context>& context =
GetContext();
488 std::optional<RenderTarget::AttachmentConfig> depth_stencil_config =
490 : std::optional<RenderTarget::AttachmentConfig>();
492 if (context->GetCapabilities()->SupportsOffscreenMSAA() && msaa_enabled) {
494 *context, texture_size,
495 mip_count,
SPrintF(
"%s Offscreen", label.c_str()),
499 *context, texture_size,
500 mip_count,
SPrintF(
"%s Offscreen", label.c_str()),
503 return MakeSubpass(label, subpass_target, subpass_callback);
507 const std::string& label,
510 const std::shared_ptr<Context>& context =
GetContext();
513 if (!subpass_texture) {
514 return fml::Status(fml::StatusCode::kUnknown,
"");
517 auto sub_command_buffer = context->CreateCommandBuffer();
518 sub_command_buffer->SetLabel(
SPrintF(
"%s CommandBuffer", label.c_str()));
519 if (!sub_command_buffer) {
520 return fml::Status(fml::StatusCode::kUnknown,
"");
523 auto sub_renderpass = sub_command_buffer->CreateRenderPass(subpass_target);
524 if (!sub_renderpass) {
525 return fml::Status(fml::StatusCode::kUnknown,
"");
527 sub_renderpass->SetLabel(
SPrintF(
"%s RenderPass", label.c_str()));
529 if (!subpass_callback(*
this, *sub_renderpass)) {
530 return fml::Status(fml::StatusCode::kUnknown,
"");
533 if (!sub_renderpass->EncodeCommands()) {
534 return fml::Status(fml::StatusCode::kUnknown,
"");
537 const std::shared_ptr<Texture>& target_texture =
539 if (target_texture->GetMipCount() > 1) {
540 fml::Status mipmap_status =
542 if (!mipmap_status.ok()) {
543 return mipmap_status;
547 if (!context->GetCommandQueue()->Submit({sub_command_buffer}).ok()) {
548 return fml::Status(fml::StatusCode::kUnknown,
"");
551 return subpass_target;
554 #if IMPELLER_ENABLE_3D
555 std::shared_ptr<scene::SceneContext> ContentContext::GetSceneContext()
const {
556 return scene_context_;
558 #endif // IMPELLER_ENABLE_3D
569 return *context_->GetCapabilities();
573 wireframe_ = wireframe;
576 std::shared_ptr<Pipeline<PipelineDescriptor>>
578 const std::string& unique_entrypoint_name,
581 create_callback)
const {
582 RuntimeEffectPipelineKey key{unique_entrypoint_name, options};
583 auto it = runtime_effect_pipelines_.find(key);
584 if (it == runtime_effect_pipelines_.end()) {
585 it = runtime_effect_pipelines_.insert(it, {key, create_callback()});
591 const std::string& unique_entrypoint_name)
const {
592 for (
auto it = runtime_effect_pipelines_.begin();
593 it != runtime_effect_pipelines_.end();) {
594 if (it->first.unique_entrypoint_name == unique_entrypoint_name) {
595 it = runtime_effect_pipelines_.erase(it);
602 void ContentContext::InitializeCommonlyUsedShadersIfNeeded()
const {
603 TRACE_EVENT0(
"flutter",
"InitializeCommonlyUsedShadersIfNeeded");
604 GetContext()->InitializeCommonlyUsedShadersIfNeeded();
616 auto options = ContentContextOptions{
618 .color_attachment_pixel_format =
619 context_->GetCapabilities()->GetDefaultColorFormat()};
622 for (
const auto geometry :
626 CreateIfNeeded(solid_fill_pipelines_, options);
627 CreateIfNeeded(texture_pipelines_, options);
628 if (
GetContext()->GetCapabilities()->SupportsSSBO()) {
629 CreateIfNeeded(linear_gradient_ssbo_fill_pipelines_, options);
630 CreateIfNeeded(radial_gradient_ssbo_fill_pipelines_, options);
631 CreateIfNeeded(sweep_gradient_ssbo_fill_pipelines_, options);
632 CreateIfNeeded(conical_gradient_ssbo_fill_pipelines_, options);
639 for (
const auto stencil_mode :
644 CreateIfNeeded(clip_pipelines_, options);
653 TextureDescriptor desc;
657 auto texture =
GetContext()->GetResourceAllocator()->CreateTexture(desc);
659 if (!texture->SetContents(
reinterpret_cast<uint8_t*
>(&color), 4u)) {