Merge "Fix Caches singleton to avoid resource leaks"
This commit is contained in:
@@ -8,6 +8,7 @@ ifeq ($(USE_OPENGL_RENDERER),true)
|
||||
utils/SortedListImpl.cpp \
|
||||
FontRenderer.cpp \
|
||||
GammaFontRenderer.cpp \
|
||||
Caches.cpp \
|
||||
DisplayListRenderer.cpp \
|
||||
FboCache.cpp \
|
||||
GradientCache.cpp \
|
||||
|
||||
77
libs/hwui/Caches.cpp
Normal file
77
libs/hwui/Caches.cpp
Normal file
@@ -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
|
||||
@@ -75,52 +75,16 @@ struct CacheLogger {
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
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 @@ public:
|
||||
|
||||
}; // namespace uirenderer
|
||||
|
||||
#ifdef USE_OPENGL_RENDERER
|
||||
using namespace uirenderer;
|
||||
ANDROID_SINGLETON_STATIC_INSTANCE(Caches);
|
||||
#endif
|
||||
|
||||
}; // namespace android
|
||||
|
||||
#endif // ANDROID_UI_CACHES_H
|
||||
|
||||
Reference in New Issue
Block a user