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 =
167 .color_attachment_pixel_format = default_color_format}
168 .ApplyToPipelineDescriptor(*desc);
169 return std::make_unique<PipelineT>(context, desc);
173 std::shared_ptr<Context> context,
174 std::shared_ptr<TypographerContext> typographer_context,
175 std::shared_ptr<RenderTargetAllocator> render_target_allocator)
176 : context_(
std::move(context)),
180 #if IMPELLER_ENABLE_3D
181 scene_context_(
std::make_shared<scene::SceneContext>(context_)),
183 render_target_cache_(render_target_allocator == nullptr
185 context_->GetResourceAllocator())
186 :
std::move(render_target_allocator)) {
187 if (!context_ || !context_->IsValid()) {
192 .color_attachment_pixel_format =
193 context_->GetCapabilities()->GetDefaultColorFormat()};
195 #ifdef IMPELLER_DEBUG
196 checkerboard_pipelines_[default_options_] =
197 CreateDefaultPipeline<CheckerboardPipeline>(*context_);
198 #endif // IMPELLER_DEBUG
200 solid_fill_pipelines_[default_options_] =
201 CreateDefaultPipeline<SolidFillPipeline>(*context_);
203 if (context_->GetCapabilities()->SupportsSSBO()) {
204 linear_gradient_ssbo_fill_pipelines_[default_options_] =
205 CreateDefaultPipeline<LinearGradientSSBOFillPipeline>(*context_);
206 radial_gradient_ssbo_fill_pipelines_[default_options_] =
207 CreateDefaultPipeline<RadialGradientSSBOFillPipeline>(*context_);
208 conical_gradient_ssbo_fill_pipelines_[default_options_] =
209 CreateDefaultPipeline<ConicalGradientSSBOFillPipeline>(*context_);
210 sweep_gradient_ssbo_fill_pipelines_[default_options_] =
211 CreateDefaultPipeline<SweepGradientSSBOFillPipeline>(*context_);
213 linear_gradient_fill_pipelines_[default_options_] =
214 CreateDefaultPipeline<LinearGradientFillPipeline>(*context_);
215 radial_gradient_fill_pipelines_[default_options_] =
216 CreateDefaultPipeline<RadialGradientFillPipeline>(*context_);
217 conical_gradient_fill_pipelines_[default_options_] =
218 CreateDefaultPipeline<ConicalGradientFillPipeline>(*context_);
219 sweep_gradient_fill_pipelines_[default_options_] =
220 CreateDefaultPipeline<SweepGradientFillPipeline>(*context_);
223 if (context_->GetCapabilities()->SupportsFramebufferFetch()) {
224 framebuffer_blend_color_pipelines_[default_options_] =
225 CreateDefaultPipeline<FramebufferBlendColorPipeline>(*context_);
226 framebuffer_blend_colorburn_pipelines_[default_options_] =
227 CreateDefaultPipeline<FramebufferBlendColorBurnPipeline>(*context_);
228 framebuffer_blend_colordodge_pipelines_[default_options_] =
229 CreateDefaultPipeline<FramebufferBlendColorDodgePipeline>(*context_);
230 framebuffer_blend_darken_pipelines_[default_options_] =
231 CreateDefaultPipeline<FramebufferBlendDarkenPipeline>(*context_);
232 framebuffer_blend_difference_pipelines_[default_options_] =
233 CreateDefaultPipeline<FramebufferBlendDifferencePipeline>(*context_);
234 framebuffer_blend_exclusion_pipelines_[default_options_] =
235 CreateDefaultPipeline<FramebufferBlendExclusionPipeline>(*context_);
236 framebuffer_blend_hardlight_pipelines_[default_options_] =
237 CreateDefaultPipeline<FramebufferBlendHardLightPipeline>(*context_);
238 framebuffer_blend_hue_pipelines_[default_options_] =
239 CreateDefaultPipeline<FramebufferBlendHuePipeline>(*context_);
240 framebuffer_blend_lighten_pipelines_[default_options_] =
241 CreateDefaultPipeline<FramebufferBlendLightenPipeline>(*context_);
242 framebuffer_blend_luminosity_pipelines_[default_options_] =
243 CreateDefaultPipeline<FramebufferBlendLuminosityPipeline>(*context_);
244 framebuffer_blend_multiply_pipelines_[default_options_] =
245 CreateDefaultPipeline<FramebufferBlendMultiplyPipeline>(*context_);
246 framebuffer_blend_overlay_pipelines_[default_options_] =
247 CreateDefaultPipeline<FramebufferBlendOverlayPipeline>(*context_);
248 framebuffer_blend_saturation_pipelines_[default_options_] =
249 CreateDefaultPipeline<FramebufferBlendSaturationPipeline>(*context_);
250 framebuffer_blend_screen_pipelines_[default_options_] =
251 CreateDefaultPipeline<FramebufferBlendScreenPipeline>(*context_);
252 framebuffer_blend_softlight_pipelines_[default_options_] =
253 CreateDefaultPipeline<FramebufferBlendSoftLightPipeline>(*context_);
256 blend_color_pipelines_[default_options_] =
257 CreateDefaultPipeline<BlendColorPipeline>(*context_);
258 blend_colorburn_pipelines_[default_options_] =
259 CreateDefaultPipeline<BlendColorBurnPipeline>(*context_);
260 blend_colordodge_pipelines_[default_options_] =
261 CreateDefaultPipeline<BlendColorDodgePipeline>(*context_);
262 blend_darken_pipelines_[default_options_] =
263 CreateDefaultPipeline<BlendDarkenPipeline>(*context_);
264 blend_difference_pipelines_[default_options_] =
265 CreateDefaultPipeline<BlendDifferencePipeline>(*context_);
266 blend_exclusion_pipelines_[default_options_] =
267 CreateDefaultPipeline<BlendExclusionPipeline>(*context_);
268 blend_hardlight_pipelines_[default_options_] =
269 CreateDefaultPipeline<BlendHardLightPipeline>(*context_);
270 blend_hue_pipelines_[default_options_] =
271 CreateDefaultPipeline<BlendHuePipeline>(*context_);
272 blend_lighten_pipelines_[default_options_] =
273 CreateDefaultPipeline<BlendLightenPipeline>(*context_);
274 blend_luminosity_pipelines_[default_options_] =
275 CreateDefaultPipeline<BlendLuminosityPipeline>(*context_);
276 blend_multiply_pipelines_[default_options_] =
277 CreateDefaultPipeline<BlendMultiplyPipeline>(*context_);
278 blend_overlay_pipelines_[default_options_] =
279 CreateDefaultPipeline<BlendOverlayPipeline>(*context_);
280 blend_saturation_pipelines_[default_options_] =
281 CreateDefaultPipeline<BlendSaturationPipeline>(*context_);
282 blend_screen_pipelines_[default_options_] =
283 CreateDefaultPipeline<BlendScreenPipeline>(*context_);
284 blend_softlight_pipelines_[default_options_] =
285 CreateDefaultPipeline<BlendSoftLightPipeline>(*context_);
287 rrect_blur_pipelines_[default_options_] =
288 CreateDefaultPipeline<RRectBlurPipeline>(*context_);
289 texture_blend_pipelines_[default_options_] =
290 CreateDefaultPipeline<BlendPipeline>(*context_);
291 texture_pipelines_[default_options_] =
292 CreateDefaultPipeline<TexturePipeline>(*context_);
293 position_uv_pipelines_[default_options_] =
294 CreateDefaultPipeline<PositionUVPipeline>(*context_);
295 tiled_texture_pipelines_[default_options_] =
296 CreateDefaultPipeline<TiledTexturePipeline>(*context_);
297 gaussian_blur_noalpha_decal_pipelines_[default_options_] =
298 CreateDefaultPipeline<GaussianBlurDecalPipeline>(*context_);
299 gaussian_blur_noalpha_nodecal_pipelines_[default_options_] =
300 CreateDefaultPipeline<GaussianBlurPipeline>(*context_);
301 border_mask_blur_pipelines_[default_options_] =
302 CreateDefaultPipeline<BorderMaskBlurPipeline>(*context_);
303 morphology_filter_pipelines_[default_options_] =
304 CreateDefaultPipeline<MorphologyFilterPipeline>(*context_);
305 color_matrix_color_filter_pipelines_[default_options_] =
306 CreateDefaultPipeline<ColorMatrixColorFilterPipeline>(*context_);
307 linear_to_srgb_filter_pipelines_[default_options_] =
308 CreateDefaultPipeline<LinearToSrgbFilterPipeline>(*context_);
309 srgb_to_linear_filter_pipelines_[default_options_] =
310 CreateDefaultPipeline<SrgbToLinearFilterPipeline>(*context_);
311 glyph_atlas_pipelines_[default_options_] =
312 CreateDefaultPipeline<GlyphAtlasPipeline>(*context_);
313 glyph_atlas_color_pipelines_[default_options_] =
314 CreateDefaultPipeline<GlyphAtlasColorPipeline>(*context_);
315 geometry_color_pipelines_[default_options_] =
316 CreateDefaultPipeline<GeometryColorPipeline>(*context_);
317 yuv_to_rgb_filter_pipelines_[default_options_] =
318 CreateDefaultPipeline<YUVToRGBFilterPipeline>(*context_);
319 porter_duff_blend_pipelines_[default_options_] =
320 CreateDefaultPipeline<PorterDuffBlendPipeline>(*context_);
322 #ifdef IMPELLER_ENABLE_OPENGLES
324 texture_external_pipelines_[default_options_] =
325 CreateDefaultPipeline<TextureExternalPipeline>(*context_);
327 #endif // IMPELLER_ENABLE_OPENGLES
328 if (context_->GetCapabilities()->SupportsCompute()) {
331 point_field_compute_pipelines_ =
332 context_->GetPipelineLibrary()->GetPipeline(pipeline_desc).Get();
334 auto uv_pipeline_desc =
336 uv_compute_pipelines_ =
337 context_->GetPipelineLibrary()->GetPipeline(uv_pipeline_desc).Get();
342 auto clip_pipeline_descriptor =
344 if (!clip_pipeline_descriptor.has_value()) {
349 .color_attachment_pixel_format =
350 context_->GetCapabilities()->GetDefaultColorFormat()}
351 .ApplyToPipelineDescriptor(*clip_pipeline_descriptor);
353 auto clip_color_attachments =
354 clip_pipeline_descriptor->GetColorAttachmentDescriptors();
355 for (
auto& color_attachment : clip_color_attachments) {
356 color_attachment.second.write_mask =
359 clip_pipeline_descriptor->SetColorAttachmentDescriptors(
360 std::move(clip_color_attachments));
361 clip_pipelines_[default_options_] =
362 std::make_unique<ClipPipeline>(*context_, clip_pipeline_descriptor);
374 const std::string& label,
377 bool msaa_enabled)
const {
381 if (context->GetCapabilities()->SupportsOffscreenMSAA() && msaa_enabled) {
384 SPrintF(
"%s Offscreen", label.c_str()),
386 #ifndef FML_OS_ANDROID
394 SPrintF(
"%s Offscreen", label.c_str()),
396 #ifndef FML_OS_ANDROID
403 if (!subpass_texture) {
407 auto sub_command_buffer = context->CreateCommandBuffer();
408 sub_command_buffer->SetLabel(
SPrintF(
"%s CommandBuffer", label.c_str()));
409 if (!sub_command_buffer) {
413 auto sub_renderpass = sub_command_buffer->CreateRenderPass(subpass_target);
414 if (!sub_renderpass) {
417 sub_renderpass->SetLabel(
SPrintF(
"%s RenderPass", label.c_str()));
419 if (!subpass_callback(*
this, *sub_renderpass)) {
423 if (!sub_command_buffer->SubmitCommandsAsync(std::move(sub_renderpass))) {
427 return subpass_texture;
430 #if IMPELLER_ENABLE_3D
431 std::shared_ptr<scene::SceneContext> ContentContext::GetSceneContext()
const {
432 return scene_context_;
434 #endif // IMPELLER_ENABLE_3D
445 return *context_->GetCapabilities();
449 wireframe_ = wireframe;