28 <<
" as a pipeline blend.";
39 switch (pipeline_blend) {
144 if (maybe_stencil.has_value()) {
156 template <
typename PipelineT>
159 auto desc = PipelineT::Builder::MakeDefaultPipelineDescriptor(context);
160 if (!desc.has_value()) {
164 const auto default_color_format =
168 .color_attachment_pixel_format = default_color_format}
169 .ApplyToPipelineDescriptor(*desc);
170 return std::make_unique<PipelineT>(context, desc);
174 std::shared_ptr<Context> context,
175 std::shared_ptr<TypographerContext> typographer_context,
176 std::shared_ptr<RenderTargetAllocator> render_target_allocator)
177 : context_(
std::move(context)),
181 #if IMPELLER_ENABLE_3D
182 scene_context_(
std::make_shared<scene::SceneContext>(context_)),
184 render_target_cache_(render_target_allocator == nullptr
186 context_->GetResourceAllocator())
187 :
std::move(render_target_allocator)) {
188 if (!context_ || !context_->IsValid()) {
193 .color_attachment_pixel_format =
194 context_->GetCapabilities()->GetDefaultColorFormat()};
198 .color_attachment_pixel_format =
199 context_->GetCapabilities()->GetDefaultColorFormat()};
200 const auto supports_decal =
static_cast<Scalar>(
201 context_->GetCapabilities()->SupportsDecalSamplerAddressMode());
203 #ifdef IMPELLER_DEBUG
204 checkerboard_pipelines_.CreateDefault(*context_, options);
205 #endif // IMPELLER_DEBUG
207 solid_fill_pipelines_.CreateDefault(*context_, options);
209 if (context_->GetCapabilities()->SupportsSSBO()) {
210 linear_gradient_ssbo_fill_pipelines_.CreateDefault(*context_, options);
211 radial_gradient_ssbo_fill_pipelines_.CreateDefault(*context_, options);
212 conical_gradient_ssbo_fill_pipelines_.CreateDefault(*context_, options);
213 sweep_gradient_ssbo_fill_pipelines_.CreateDefault(*context_, options);
215 linear_gradient_fill_pipelines_.CreateDefault(*context_, options);
216 radial_gradient_fill_pipelines_.CreateDefault(*context_, options);
217 conical_gradient_fill_pipelines_.CreateDefault(*context_, options);
218 sweep_gradient_fill_pipelines_.CreateDefault(*context_, options);
221 if (context_->GetCapabilities()->SupportsFramebufferFetch()) {
222 framebuffer_blend_color_pipelines_.CreateDefault(
223 *context_, options_trianglestrip,
226 framebuffer_blend_colorburn_pipelines_.CreateDefault(
227 *context_, options_trianglestrip,
230 framebuffer_blend_colordodge_pipelines_.CreateDefault(
231 *context_, options_trianglestrip,
234 framebuffer_blend_darken_pipelines_.CreateDefault(
235 *context_, options_trianglestrip,
238 framebuffer_blend_difference_pipelines_.CreateDefault(
239 *context_, options_trianglestrip,
242 framebuffer_blend_exclusion_pipelines_.CreateDefault(
243 *context_, options_trianglestrip,
246 framebuffer_blend_hardlight_pipelines_.CreateDefault(
247 *context_, options_trianglestrip,
250 framebuffer_blend_hue_pipelines_.CreateDefault(
251 *context_, options_trianglestrip,
254 framebuffer_blend_lighten_pipelines_.CreateDefault(
255 *context_, options_trianglestrip,
258 framebuffer_blend_luminosity_pipelines_.CreateDefault(
259 *context_, options_trianglestrip,
262 framebuffer_blend_multiply_pipelines_.CreateDefault(
263 *context_, options_trianglestrip,
266 framebuffer_blend_overlay_pipelines_.CreateDefault(
267 *context_, options_trianglestrip,
270 framebuffer_blend_saturation_pipelines_.CreateDefault(
271 *context_, options_trianglestrip,
274 framebuffer_blend_screen_pipelines_.CreateDefault(
275 *context_, options_trianglestrip,
278 framebuffer_blend_softlight_pipelines_.CreateDefault(
279 *context_, options_trianglestrip,
284 blend_color_pipelines_.CreateDefault(
285 *context_, options_trianglestrip,
287 blend_colorburn_pipelines_.CreateDefault(
288 *context_, options_trianglestrip,
290 blend_colordodge_pipelines_.CreateDefault(
291 *context_, options_trianglestrip,
293 blend_darken_pipelines_.CreateDefault(
294 *context_, options_trianglestrip,
296 blend_difference_pipelines_.CreateDefault(
297 *context_, options_trianglestrip,
299 blend_exclusion_pipelines_.CreateDefault(
300 *context_, options_trianglestrip,
302 blend_hardlight_pipelines_.CreateDefault(
303 *context_, options_trianglestrip,
305 blend_hue_pipelines_.CreateDefault(
306 *context_, options_trianglestrip,
308 blend_lighten_pipelines_.CreateDefault(
309 *context_, options_trianglestrip,
311 blend_luminosity_pipelines_.CreateDefault(
312 *context_, options_trianglestrip,
314 blend_multiply_pipelines_.CreateDefault(
315 *context_, options_trianglestrip,
317 blend_overlay_pipelines_.CreateDefault(
318 *context_, options_trianglestrip,
320 blend_saturation_pipelines_.CreateDefault(
321 *context_, options_trianglestrip,
323 blend_screen_pipelines_.CreateDefault(
324 *context_, options_trianglestrip,
326 blend_softlight_pipelines_.CreateDefault(
327 *context_, options_trianglestrip,
330 rrect_blur_pipelines_.CreateDefault(*context_, options_trianglestrip);
331 texture_blend_pipelines_.CreateDefault(*context_, options);
332 texture_pipelines_.CreateDefault(*context_, options);
333 position_uv_pipelines_.CreateDefault(*context_, options);
334 tiled_texture_pipelines_.CreateDefault(*context_, options);
335 gaussian_blur_noalpha_decal_pipelines_.CreateDefault(*context_,
336 options_trianglestrip);
337 gaussian_blur_noalpha_nodecal_pipelines_.CreateDefault(*context_,
338 options_trianglestrip);
339 kernel_decal_pipelines_.CreateDefault(*context_, options_trianglestrip);
340 kernel_nodecal_pipelines_.CreateDefault(*context_, options_trianglestrip);
341 border_mask_blur_pipelines_.CreateDefault(*context_, options_trianglestrip);
342 morphology_filter_pipelines_.CreateDefault(*context_, options_trianglestrip,
344 color_matrix_color_filter_pipelines_.CreateDefault(*context_,
345 options_trianglestrip);
346 linear_to_srgb_filter_pipelines_.CreateDefault(*context_,
347 options_trianglestrip);
348 srgb_to_linear_filter_pipelines_.CreateDefault(*context_,
349 options_trianglestrip);
350 glyph_atlas_pipelines_.CreateDefault(*context_, options);
351 glyph_atlas_color_pipelines_.CreateDefault(*context_, options);
352 geometry_color_pipelines_.CreateDefault(*context_, options);
353 yuv_to_rgb_filter_pipelines_.CreateDefault(*context_, options_trianglestrip);
354 porter_duff_blend_pipelines_.CreateDefault(*context_, options_trianglestrip,
357 #if defined(IMPELLER_ENABLE_OPENGLES) && !defined(FML_OS_MACOSX)
359 texture_external_pipelines_.CreateDefault(*context_, options);
362 tiled_texture_external_pipelines_.CreateDefault(*context_, options);
364 #endif // IMPELLER_ENABLE_OPENGLES
365 if (context_->GetCapabilities()->SupportsCompute()) {
368 point_field_compute_pipelines_ =
369 context_->GetPipelineLibrary()->GetPipeline(pipeline_desc).Get();
371 auto uv_pipeline_desc =
373 uv_compute_pipelines_ =
374 context_->GetPipelineLibrary()->GetPipeline(uv_pipeline_desc).Get();
379 auto clip_pipeline_descriptor =
381 if (!clip_pipeline_descriptor.has_value()) {
386 .color_attachment_pixel_format =
387 context_->GetCapabilities()->GetDefaultColorFormat()}
388 .ApplyToPipelineDescriptor(*clip_pipeline_descriptor);
390 auto clip_color_attachments =
391 clip_pipeline_descriptor->GetColorAttachmentDescriptors();
392 for (
auto& color_attachment : clip_color_attachments) {
393 color_attachment.second.write_mask =
396 clip_pipeline_descriptor->SetColorAttachmentDescriptors(
397 std::move(clip_color_attachments));
398 clip_pipelines_.SetDefault(options, std::make_unique<ClipPipeline>(
399 *context_, clip_pipeline_descriptor));
411 const std::string& label,
414 bool msaa_enabled)
const {
415 std::shared_ptr<Context> context =
GetContext();
417 if (context->GetCapabilities()->SupportsOffscreenMSAA() && msaa_enabled) {
420 SPrintF(
"%s Offscreen", label.c_str()),
427 SPrintF(
"%s Offscreen", label.c_str()),
432 return MakeSubpass(label, subpass_target, subpass_callback);
436 const std::string& label,
439 std::shared_ptr<Context> context =
GetContext();
442 if (!subpass_texture) {
443 return fml::Status(fml::StatusCode::kUnknown,
"");
446 auto sub_command_buffer = context->CreateCommandBuffer();
447 sub_command_buffer->SetLabel(
SPrintF(
"%s CommandBuffer", label.c_str()));
448 if (!sub_command_buffer) {
449 return fml::Status(fml::StatusCode::kUnknown,
"");
452 auto sub_renderpass = sub_command_buffer->CreateRenderPass(subpass_target);
453 if (!sub_renderpass) {
454 return fml::Status(fml::StatusCode::kUnknown,
"");
456 sub_renderpass->SetLabel(
SPrintF(
"%s RenderPass", label.c_str()));
458 if (!subpass_callback(*
this, *sub_renderpass)) {
459 return fml::Status(fml::StatusCode::kUnknown,
"");
462 if (!sub_command_buffer->EncodeAndSubmit(sub_renderpass)) {
463 return fml::Status(fml::StatusCode::kUnknown,
"");
466 return subpass_target;
469 #if IMPELLER_ENABLE_3D
470 std::shared_ptr<scene::SceneContext> ContentContext::GetSceneContext()
const {
471 return scene_context_;
473 #endif // IMPELLER_ENABLE_3D
484 return *context_->GetCapabilities();
488 wireframe_ = wireframe;