diff --git a/impeller/entity/contents/content_context.cc b/impeller/entity/contents/content_context.cc index 68011388e661b..64d4b5c85a3da 100644 --- a/impeller/entity/contents/content_context.cc +++ b/impeller/entity/contents/content_context.cc @@ -30,7 +30,7 @@ void ContentContextOptions::ApplyToPipelineDescriptor( desc.SetSampleCount(sample_count); ColorAttachmentDescriptor color0 = *desc.GetColorAttachmentDescriptor(0u); - color0.format = color_attachment_pixel_format.value_or(PixelFormat::kUnknown); + color0.format = color_attachment_pixel_format; color0.alpha_blend_op = BlendOperation::kAdd; color0.color_blend_op = BlendOperation::kAdd; @@ -165,130 +165,139 @@ ContentContext::ContentContext(std::shared_ptr context) if (!context_ || !context_->IsValid()) { return; } + auto default_options = ContentContextOptions{ + .color_attachment_pixel_format = + context_->GetCapabilities()->GetDefaultColorFormat()}; #ifdef IMPELLER_DEBUG - checkerboard_pipelines_[{}] = + checkerboard_pipelines_[default_options] = CreateDefaultPipeline(*context_); #endif // IMPELLER_DEBUG - solid_fill_pipelines_[{}] = + solid_fill_pipelines_[default_options] = CreateDefaultPipeline(*context_); - linear_gradient_fill_pipelines_[{}] = - CreateDefaultPipeline(*context_); - radial_gradient_fill_pipelines_[{}] = - CreateDefaultPipeline(*context_); - conical_gradient_fill_pipelines_[{}] = - CreateDefaultPipeline(*context_); + if (context_->GetCapabilities()->SupportsSSBO()) { - linear_gradient_ssbo_fill_pipelines_[{}] = + linear_gradient_ssbo_fill_pipelines_[default_options] = CreateDefaultPipeline(*context_); - radial_gradient_ssbo_fill_pipelines_[{}] = + radial_gradient_ssbo_fill_pipelines_[default_options] = CreateDefaultPipeline(*context_); - conical_gradient_ssbo_fill_pipelines_[{}] = + conical_gradient_ssbo_fill_pipelines_[default_options] = CreateDefaultPipeline(*context_); - sweep_gradient_ssbo_fill_pipelines_[{}] = + sweep_gradient_ssbo_fill_pipelines_[default_options] = CreateDefaultPipeline(*context_); + } else { + linear_gradient_fill_pipelines_[default_options] = + CreateDefaultPipeline(*context_); + radial_gradient_fill_pipelines_[default_options] = + CreateDefaultPipeline(*context_); + conical_gradient_fill_pipelines_[default_options] = + CreateDefaultPipeline(*context_); + sweep_gradient_fill_pipelines_[default_options] = + CreateDefaultPipeline(*context_); } + if (context_->GetCapabilities()->SupportsFramebufferFetch()) { - framebuffer_blend_color_pipelines_[{}] = + framebuffer_blend_color_pipelines_[default_options] = CreateDefaultPipeline(*context_); - framebuffer_blend_colorburn_pipelines_[{}] = + framebuffer_blend_colorburn_pipelines_[default_options] = CreateDefaultPipeline(*context_); - framebuffer_blend_colordodge_pipelines_[{}] = + framebuffer_blend_colordodge_pipelines_[default_options] = CreateDefaultPipeline(*context_); - framebuffer_blend_darken_pipelines_[{}] = + framebuffer_blend_darken_pipelines_[default_options] = CreateDefaultPipeline(*context_); - framebuffer_blend_difference_pipelines_[{}] = + framebuffer_blend_difference_pipelines_[default_options] = CreateDefaultPipeline(*context_); - framebuffer_blend_exclusion_pipelines_[{}] = + framebuffer_blend_exclusion_pipelines_[default_options] = CreateDefaultPipeline(*context_); - framebuffer_blend_hardlight_pipelines_[{}] = + framebuffer_blend_hardlight_pipelines_[default_options] = CreateDefaultPipeline(*context_); - framebuffer_blend_hue_pipelines_[{}] = + framebuffer_blend_hue_pipelines_[default_options] = CreateDefaultPipeline(*context_); - framebuffer_blend_lighten_pipelines_[{}] = + framebuffer_blend_lighten_pipelines_[default_options] = CreateDefaultPipeline(*context_); - framebuffer_blend_luminosity_pipelines_[{}] = + framebuffer_blend_luminosity_pipelines_[default_options] = CreateDefaultPipeline(*context_); - framebuffer_blend_multiply_pipelines_[{}] = + framebuffer_blend_multiply_pipelines_[default_options] = CreateDefaultPipeline(*context_); - framebuffer_blend_overlay_pipelines_[{}] = + framebuffer_blend_overlay_pipelines_[default_options] = CreateDefaultPipeline(*context_); - framebuffer_blend_saturation_pipelines_[{}] = + framebuffer_blend_saturation_pipelines_[default_options] = CreateDefaultPipeline(*context_); - framebuffer_blend_screen_pipelines_[{}] = + framebuffer_blend_screen_pipelines_[default_options] = CreateDefaultPipeline(*context_); - framebuffer_blend_softlight_pipelines_[{}] = + framebuffer_blend_softlight_pipelines_[default_options] = CreateDefaultPipeline(*context_); } - blend_color_pipelines_[{}] = + blend_color_pipelines_[default_options] = CreateDefaultPipeline(*context_); - blend_colorburn_pipelines_[{}] = + blend_colorburn_pipelines_[default_options] = CreateDefaultPipeline(*context_); - blend_colordodge_pipelines_[{}] = + blend_colordodge_pipelines_[default_options] = CreateDefaultPipeline(*context_); - blend_darken_pipelines_[{}] = + blend_darken_pipelines_[default_options] = CreateDefaultPipeline(*context_); - blend_difference_pipelines_[{}] = + blend_difference_pipelines_[default_options] = CreateDefaultPipeline(*context_); - blend_exclusion_pipelines_[{}] = + blend_exclusion_pipelines_[default_options] = CreateDefaultPipeline(*context_); - blend_hardlight_pipelines_[{}] = + blend_hardlight_pipelines_[default_options] = CreateDefaultPipeline(*context_); - blend_hue_pipelines_[{}] = CreateDefaultPipeline(*context_); - blend_lighten_pipelines_[{}] = + blend_hue_pipelines_[default_options] = + CreateDefaultPipeline(*context_); + blend_lighten_pipelines_[default_options] = CreateDefaultPipeline(*context_); - blend_luminosity_pipelines_[{}] = + blend_luminosity_pipelines_[default_options] = CreateDefaultPipeline(*context_); - blend_multiply_pipelines_[{}] = + blend_multiply_pipelines_[default_options] = CreateDefaultPipeline(*context_); - blend_overlay_pipelines_[{}] = + blend_overlay_pipelines_[default_options] = CreateDefaultPipeline(*context_); - blend_saturation_pipelines_[{}] = + blend_saturation_pipelines_[default_options] = CreateDefaultPipeline(*context_); - blend_screen_pipelines_[{}] = + blend_screen_pipelines_[default_options] = CreateDefaultPipeline(*context_); - blend_softlight_pipelines_[{}] = + blend_softlight_pipelines_[default_options] = CreateDefaultPipeline(*context_); - sweep_gradient_fill_pipelines_[{}] = - CreateDefaultPipeline(*context_); - rrect_blur_pipelines_[{}] = + + rrect_blur_pipelines_[default_options] = CreateDefaultPipeline(*context_); - texture_blend_pipelines_[{}] = + texture_blend_pipelines_[default_options] = CreateDefaultPipeline(*context_); - texture_pipelines_[{}] = CreateDefaultPipeline(*context_); - position_uv_pipelines_[{}] = + texture_pipelines_[default_options] = + CreateDefaultPipeline(*context_); + position_uv_pipelines_[default_options] = CreateDefaultPipeline(*context_); - tiled_texture_pipelines_[{}] = + tiled_texture_pipelines_[default_options] = CreateDefaultPipeline(*context_); - gaussian_blur_alpha_decal_pipelines_[{}] = + gaussian_blur_alpha_decal_pipelines_[default_options] = CreateDefaultPipeline(*context_); - gaussian_blur_alpha_nodecal_pipelines_[{}] = + gaussian_blur_alpha_nodecal_pipelines_[default_options] = CreateDefaultPipeline(*context_); - gaussian_blur_noalpha_decal_pipelines_[{}] = + gaussian_blur_noalpha_decal_pipelines_[default_options] = CreateDefaultPipeline(*context_); - gaussian_blur_noalpha_nodecal_pipelines_[{}] = + gaussian_blur_noalpha_nodecal_pipelines_[default_options] = CreateDefaultPipeline(*context_); - border_mask_blur_pipelines_[{}] = + border_mask_blur_pipelines_[default_options] = CreateDefaultPipeline(*context_); - morphology_filter_pipelines_[{}] = + morphology_filter_pipelines_[default_options] = CreateDefaultPipeline(*context_); - color_matrix_color_filter_pipelines_[{}] = + color_matrix_color_filter_pipelines_[default_options] = CreateDefaultPipeline(*context_); - linear_to_srgb_filter_pipelines_[{}] = + linear_to_srgb_filter_pipelines_[default_options] = CreateDefaultPipeline(*context_); - srgb_to_linear_filter_pipelines_[{}] = + srgb_to_linear_filter_pipelines_[default_options] = CreateDefaultPipeline(*context_); - glyph_atlas_pipelines_[{}] = + glyph_atlas_pipelines_[default_options] = CreateDefaultPipeline(*context_); - glyph_atlas_color_pipelines_[{}] = + glyph_atlas_color_pipelines_[default_options] = CreateDefaultPipeline(*context_); - geometry_color_pipelines_[{}] = + geometry_color_pipelines_[default_options] = CreateDefaultPipeline(*context_); - yuv_to_rgb_filter_pipelines_[{}] = + yuv_to_rgb_filter_pipelines_[default_options] = CreateDefaultPipeline(*context_); - porter_duff_blend_pipelines_[{}] = + porter_duff_blend_pipelines_[default_options] = CreateDefaultPipeline(*context_); if (context_->GetCapabilities()->SupportsCompute()) { @@ -303,7 +312,8 @@ ContentContext::ContentContext(std::shared_ptr context) context_->GetPipelineLibrary()->GetPipeline(uv_pipeline_desc).Get(); } - auto maybe_pipeline_desc = solid_fill_pipelines_[{}]->GetDescriptor(); + auto maybe_pipeline_desc = + solid_fill_pipelines_[default_options]->GetDescriptor(); if (maybe_pipeline_desc.has_value()) { auto clip_pipeline_descriptor = maybe_pipeline_desc.value(); clip_pipeline_descriptor.SetLabel("Clip Pipeline"); @@ -316,7 +326,7 @@ ContentContext::ContentContext(std::shared_ptr context) } clip_pipeline_descriptor.SetColorAttachmentDescriptors( std::move(color_attachments)); - clip_pipelines_[{}] = + clip_pipelines_[default_options] = std::make_unique(*context_, clip_pipeline_descriptor); } else { return; diff --git a/impeller/entity/contents/content_context.h b/impeller/entity/contents/content_context.h index 706d77a6c1adb..c88417890b160 100644 --- a/impeller/entity/contents/content_context.h +++ b/impeller/entity/contents/content_context.h @@ -291,12 +291,12 @@ using UvComputeShaderPipeline = ComputePipelineBuilder; /// Flutter application may easily require building hundreds of PSOs in total, /// but they shouldn't require e.g. 10s of thousands. struct ContentContextOptions { - SampleCount sample_count = SampleCount::kCount1; + SampleCount sample_count = SampleCount::kCount4; BlendMode blend_mode = BlendMode::kSourceOver; CompareFunction stencil_compare = CompareFunction::kEqual; StencilOperation stencil_operation = StencilOperation::kKeep; PrimitiveType primitive_type = PrimitiveType::kTriangle; - std::optional color_attachment_pixel_format; + PixelFormat color_attachment_pixel_format = PixelFormat::kUnknown; bool has_stencil_attachment = true; bool wireframe = false; @@ -820,7 +820,9 @@ class ContentContext { return found->second->WaitAndGet(); } - auto prototype = container.find({}); + auto prototype = container.find( + {.color_attachment_pixel_format = + context_->GetCapabilities()->GetDefaultColorFormat()}); // The prototype must always be initialized in the constructor. FML_CHECK(prototype != container.end()); diff --git a/impeller/renderer/pipeline_descriptor.h b/impeller/renderer/pipeline_descriptor.h index 3d0eddf880e28..599a615c186af 100644 --- a/impeller/renderer/pipeline_descriptor.h +++ b/impeller/renderer/pipeline_descriptor.h @@ -133,7 +133,7 @@ class PipelineDescriptor final : public Comparable { private: std::string label_; - SampleCount sample_count_ = SampleCount::kCount1; + SampleCount sample_count_ = SampleCount::kCount4; WindingOrder winding_order_ = WindingOrder::kClockwise; CullMode cull_mode_ = CullMode::kNone; std::map> entrypoints_; diff --git a/impeller/renderer/renderer_unittests.cc b/impeller/renderer/renderer_unittests.cc index 39d01c62eba4e..d18a4eaab4fb7 100644 --- a/impeller/renderer/renderer_unittests.cc +++ b/impeller/renderer/renderer_unittests.cc @@ -288,6 +288,8 @@ TEST_P(RendererTest, CanRenderToTexture) { using BoxPipelineBuilder = PipelineBuilder; auto pipeline_desc = BoxPipelineBuilder::MakeDefaultPipelineDescriptor(*context); + pipeline_desc->SetSampleCount(SampleCount::kCount1); + ASSERT_TRUE(pipeline_desc.has_value()); auto box_pipeline = context->GetPipelineLibrary()->GetPipeline(pipeline_desc).Get();