summaryrefslogtreecommitdiff
path: root/libs/hwui/GradientCache.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/GradientCache.cpp
parenta5abf801044c5e53349c2e67428fe011a2f6985f (diff)
Track texture memory globally
Also mostly consolidates texture creation Change-Id: Ifea01303afda531dcec99b8fe2a0f64cf2f24420
Diffstat (limited to 'libs/hwui/GradientCache.cpp')
-rw-r--r--libs/hwui/GradientCache.cpp24
1 files changed, 8 insertions, 16 deletions
diff --git a/libs/hwui/GradientCache.cpp b/libs/hwui/GradientCache.cpp
index 8c4645092c97..522aa96132dd 100644
--- a/libs/hwui/GradientCache.cpp
+++ b/libs/hwui/GradientCache.cpp
@@ -110,9 +110,7 @@ void GradientCache::setMaxSize(uint32_t maxSize) {
void GradientCache::operator()(GradientCacheEntry&, Texture*& texture) {
if (texture) {
- const uint32_t size = texture->width * texture->height * bytesPerPixel();
- mSize -= size;
-
+ mSize -= texture->objectSize();
texture->deleteTexture();
delete texture;
}
@@ -167,18 +165,16 @@ Texture* GradientCache::addLinearGradient(GradientCacheEntry& gradient,
getGradientInfo(colors, count, info);
Texture* texture = new Texture(Caches::getInstance());
- texture->width = info.width;
- texture->height = 2;
texture->blend = info.hasAlpha;
texture->generation = 1;
// Asume the cache is always big enough
- const uint32_t size = texture->width * texture->height * bytesPerPixel();
+ const uint32_t size = info.width * 2 * bytesPerPixel();
while (getSize() + size > mMaxSize) {
mCache.removeOldest();
}
- generateTexture(colors, positions, texture);
+ generateTexture(colors, positions, info.width, 2, texture);
mSize += size;
mCache.put(gradient, texture);
@@ -231,10 +227,10 @@ void GradientCache::mixFloats(GradientColor& start, GradientColor& end, float am
dst += 4 * sizeof(float);
}
-void GradientCache::generateTexture(uint32_t* colors, float* positions, Texture* texture) {
- const uint32_t width = texture->width;
+void GradientCache::generateTexture(uint32_t* colors, float* positions,
+ const uint32_t width, const uint32_t height, Texture* texture) {
const GLsizei rowBytes = width * bytesPerPixel();
- uint8_t pixels[rowBytes * texture->height];
+ uint8_t pixels[rowBytes * height];
static ChannelSplitter gSplitters[] = {
&android::uirenderer::GradientCache::splitToBytes,
@@ -277,17 +273,13 @@ void GradientCache::generateTexture(uint32_t* colors, float* positions, Texture*
memcpy(pixels + rowBytes, pixels, rowBytes);
- glGenTextures(1, &texture->id);
- Caches::getInstance().textureState().bindTexture(texture->id);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
if (mUseFloatTexture) {
// We have to use GL_RGBA16F because GL_RGBA32F does not support filtering
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, texture->height, 0,
- GL_RGBA, GL_FLOAT, pixels);
+ texture->upload(width, height, GL_RGBA16F, GL_RGBA, GL_FLOAT, pixels);
} else {
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, texture->height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+ texture->upload(width, height, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
}
texture->setFilter(GL_LINEAR);