Move gl calls from PatchCache to MeshState

bug:27358166
Change-Id: I5f544f497e9480e64faa2ddd369eb16318e82dc3
diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp
index 949ad45..f2d344f 100644
--- a/libs/hwui/Caches.cpp
+++ b/libs/hwui/Caches.cpp
@@ -68,8 +68,6 @@
     mRegionMesh = nullptr;
     mProgram = nullptr;
 
-    patchCache.init();
-
     mInitialized = true;
 
     mPixelBufferState = new PixelBufferState();
diff --git a/libs/hwui/PatchCache.cpp b/libs/hwui/PatchCache.cpp
index bd6feb9..a6c281d 100644
--- a/libs/hwui/PatchCache.cpp
+++ b/libs/hwui/PatchCache.cpp
@@ -43,21 +43,6 @@
     clear();
 }
 
-void PatchCache::init() {
-    bool created = false;
-    if (!mMeshBuffer) {
-        glGenBuffers(1, &mMeshBuffer);
-        created = true;
-    }
-
-    mRenderState.meshState().bindMeshBuffer(mMeshBuffer);
-    mRenderState.meshState().resetVertexPointers();
-
-    if (created) {
-        createVertexBuffer();
-    }
-}
-
 ///////////////////////////////////////////////////////////////////////////////
 // Caching
 ///////////////////////////////////////////////////////////////////////////////
@@ -80,8 +65,7 @@
     clearCache();
 
     if (mMeshBuffer) {
-        mRenderState.meshState().unbindMeshBuffer();
-        glDeleteBuffers(1, &mMeshBuffer);
+        mRenderState.meshState().deleteMeshBuffer(mMeshBuffer);
         mMeshBuffer = 0;
         mSize = 0;
     }
@@ -170,7 +154,8 @@
 }
 
 void PatchCache::createVertexBuffer() {
-    glBufferData(GL_ARRAY_BUFFER, mMaxSize, nullptr, GL_DYNAMIC_DRAW);
+    mRenderState.meshState().genOrUpdateMeshBuffer(&mMeshBuffer,
+        mMaxSize, nullptr, GL_DYNAMIC_DRAW);
     mSize = 0;
     mFreeBlocks = new BufferBlock(0, mMaxSize);
     mGenerationId++;
@@ -182,7 +167,9 @@
  */
 void PatchCache::setupMesh(Patch* newMesh) {
     // This call ensures the VBO exists and that it is bound
-    init();
+    if (!mMeshBuffer) {
+        createVertexBuffer();
+    }
 
     // If we're running out of space, let's clear the entire cache
     uint32_t size = newMesh->getSize();
@@ -215,7 +202,9 @@
     // Copy the 9patch mesh in the VBO
     newMesh->positionOffset = (GLintptr) (block->offset);
     newMesh->textureOffset = newMesh->positionOffset + kMeshTextureOffset;
-    glBufferSubData(GL_ARRAY_BUFFER, newMesh->positionOffset, size, newMesh->vertices.get());
+
+    mRenderState.meshState().updateMeshBufferSubData(mMeshBuffer, newMesh->positionOffset, size,
+            newMesh->vertices.get());
 
     // Remove the block since we've used it entirely
     if (block->size == size) {
diff --git a/libs/hwui/PatchCache.h b/libs/hwui/PatchCache.h
index 66ef6a0..d1c5dbf 100644
--- a/libs/hwui/PatchCache.h
+++ b/libs/hwui/PatchCache.h
@@ -53,7 +53,6 @@
 public:
     PatchCache(RenderState& renderState);
     ~PatchCache();
-    void init();
 
     const Patch* get(const AssetAtlas::Entry* entry,
             const uint32_t bitmapWidth, const uint32_t bitmapHeight,
diff --git a/libs/hwui/renderstate/MeshState.cpp b/libs/hwui/renderstate/MeshState.cpp
index b575c69..6d02936 100644
--- a/libs/hwui/renderstate/MeshState.cpp
+++ b/libs/hwui/renderstate/MeshState.cpp
@@ -17,8 +17,6 @@
 
 #include "Program.h"
 
-#include "ShadowTessellator.h"
-
 namespace android {
 namespace uirenderer {
 
@@ -100,6 +98,12 @@
     glBufferData(GL_ARRAY_BUFFER, size, data, usage);
 }
 
+void MeshState::updateMeshBufferSubData(GLuint buffer, GLintptr offset,
+        GLsizeiptr size, const void* data) {
+    bindMeshBuffer(buffer);
+    glBufferSubData(GL_ARRAY_BUFFER, offset, size, data);
+}
+
 void MeshState::deleteMeshBuffer(GLuint buffer) {
     if (buffer == mCurrentBuffer) {
         // GL defines that deleting the currently bound VBO rebinds to 0 (no VBO).
diff --git a/libs/hwui/renderstate/MeshState.h b/libs/hwui/renderstate/MeshState.h
index dd68468..17ad462 100644
--- a/libs/hwui/renderstate/MeshState.h
+++ b/libs/hwui/renderstate/MeshState.h
@@ -72,6 +72,7 @@
     void unbindMeshBuffer();
 
     void genOrUpdateMeshBuffer(GLuint* buffer, GLsizeiptr size, const void* data, GLenum usage);
+    void updateMeshBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data);
     void deleteMeshBuffer(GLuint);
 
     ///////////////////////////////////////////////////////////////////////////////