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 = pass.GetTransientsBuffer();
43 auto src_snapshot = child_contents_->RenderToSnapshot(
49 "FramebufferBlendContents Snapshot");
51 if (!src_snapshot.has_value()) {
54 auto coverage = src_snapshot->GetCoverage();
55 if (!coverage.has_value()) {
58 Rect src_coverage = coverage.value();
60 auto size = src_coverage.
GetSize();
61 VertexBufferBuilder<VS::PerVertexData> vtx_builder;
62 vtx_builder.AddVertices({
75 cmd.BindVertices(vtx_builder.CreateVertexBuffer(host_buffer));
76 cmd.stencil_reference = entity.GetClipDepth();
78 switch (blend_mode_) {
80 cmd.pipeline = renderer.GetFramebufferBlendScreenPipeline(options);
83 cmd.pipeline = renderer.GetFramebufferBlendOverlayPipeline(options);
86 cmd.pipeline = renderer.GetFramebufferBlendDarkenPipeline(options);
89 cmd.pipeline = renderer.GetFramebufferBlendLightenPipeline(options);
92 cmd.pipeline = renderer.GetFramebufferBlendColorDodgePipeline(options);
95 cmd.pipeline = renderer.GetFramebufferBlendColorBurnPipeline(options);
98 cmd.pipeline = renderer.GetFramebufferBlendHardLightPipeline(options);
101 cmd.pipeline = renderer.GetFramebufferBlendSoftLightPipeline(options);
104 cmd.pipeline = renderer.GetFramebufferBlendDifferencePipeline(options);
107 cmd.pipeline = renderer.GetFramebufferBlendExclusionPipeline(options);
110 cmd.pipeline = renderer.GetFramebufferBlendMultiplyPipeline(options);
113 cmd.pipeline = renderer.GetFramebufferBlendHuePipeline(options);
116 cmd.pipeline = renderer.GetFramebufferBlendSaturationPipeline(options);
119 cmd.pipeline = renderer.GetFramebufferBlendColorPipeline(options);
122 cmd.pipeline = 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 auto src_sampler = renderer.GetContext()->GetSamplerLibrary()->GetSampler(
137 src_sampler_descriptor);
138 FS::BindTextureSamplerSrc(cmd, src_snapshot->texture, src_sampler);
140 frame_info.mvp = pass.GetOrthographicTransform() * src_snapshot->transform;
141 frame_info.src_y_coord_scale = src_snapshot->texture->GetYCoordScale();
142 VS::BindFrameInfo(cmd, host_buffer.EmplaceUniform(frame_info));
144 frag_info.src_input_alpha = src_snapshot->opacity;
145 FS::BindFragInfo(cmd, host_buffer.EmplaceUniform(frag_info));
147 return pass.AddCommand(std::move(cmd));