Add test for first draw blend behavior in HWUI pipeline
Bug: 65077146
Test: BakedOpRendererTests
Change-Id: Ia3139a01fe25344a19f2b947069bd686303b9fd5
diff --git a/libs/hwui/renderstate/Blend.h b/libs/hwui/renderstate/Blend.h
index ec0e114..a9de246 100644
--- a/libs/hwui/renderstate/Blend.h
+++ b/libs/hwui/renderstate/Blend.h
@@ -40,6 +40,14 @@
GLenum* outSrc, GLenum* outDst);
void setFactors(GLenum src, GLenum dst);
+ bool getEnabled() {
+ return mEnabled;
+ }
+ void getFactors(GLenum* src, GLenum* dst) {
+ *src = mSrcMode;
+ *dst = mDstMode;
+ }
+
void dump();
private:
Blend();
diff --git a/libs/hwui/tests/unit/BakedOpRendererTests.cpp b/libs/hwui/tests/unit/BakedOpRendererTests.cpp
index 603599c..38e106a 100644
--- a/libs/hwui/tests/unit/BakedOpRendererTests.cpp
+++ b/libs/hwui/tests/unit/BakedOpRendererTests.cpp
@@ -17,6 +17,7 @@
#include <gtest/gtest.h>
#include <BakedOpRenderer.h>
+#include <GlopBuilder.h>
#include <tests/common/TestUtils.h>
using namespace android::uirenderer;
@@ -53,3 +54,53 @@
renderer.endLayer();
}
}
+
+static void drawFirstOp(RenderState& renderState, int color, SkBlendMode mode) {
+ BakedOpRenderer renderer(Caches::getInstance(), renderState, true, false, sLightInfo);
+
+ renderer.startFrame(100, 100, Rect(100, 100));
+ SkPaint paint;
+ paint.setColor(color);
+ paint.setBlendMode(mode);
+
+ Rect dest(0, 0, 100, 100);
+ Glop glop;
+ GlopBuilder(renderState, Caches::getInstance(), &glop)
+ .setRoundRectClipState(nullptr)
+ .setMeshUnitQuad()
+ .setFillPaint(paint, 1.0f)
+ .setTransform(Matrix4::identity(), TransformFlags::None)
+ .setModelViewMapUnitToRectSnap(dest)
+ .build();
+ renderer.renderGlop(nullptr, nullptr, glop);
+ renderer.endFrame(Rect(100, 100));
+}
+
+static void verifyBlend(RenderState& renderState, GLenum expectedSrc, GLenum expectedDst) {
+ EXPECT_TRUE(renderState.blend().getEnabled());
+ GLenum src;
+ GLenum dst;
+ renderState.blend().getFactors(&src, &dst);
+ EXPECT_EQ(expectedSrc, src);
+ EXPECT_EQ(expectedDst, dst);
+}
+
+static void verifyBlendDisabled(RenderState& renderState) {
+ EXPECT_FALSE(renderState.blend().getEnabled());
+}
+
+RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpRenderer, firstDrawBlend_clear) {
+ // initialize blend state to nonsense value
+ renderThread.renderState().blend().setFactors(GL_ONE, GL_ONE);
+
+ drawFirstOp(renderThread.renderState(), 0xfeff0000, SkBlendMode::kClear);
+ verifyBlend(renderThread.renderState(), GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);
+}
+
+RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpRenderer, firstDrawBlend_srcover) {
+ // initialize blend state to nonsense value
+ renderThread.renderState().blend().setFactors(GL_ONE, GL_ONE);
+
+ drawFirstOp(renderThread.renderState(), 0xfeff0000, SkBlendMode::kSrcOver);
+ verifyBlendDisabled(renderThread.renderState());
+}