Skip to content

Commit 749e452

Browse files
Romain GuyAndroid (Google) Code Review
authored andcommitted
Merge "Clamp gradient textures to max GL texture size"
2 parents 5f79baa + 8dcfd5e commit 749e452

File tree

3 files changed

+25
-11
lines changed

3 files changed

+25
-11
lines changed

libs/hwui/GradientCache.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
#define LOG_TAG "OpenGLRenderer"
1818

19-
#include <GLES2/gl2.h>
20-
2119
#include <SkCanvas.h>
2220
#include <SkGradientShader.h>
2321

@@ -45,6 +43,8 @@ GradientCache::GradientCache():
4543
INIT_LOGD(" Using default gradient cache size of %.2fMB", DEFAULT_GRADIENT_CACHE_SIZE);
4644
}
4745

46+
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &mMaxTextureSize);
47+
4848
mCache.setOnEntryRemovedListener(this);
4949
}
5050

@@ -116,8 +116,11 @@ void GradientCache::clear() {
116116

117117
Texture* GradientCache::addLinearGradient(GradientCacheEntry& gradient,
118118
uint32_t* colors, float* positions, int count, SkShader::TileMode tileMode) {
119+
int width = 256 * (count - 1);
120+
width = width < mMaxTextureSize ? width : mMaxTextureSize;
121+
119122
SkBitmap bitmap;
120-
bitmap.setConfig(SkBitmap::kARGB_8888_Config, 256 * (count - 1), 1);
123+
bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, 1);
121124
bitmap.allocPixels();
122125
bitmap.eraseColor(0);
123126

libs/hwui/GradientCache.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
#ifndef ANDROID_HWUI_GRADIENT_CACHE_H
1818
#define ANDROID_HWUI_GRADIENT_CACHE_H
1919

20+
#include <GLES2/gl2.h>
21+
2022
#include <SkShader.h>
2123

2224
#include <utils/Mutex.h>
@@ -152,6 +154,8 @@ class GradientCache: public OnEntryRemoved<GradientCacheEntry, Texture*> {
152154
uint32_t mSize;
153155
uint32_t mMaxSize;
154156

157+
GLint mMaxTextureSize;
158+
155159
Vector<SkShader*> mGarbage;
156160
mutable Mutex mLock;
157161
}; // class GradientCache

libs/hwui/ResourceCache.cpp

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ ResourceCache::~ResourceCache() {
4848

4949
void ResourceCache::incrementRefcount(void* resource, ResourceType resourceType) {
5050
Mutex::Autolock _l(mLock);
51-
ResourceReference* ref = mCache->indexOfKey(resource) >= 0 ? mCache->valueFor(resource) : NULL;
51+
ssize_t index = mCache->indexOfKey(resource);
52+
ResourceReference* ref = index >= 0 ? mCache->valueAt(index) : NULL;
5253
if (ref == NULL || mCache->size() == 0) {
5354
ref = new ResourceReference(resourceType);
5455
mCache->add(resource, ref);
@@ -78,7 +79,8 @@ void ResourceCache::incrementRefcount(SkiaColorFilter* filterResource) {
7879

7980
void ResourceCache::decrementRefcount(void* resource) {
8081
Mutex::Autolock _l(mLock);
81-
ResourceReference* ref = mCache->indexOfKey(resource) >= 0 ? mCache->valueFor(resource) : NULL;
82+
ssize_t index = mCache->indexOfKey(resource);
83+
ResourceReference* ref = index >= 0 ? mCache->valueAt(index) : NULL;
8284
if (ref == NULL) {
8385
// Should not get here - shouldn't get a call to decrement if we're not yet tracking it
8486
return;
@@ -111,12 +113,13 @@ void ResourceCache::decrementRefcount(SkiaColorFilter* filterResource) {
111113

112114
void ResourceCache::recycle(SkBitmap* resource) {
113115
Mutex::Autolock _l(mLock);
114-
if (mCache->indexOfKey(resource) < 0) {
116+
ssize_t index = mCache->indexOfKey(resource);
117+
if (index < 0) {
115118
// not tracking this resource; just recycle the pixel data
116119
resource->setPixels(NULL, NULL);
117120
return;
118121
}
119-
ResourceReference* ref = mCache->indexOfKey(resource) >= 0 ? mCache->valueFor(resource) : NULL;
122+
ResourceReference* ref = mCache->valueAt(index);
120123
if (ref == NULL) {
121124
// Should not get here - shouldn't get a call to recycle if we're not yet tracking it
122125
return;
@@ -129,7 +132,8 @@ void ResourceCache::recycle(SkBitmap* resource) {
129132

130133
void ResourceCache::destructor(SkPath* resource) {
131134
Mutex::Autolock _l(mLock);
132-
ResourceReference* ref = mCache->indexOfKey(resource) >= 0 ? mCache->valueFor(resource) : NULL;
135+
ssize_t index = mCache->indexOfKey(resource);
136+
ResourceReference* ref = index >= 0 ? mCache->valueAt(index) : NULL;
133137
if (ref == NULL) {
134138
// If we're not tracking this resource, just delete it
135139
if (Caches::hasInstance()) {
@@ -146,7 +150,8 @@ void ResourceCache::destructor(SkPath* resource) {
146150

147151
void ResourceCache::destructor(SkBitmap* resource) {
148152
Mutex::Autolock _l(mLock);
149-
ResourceReference* ref = mCache->indexOfKey(resource) >= 0 ? mCache->valueFor(resource) : NULL;
153+
ssize_t index = mCache->indexOfKey(resource);
154+
ResourceReference* ref = index >= 0 ? mCache->valueAt(index) : NULL;
150155
if (ref == NULL) {
151156
// If we're not tracking this resource, just delete it
152157
if (Caches::hasInstance()) {
@@ -163,7 +168,8 @@ void ResourceCache::destructor(SkBitmap* resource) {
163168

164169
void ResourceCache::destructor(SkiaShader* resource) {
165170
Mutex::Autolock _l(mLock);
166-
ResourceReference* ref = mCache->indexOfKey(resource) >= 0 ? mCache->valueFor(resource) : NULL;
171+
ssize_t index = mCache->indexOfKey(resource);
172+
ResourceReference* ref = index >= 0 ? mCache->valueAt(index) : NULL;
167173
if (ref == NULL) {
168174
// If we're not tracking this resource, just delete it
169175
delete resource;
@@ -177,7 +183,8 @@ void ResourceCache::destructor(SkiaShader* resource) {
177183

178184
void ResourceCache::destructor(SkiaColorFilter* resource) {
179185
Mutex::Autolock _l(mLock);
180-
ResourceReference* ref = mCache->indexOfKey(resource) >= 0 ? mCache->valueFor(resource) : NULL;
186+
ssize_t index = mCache->indexOfKey(resource);
187+
ResourceReference* ref = index >= 0 ? mCache->valueAt(index) : NULL;
181188
if (ref == NULL) {
182189
// If we're not tracking this resource, just delete it
183190
delete resource;

0 commit comments

Comments
 (0)