Fix Glop vertex alpha blending

Need to force blending if vertices have alpha attribute

Change-Id: I821792db6b613b4d0243cf9c7a045cba014acdc1
diff --git a/libs/hwui/GlopBuilder.cpp b/libs/hwui/GlopBuilder.cpp
index e0f2ec43..5373275 100644
--- a/libs/hwui/GlopBuilder.cpp
+++ b/libs/hwui/GlopBuilder.cpp
@@ -35,6 +35,10 @@
     LOG_ALWAYS_FATAL_IF(stageFlag & mStageFlags, "Stage %d cannot be run twice"); \
     mStageFlags = static_cast<StageFlags>(mStageFlags | stageFlag)
 
+#define REQUIRE_STAGES(requiredFlags) \
+    LOG_ALWAYS_FATAL_IF((mStageFlags & requiredFlags) != requiredFlags, \
+            "not prepared for current stage")
+
 GlopBuilder::GlopBuilder(RenderState& renderState, Caches& caches, Glop* outGlop)
         : mRenderState(renderState)
         , mCaches(caches)
@@ -127,12 +131,14 @@
     }
 
     TRIGGER_STAGE(kFillStage);
+    REQUIRE_STAGES(kMeshStage);
 
     mOutGlop->fill.color = { alphaScale, alphaScale, alphaScale, alphaScale };
 
     const bool SWAP_SRC_DST = false;
     // TODO: account for texture blend
-    if (alphaScale < 1.0f) {
+    if (alphaScale < 1.0f
+            || (mOutGlop->mesh.vertexFlags & kAlpha_Attrib)) {
         Blend::getFactors(SkXfermode::kSrcOver_Mode, SWAP_SRC_DST,
                 &mOutGlop->blend.src, &mOutGlop->blend.dst);
     } else {
@@ -143,6 +149,7 @@
 }
 GlopBuilder& GlopBuilder::setPaint(const SkPaint& paint, float alphaScale) {
     TRIGGER_STAGE(kFillStage);
+    REQUIRE_STAGES(kMeshStage);
 
     const SkShader* shader = paint.getShader();
     const SkColorFilter* colorFilter = paint.getColorFilter();
@@ -169,6 +176,7 @@
 
     mOutGlop->blend = { GL_ZERO, GL_ZERO };
     if (mOutGlop->fill.color.a < 1.0f
+            || (mOutGlop->mesh.vertexFlags & kAlpha_Attrib)
             || PaintUtils::isBlendedShader(shader)
             || PaintUtils::isBlendedColorFilter(colorFilter)
             || mode != SkXfermode::kSrcOver_Mode) {
@@ -242,7 +250,7 @@
 }
 
 void GlopBuilder::build() {
-    LOG_ALWAYS_FATAL_IF(mStageFlags != kAllStages, "glop not fully prepared!");
+    REQUIRE_STAGES(kAllStages);
 
     mDescription.modulate = mOutGlop->fill.color.a < 1.0f;
     mOutGlop->fill.program = mCaches.programCache.get(mDescription);
diff --git a/libs/hwui/renderstate/MeshState.cpp b/libs/hwui/renderstate/MeshState.cpp
index 5efac0e..585fb86 100644
--- a/libs/hwui/renderstate/MeshState.cpp
+++ b/libs/hwui/renderstate/MeshState.cpp
@@ -67,7 +67,11 @@
 }
 
 void MeshState::dump() {
-    ALOGD("MeshState vertices: unitQuad %d, current %d", mUnitQuadBuffer, mCurrentBuffer);
+    ALOGD("MeshState VBOs: unitQuad %d, current %d", mUnitQuadBuffer, mCurrentBuffer);
+    ALOGD("MeshState vertices: vertex data %p, stride %d",
+            mCurrentPositionPointer, mCurrentPositionStride);
+    ALOGD("MeshState texCoord: data %p, stride %d",
+            mCurrentTexCoordsPointer, mCurrentTexCoordsStride);
 }
 
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/libs/hwui/tests/main.cpp b/libs/hwui/tests/main.cpp
index 5f445f4..b6d2c4d 100644
--- a/libs/hwui/tests/main.cpp
+++ b/libs/hwui/tests/main.cpp
@@ -210,7 +210,7 @@
         renderer->drawColor(0xFFFFFFFF, SkXfermode::kSrcOver_Mode);
         renderer->insertReorderBarrier(true);
 
-        card = createCard(40, 40, 200, 200);
+        card = createCard(40, 40, 400, 400);
         renderer->drawRenderNode(card.get(), DUMMY, 0);
 
         renderer->insertReorderBarrier(false);
@@ -228,11 +228,10 @@
         node->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y);
 
         DisplayListRenderer* renderer = startRecording(node.get());
-        renderer->drawColor(0xFFFF00FF, SkXfermode::kSrcOver_Mode);
 
         SkPaint paint;
         paint.setAntiAlias(true);
-        paint.setColor(0xFF00FFFF);
+        paint.setColor(0xFF000000);
         renderer->drawOval(0, 0, width, height, paint);
 
         endRecording(renderer, node.get());