From 2682bdb32269a6a4e301384489944c02498d486c Mon Sep 17 00:00:00 2001 From: Brandon DeRosier Date: Thu, 22 Sep 2022 00:19:37 -0700 Subject: [PATCH] Factor destination alpha into color blend output (flutter/engine#36338) --- engine/src/flutter/impeller/entity/entity.cc | 3 --- engine/src/flutter/impeller/entity/entity.h | 4 ++-- engine/src/flutter/impeller/entity/entity_unittests.cc | 1 + .../impeller/entity/shaders/blending/advanced_blend.glsl | 2 +- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/engine/src/flutter/impeller/entity/entity.cc b/engine/src/flutter/impeller/entity/entity.cc index 680dd6364a2..c7c054293f1 100644 --- a/engine/src/flutter/impeller/entity/entity.cc +++ b/engine/src/flutter/impeller/entity/entity.cc @@ -16,9 +16,6 @@ namespace impeller { -const BlendMode Entity::kLastPipelineBlendMode = BlendMode::kModulate; -const BlendMode Entity::kLastAdvancedBlendMode = BlendMode::kLuminosity; - Entity::Entity() = default; Entity::~Entity() = default; diff --git a/engine/src/flutter/impeller/entity/entity.h b/engine/src/flutter/impeller/entity/entity.h index 14481b29cfb..02a99015b04 100644 --- a/engine/src/flutter/impeller/entity/entity.h +++ b/engine/src/flutter/impeller/entity/entity.h @@ -19,8 +19,8 @@ class RenderPass; class Entity { public: - static const BlendMode kLastPipelineBlendMode; - static const BlendMode kLastAdvancedBlendMode; + static constexpr BlendMode kLastPipelineBlendMode = BlendMode::kModulate; + static constexpr BlendMode kLastAdvancedBlendMode = BlendMode::kLuminosity; /// An enum to define how to repeat, fold, or omit colors outside of the /// typically defined range of the source of the colors (such as the diff --git a/engine/src/flutter/impeller/entity/entity_unittests.cc b/engine/src/flutter/impeller/entity/entity_unittests.cc index ce7fdffa264..cd74a9889d7 100644 --- a/engine/src/flutter/impeller/entity/entity_unittests.cc +++ b/engine/src/flutter/impeller/entity/entity_unittests.cc @@ -662,6 +662,7 @@ TEST_P(EntityTest, BlendingModeOptions) { static_assert(b == BlendMode::kClear); // Ensure the first item in // the switch is the first // item in the enum. + static_assert(Entity::kLastPipelineBlendMode == BlendMode::kModulate); switch (b) { case BlendMode::kClear: blend_mode_names.push_back("Clear"); diff --git a/engine/src/flutter/impeller/entity/shaders/blending/advanced_blend.glsl b/engine/src/flutter/impeller/entity/shaders/blending/advanced_blend.glsl index 20d7b40a0ec..84e4781d99a 100644 --- a/engine/src/flutter/impeller/entity/shaders/blending/advanced_blend.glsl +++ b/engine/src/flutter/impeller/entity/shaders/blending/advanced_blend.glsl @@ -40,5 +40,5 @@ void main() { vec3 blended = Blend(dst.rgb, src.rgb); - frag_color = vec4(blended * src.a, src.a); + frag_color = vec4(blended, 1) * src.a * dst.a; }