GlopBuilder, and test app refactor

Change-Id: I2cd299ccf178007fd5f83bab6c3448f03aec7843
diff --git a/libs/hwui/renderstate/Blend.cpp b/libs/hwui/renderstate/Blend.cpp
index 3e7b721..93088e4 100644
--- a/libs/hwui/renderstate/Blend.cpp
+++ b/libs/hwui/renderstate/Blend.cpp
@@ -79,21 +79,10 @@
 }
 
 void Blend::enable(SkXfermode::Mode mode, bool swapSrcDst) {
-    // enable
-    if (!mEnabled) {
-        glEnable(GL_BLEND);
-        mEnabled = true;
-    }
-
-    // select blend mode
-    GLenum sourceMode = swapSrcDst ? kBlendsSwap[mode].src : kBlends[mode].src;
-    GLenum destMode = swapSrcDst ? kBlendsSwap[mode].dst : kBlends[mode].dst;
-
-    if (sourceMode != mSrcMode || destMode != mSrcMode) {
-        glBlendFunc(sourceMode, destMode);
-        mSrcMode = sourceMode;
-        mDstMode = destMode;
-    }
+    GLenum srcMode;
+    GLenum dstMode;
+    getFactors(mode, swapSrcDst, &srcMode, &dstMode);
+    setFactors(srcMode, dstMode);
 }
 
 void Blend::disable() {
@@ -116,6 +105,28 @@
     }
 }
 
+void Blend::getFactors(SkXfermode::Mode mode, bool swapSrcDst, GLenum* outSrc, GLenum* outDst) {
+    *outSrc = swapSrcDst ? kBlendsSwap[mode].src : kBlends[mode].src;
+    *outDst = swapSrcDst ? kBlendsSwap[mode].dst : kBlends[mode].dst;
+}
+
+void Blend::setFactors(GLenum srcMode, GLenum dstMode) {
+    if (srcMode == GL_ZERO && dstMode == GL_ZERO) {
+        disable();
+    } else {
+        if (!mEnabled) {
+            glEnable(GL_BLEND);
+            mEnabled = true;
+        }
+
+        if (srcMode != mSrcMode || dstMode != mSrcMode) {
+            glBlendFunc(srcMode, dstMode);
+            mSrcMode = srcMode;
+            mDstMode = dstMode;
+        }
+    }
+}
+
 } /* namespace uirenderer */
 } /* namespace android */
 
diff --git a/libs/hwui/renderstate/Blend.h b/libs/hwui/renderstate/Blend.h
index b82b477..31d7dde 100644
--- a/libs/hwui/renderstate/Blend.h
+++ b/libs/hwui/renderstate/Blend.h
@@ -32,6 +32,9 @@
     void enable(SkXfermode::Mode mode, bool swapSrcDst);
     void disable();
     void syncEnabled();
+
+    static void getFactors(SkXfermode::Mode mode, bool swapSrcDst, GLenum* outSrc, GLenum* outDst);
+    void setFactors(GLenum src, GLenum dst);
 private:
     Blend();
     void invalidate();
diff --git a/libs/hwui/renderstate/MeshState.cpp b/libs/hwui/renderstate/MeshState.cpp
index 022faf7d..50c09c8 100644
--- a/libs/hwui/renderstate/MeshState.cpp
+++ b/libs/hwui/renderstate/MeshState.cpp
@@ -29,11 +29,11 @@
         , mCurrentTexCoordsStride(0)
         , mTexCoordsArrayEnabled(false) {
 
-    glGenBuffers(1, &meshBuffer);
-    glBindBuffer(GL_ARRAY_BUFFER, meshBuffer);
-    glBufferData(GL_ARRAY_BUFFER, sizeof(kMeshVertices), kMeshVertices, GL_STATIC_DRAW);
+    glGenBuffers(1, &mUnitQuadBuffer);
+    glBindBuffer(GL_ARRAY_BUFFER, mUnitQuadBuffer);
+    glBufferData(GL_ARRAY_BUFFER, sizeof(kUnitQuadVertices), kUnitQuadVertices, GL_STATIC_DRAW);
 
-    mCurrentBuffer = meshBuffer;
+    mCurrentBuffer = mUnitQuadBuffer;
     mCurrentIndicesBuffer = 0;
     mCurrentPixelBuffer = 0;
 
@@ -45,7 +45,7 @@
 }
 
 MeshState::~MeshState() {
-    glDeleteBuffers(1, &meshBuffer);
+    glDeleteBuffers(1, &mUnitQuadBuffer);
     mCurrentBuffer = 0;
 
     glDeleteBuffers(1, &mQuadListIndices);
@@ -60,11 +60,11 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 bool MeshState::bindMeshBuffer() {
-    return bindMeshBuffer(meshBuffer);
+    return bindMeshBuffer(mUnitQuadBuffer);
 }
 
 bool MeshState::bindMeshBuffer(GLuint buffer) {
-    if (!buffer) buffer = meshBuffer;
+    if (!buffer) buffer = mUnitQuadBuffer;
     if (mCurrentBuffer != buffer) {
         glBindBuffer(GL_ARRAY_BUFFER, buffer);
         mCurrentBuffer = buffer;
diff --git a/libs/hwui/renderstate/MeshState.h b/libs/hwui/renderstate/MeshState.h
index 9b1021d..5cb1143 100644
--- a/libs/hwui/renderstate/MeshState.h
+++ b/libs/hwui/renderstate/MeshState.h
@@ -32,7 +32,7 @@
 
 // This array is never used directly but used as a memcpy source in the
 // OpenGLRenderer constructor
-const TextureVertex kMeshVertices[] = {
+const TextureVertex kUnitQuadVertices[] = {
         { 0, 0, 0, 0 },
         { 1, 0, 1, 0 },
         { 0, 1, 0, 1 },
@@ -110,12 +110,16 @@
     bool bindShadowIndicesBuffer();
     bool unbindIndicesBuffer();
 
+    ///////////////////////////////////////////////////////////////////////////////
+    // Getters - for use in Glop building
+    ///////////////////////////////////////////////////////////////////////////////
+    GLuint getUnitQuadVBO() { return mUnitQuadBuffer; }
 private:
     MeshState();
     bool bindIndicesBufferInternal(const GLuint buffer);
 
     // VBO to draw with
-    GLuint meshBuffer;
+    GLuint mUnitQuadBuffer;
 
     GLuint mCurrentBuffer;
     GLuint mCurrentIndicesBuffer;
diff --git a/libs/hwui/renderstate/RenderState.cpp b/libs/hwui/renderstate/RenderState.cpp
index 8eda7c9..d3f6277 100644
--- a/libs/hwui/renderstate/RenderState.cpp
+++ b/libs/hwui/renderstate/RenderState.cpp
@@ -217,7 +217,7 @@
     mCaches->setProgram(shader.program);
 
     Glop::Fill::Color color = shader.color;
-    shader.program->setColor(color.a, color.r, color.g, color.b);
+    shader.program->setColor(color.r, color.g, color.b, color.a);
 
     shader.program->set(glop.transform.ortho,
             glop.transform.modelView,
@@ -259,14 +259,13 @@
     meshState().bindIndicesBufferInternal(mesh.indexBufferObject);
 
     // ---------- GL state setup ----------
+    blend().setFactors(glop.blend.src, glop.blend.dst);
 
-    if (glop.blend.mode != Glop::Blend::kDisable) {
-        blend().enable(glop.blend.mode, glop.blend.swapSrcDst);
+    if (mesh.indexBufferObject) {
+        glDrawElements(glop.mesh.primitiveMode, glop.mesh.vertexCount, GL_UNSIGNED_BYTE, nullptr);
     } else {
-        blend().disable();
+        glDrawArrays(GL_TRIANGLE_STRIP, 0, glop.mesh.vertexCount);
     }
-
-    glDrawElements(glop.mesh.primitiveMode, glop.mesh.vertexCount, GL_UNSIGNED_BYTE, nullptr);
 }
 
 } /* namespace uirenderer */