17 blend_mode_ = blend_mode;
21 std::shared_ptr<Contents> child_contents) {
22 child_contents_ = std::move(child_contents);
26 std::optional<Rect> FramebufferBlendContents::GetCoverage(
27 const Entity& entity)
const {
28 return child_contents_->GetCoverage(entity);
31 bool FramebufferBlendContents::Render(
const ContentContext& renderer,
33 RenderPass& pass)
const {
34 if (!renderer.GetDeviceCapabilities().SupportsFramebufferFetch()) {
41 auto& host_buffer = renderer.GetTransientsBuffer();
43 auto src_snapshot = child_contents_->RenderToSnapshot(
50 "FramebufferBlendContents Snapshot");
52 if (!src_snapshot.has_value()) {
55 auto coverage = src_snapshot->GetCoverage();
56 if (!coverage.has_value()) {
59 Rect src_coverage = coverage.value();
61 auto size = src_coverage.
GetSize();
62 VertexBufferBuilder<VS::PerVertexData> vtx_builder;
63 vtx_builder.AddVertices({
74 pass.SetCommandLabel(
"Framebuffer Advanced Blend Filter");
75 pass.SetVertexBuffer(vtx_builder.CreateVertexBuffer(host_buffer));
76 pass.SetStencilReference(entity.GetClipDepth());
78 switch (blend_mode_) {
80 pass.SetPipeline(renderer.GetFramebufferBlendScreenPipeline(options));
83 pass.SetPipeline(renderer.GetFramebufferBlendOverlayPipeline(options));
86 pass.SetPipeline(renderer.GetFramebufferBlendDarkenPipeline(options));
89 pass.SetPipeline(renderer.GetFramebufferBlendLightenPipeline(options));
92 pass.SetPipeline(renderer.GetFramebufferBlendColorDodgePipeline(options));
95 pass.SetPipeline(renderer.GetFramebufferBlendColorBurnPipeline(options));
98 pass.SetPipeline(renderer.GetFramebufferBlendHardLightPipeline(options));
101 pass.SetPipeline(renderer.GetFramebufferBlendSoftLightPipeline(options));
104 pass.SetPipeline(renderer.GetFramebufferBlendDifferencePipeline(options));
107 pass.SetPipeline(renderer.GetFramebufferBlendExclusionPipeline(options));
110 pass.SetPipeline(renderer.GetFramebufferBlendMultiplyPipeline(options));
113 pass.SetPipeline(renderer.GetFramebufferBlendHuePipeline(options));
116 pass.SetPipeline(renderer.GetFramebufferBlendSaturationPipeline(options));
119 pass.SetPipeline(renderer.GetFramebufferBlendColorPipeline(options));
122 pass.SetPipeline(renderer.GetFramebufferBlendLuminosityPipeline(options));
128 VS::FrameInfo frame_info;
129 FS::FragInfo frag_info;
131 auto src_sampler_descriptor = src_snapshot->sampler_descriptor;
132 if (renderer.GetDeviceCapabilities().SupportsDecalSamplerAddressMode()) {
136 const std::unique_ptr<const Sampler>& src_sampler =
137 renderer.GetContext()->GetSamplerLibrary()->GetSampler(
138 src_sampler_descriptor);
139 FS::BindTextureSamplerSrc(pass, src_snapshot->texture, src_sampler);
142 src_snapshot->transform);
143 frame_info.src_y_coord_scale = src_snapshot->texture->GetYCoordScale();
144 VS::BindFrameInfo(pass, host_buffer.EmplaceUniform(frame_info));
146 frag_info.src_input_alpha = src_snapshot->opacity;
147 FS::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info));
149 return pass.Draw().ok();