diff options
| -rw-r--r-- | libs/hwui/renderstate/Blend.h | 8 | ||||
| -rw-r--r-- | libs/hwui/tests/unit/BakedOpRendererTests.cpp | 51 |
2 files changed, 59 insertions, 0 deletions
diff --git a/libs/hwui/renderstate/Blend.h b/libs/hwui/renderstate/Blend.h index ec0e114c998f..a9de24631340 100644 --- a/libs/hwui/renderstate/Blend.h +++ b/libs/hwui/renderstate/Blend.h @@ -40,6 +40,14 @@ public: 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 603599ceb88a..38e106a8ab77 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 @@ RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpRenderer, startRepaintLayer_clear) { 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()); +} |