Merge "Fix Caches singleton to avoid resource leaks"
diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk
index f314b09..d661f7b 100644
--- a/libs/hwui/Android.mk
+++ b/libs/hwui/Android.mk
@@ -8,6 +8,7 @@
 		utils/SortedListImpl.cpp \
 		FontRenderer.cpp \
 		GammaFontRenderer.cpp \
+		Caches.cpp \
 		DisplayListRenderer.cpp \
 		FboCache.cpp \
 		GradientCache.cpp \
diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp
new file mode 100644
index 0000000..a4def0b
--- /dev/null
+++ b/libs/hwui/Caches.cpp
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "OpenGLRenderer"
+
+#include "Caches.h"
+
+namespace android {
+
+#ifdef USE_OPENGL_RENDERER
+using namespace uirenderer;
+ANDROID_SINGLETON_STATIC_INSTANCE(Caches);
+#endif
+
+namespace uirenderer {
+
+///////////////////////////////////////////////////////////////////////////////
+// Constructors/destructor
+///////////////////////////////////////////////////////////////////////////////
+
+Caches::Caches(): Singleton<Caches>(), blend(false), lastSrcMode(GL_ZERO),
+        lastDstMode(GL_ZERO), currentProgram(NULL) {
+    GLint maxTextureUnits;
+    glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxTextureUnits);
+    if (maxTextureUnits < REQUIRED_TEXTURE_UNITS_COUNT) {
+        LOGW("At least %d texture units are required!", REQUIRED_TEXTURE_UNITS_COUNT);
+    }
+
+    glGenBuffers(1, &meshBuffer);
+    glBindBuffer(GL_ARRAY_BUFFER, meshBuffer);
+    glBufferData(GL_ARRAY_BUFFER, sizeof(gMeshVertices), gMeshVertices, GL_STATIC_DRAW);
+
+    currentBuffer = meshBuffer;
+}
+
+/**
+ * Binds the VBO used to render simple textured quads.
+ */
+void Caches::bindMeshBuffer() {
+    bindMeshBuffer(meshBuffer);
+}
+
+/**
+ * Binds the specified VBO.
+ */
+void Caches::bindMeshBuffer(const GLuint buffer) {
+    if (currentBuffer != buffer) {
+        glBindBuffer(GL_ARRAY_BUFFER, buffer);
+        currentBuffer = buffer;
+    }
+}
+
+/**
+ * Unbinds the VBO used to render simple textured quads.
+ */
+void Caches::unbindMeshBuffer() {
+    if (currentBuffer) {
+        glBindBuffer(GL_ARRAY_BUFFER, 0);
+        currentBuffer = 0;
+    }
+}
+
+}; // namespace uirenderer
+}; // namespace android
diff --git a/libs/hwui/Caches.h b/libs/hwui/Caches.h
index 0c704da..79644a5 100644
--- a/libs/hwui/Caches.h
+++ b/libs/hwui/Caches.h
@@ -75,52 +75,16 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 class Caches: public Singleton<Caches> {
-    Caches(): Singleton<Caches>(), blend(false), lastSrcMode(GL_ZERO),
-            lastDstMode(GL_ZERO), currentProgram(NULL) {
-        GLint maxTextureUnits;
-        glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxTextureUnits);
-        if (maxTextureUnits < REQUIRED_TEXTURE_UNITS_COUNT) {
-            LOGW("At least %d texture units are required!", REQUIRED_TEXTURE_UNITS_COUNT);
-        }
-
-        glGenBuffers(1, &meshBuffer);
-        glBindBuffer(GL_ARRAY_BUFFER, meshBuffer);
-        glBufferData(GL_ARRAY_BUFFER, sizeof(gMeshVertices), gMeshVertices, GL_STATIC_DRAW);
-
-        currentBuffer = meshBuffer;
-    }
+    Caches();
 
     friend class Singleton<Caches>;
 
     CacheLogger logger;
 
 public:
-    /**
-     * Binds the VBO used to render simple textured quads.
-     */
-    inline void bindMeshBuffer() {
-        bindMeshBuffer(meshBuffer);
-    }
-
-    /**
-     * Binds the specified VBO.
-     */
-    inline void bindMeshBuffer(const GLuint buffer) {
-        if (currentBuffer != buffer) {
-            glBindBuffer(GL_ARRAY_BUFFER, buffer);
-            currentBuffer = buffer;
-        }
-    }
-
-    /**
-     * Unbinds the VBO used to render simple textured quads.
-     */
-    inline void unbindMeshBuffer() {
-        if (currentBuffer) {
-            glBindBuffer(GL_ARRAY_BUFFER, 0);
-            currentBuffer = 0;
-        }
-    }
+    void bindMeshBuffer();
+    void bindMeshBuffer(const GLuint buffer);
+    void unbindMeshBuffer();
 
     bool blend;
     GLenum lastSrcMode;
@@ -146,11 +110,6 @@
 
 }; // namespace uirenderer
 
-#ifdef USE_OPENGL_RENDERER
-using namespace uirenderer;
-ANDROID_SINGLETON_STATIC_INSTANCE(Caches);
-#endif
-
 }; // namespace android
 
 #endif // ANDROID_UI_CACHES_H