summaryrefslogtreecommitdiff
path: root/libs/hwui/PathCache.cpp
diff options
context:
space:
mode:
author John Reck <jreck@google.com> 2015-11-10 12:19:17 -0800
committer John Reck <jreck@google.com> 2016-01-14 13:42:12 -0800
commit38e0c32852e3b9d8ca4a9d3791577f52536419cb (patch)
tree72286f7531e094182b2bfe959015d7ed7f9c6abc /libs/hwui/PathCache.cpp
parenta5abf801044c5e53349c2e67428fe011a2f6985f (diff)
Track texture memory globally
Also mostly consolidates texture creation Change-Id: Ifea01303afda531dcec99b8fe2a0f64cf2f24420
Diffstat (limited to 'libs/hwui/PathCache.cpp')
-rw-r--r--libs/hwui/PathCache.cpp33
1 files changed, 5 insertions, 28 deletions
diff --git a/libs/hwui/PathCache.cpp b/libs/hwui/PathCache.cpp
index 06ea55ad2eac..bfabc1d4d94c 100644
--- a/libs/hwui/PathCache.cpp
+++ b/libs/hwui/PathCache.cpp
@@ -185,7 +185,7 @@ void PathCache::operator()(PathDescription& entry, PathTexture*& texture) {
void PathCache::removeTexture(PathTexture* texture) {
if (texture) {
- const uint32_t size = texture->width * texture->height;
+ const uint32_t size = texture->width() * texture->height();
// If there is a pending task we must wait for it to return
// before attempting our cleanup
@@ -209,9 +209,7 @@ void PathCache::removeTexture(PathTexture* texture) {
ALOGD("Shape deleted, size = %d", size);
}
- if (texture->id) {
- Caches::getInstance().textureState().deleteTexture(texture->id);
- }
+ texture->deleteTexture();
delete texture;
}
}
@@ -248,8 +246,7 @@ PathTexture* PathCache::addTexture(const PathDescription& entry, const SkPath *p
drawPath(path, paint, bitmap, left, top, offset, width, height);
PathTexture* texture = new PathTexture(Caches::getInstance(),
- left, top, offset, width, height,
- path->getGenerationID());
+ left, top, offset, path->getGenerationID());
generateTexture(entry, &bitmap, texture);
return texture;
@@ -262,7 +259,7 @@ void PathCache::generateTexture(const PathDescription& entry, SkBitmap* bitmap,
// Note here that we upload to a texture even if it's bigger than mMaxSize.
// Such an entry in mCache will only be temporary, since it will be evicted
// immediately on trim, or on any other Path entering the cache.
- uint32_t size = texture->width * texture->height;
+ uint32_t size = texture->width() * texture->height();
mSize += size;
PATH_LOGD("PathCache::get/create: name, size, mSize = %d, %d, %d",
texture->id, size, mSize);
@@ -280,24 +277,8 @@ void PathCache::clear() {
void PathCache::generateTexture(SkBitmap& bitmap, Texture* texture) {
ATRACE_NAME("Upload Path Texture");
- SkAutoLockPixels alp(bitmap);
- if (!bitmap.readyToDraw()) {
- ALOGE("Cannot generate texture from bitmap");
- return;
- }
-
- glGenTextures(1, &texture->id);
-
- Caches::getInstance().textureState().bindTexture(texture->id);
- // Textures are Alpha8
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
-
- texture->blend = true;
- glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, texture->width, texture->height, 0,
- GL_ALPHA, GL_UNSIGNED_BYTE, bitmap.getPixels());
-
+ texture->upload(bitmap);
texture->setFilter(GL_LINEAR);
- texture->setWrap(GL_CLAMP_TO_EDGE);
}
///////////////////////////////////////////////////////////////////////////////
@@ -320,16 +301,12 @@ void PathCache::PathProcessor::onProcess(const sp<Task<SkBitmap*> >& task) {
texture->left = left;
texture->top = top;
texture->offset = offset;
- texture->width = width;
- texture->height = height;
if (width <= mMaxTextureSize && height <= mMaxTextureSize) {
SkBitmap* bitmap = new SkBitmap();
drawPath(&t->path, &t->paint, *bitmap, left, top, offset, width, height);
t->setResult(bitmap);
} else {
- texture->width = 0;
- texture->height = 0;
t->setResult(nullptr);
}
}