Skip to content

Commit 55e6b77

Browse files
Romain GuyAndroid (Google) Code Review
authored andcommitted
Merge "Reduce the number of locks acquired by display lists" into jb-mr1-dev
2 parents 417984d + 58ecc20 commit 55e6b77

File tree

4 files changed

+201
-78
lines changed

4 files changed

+201
-78
lines changed

libs/hwui/DisplayListRenderer.cpp

Lines changed: 53 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -149,57 +149,62 @@ void DisplayList::clearResources() {
149149
delete mTransformMatrix3D;
150150
delete mStaticMatrix;
151151
delete mAnimationMatrix;
152+
152153
mTransformMatrix = NULL;
153154
mTransformCamera = NULL;
154155
mTransformMatrix3D = NULL;
155156
mStaticMatrix = NULL;
156157
mAnimationMatrix = NULL;
157158

158159
Caches& caches = Caches::getInstance();
160+
caches.resourceCache.lock();
159161

160162
for (size_t i = 0; i < mBitmapResources.size(); i++) {
161-
caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
163+
caches.resourceCache.decrementRefcountLocked(mBitmapResources.itemAt(i));
162164
}
163-
mBitmapResources.clear();
164165

165166
for (size_t i = 0; i < mOwnedBitmapResources.size(); i++) {
166167
SkBitmap* bitmap = mOwnedBitmapResources.itemAt(i);
167-
caches.resourceCache.decrementRefcount(bitmap);
168-
caches.resourceCache.destructor(bitmap);
168+
caches.resourceCache.decrementRefcountLocked(bitmap);
169+
caches.resourceCache.destructorLocked(bitmap);
169170
}
170-
mOwnedBitmapResources.clear();
171171

172172
for (size_t i = 0; i < mFilterResources.size(); i++) {
173-
caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
173+
caches.resourceCache.decrementRefcountLocked(mFilterResources.itemAt(i));
174174
}
175-
mFilterResources.clear();
176175

177176
for (size_t i = 0; i < mShaders.size(); i++) {
178-
caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
179-
caches.resourceCache.destructor(mShaders.itemAt(i));
177+
caches.resourceCache.decrementRefcountLocked(mShaders.itemAt(i));
178+
caches.resourceCache.destructorLocked(mShaders.itemAt(i));
180179
}
181-
mShaders.clear();
180+
181+
for (size_t i = 0; i < mSourcePaths.size(); i++) {
182+
caches.resourceCache.decrementRefcountLocked(mSourcePaths.itemAt(i));
183+
}
184+
185+
caches.resourceCache.unlock();
182186

183187
for (size_t i = 0; i < mPaints.size(); i++) {
184188
delete mPaints.itemAt(i);
185189
}
186-
mPaints.clear();
187190

188191
for (size_t i = 0; i < mPaths.size(); i++) {
189192
SkPath* path = mPaths.itemAt(i);
190193
caches.pathCache.remove(path);
191194
delete path;
192195
}
193-
mPaths.clear();
194-
195-
for (size_t i = 0; i < mSourcePaths.size(); i++) {
196-
caches.resourceCache.decrementRefcount(mSourcePaths.itemAt(i));
197-
}
198-
mSourcePaths.clear();
199196

200197
for (size_t i = 0; i < mMatrices.size(); i++) {
201198
delete mMatrices.itemAt(i);
202199
}
200+
201+
mBitmapResources.clear();
202+
mOwnedBitmapResources.clear();
203+
mFilterResources.clear();
204+
mShaders.clear();
205+
mSourcePaths.clear();
206+
mPaints.clear();
207+
mPaths.clear();
203208
mMatrices.clear();
204209
}
205210

@@ -223,35 +228,44 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde
223228
mReader.setMemory(buffer, mSize);
224229

225230
Caches& caches = Caches::getInstance();
231+
caches.resourceCache.lock();
226232

227233
const Vector<SkBitmap*>& bitmapResources = recorder.getBitmapResources();
228234
for (size_t i = 0; i < bitmapResources.size(); i++) {
229235
SkBitmap* resource = bitmapResources.itemAt(i);
230236
mBitmapResources.add(resource);
231-
caches.resourceCache.incrementRefcount(resource);
237+
caches.resourceCache.incrementRefcountLocked(resource);
232238
}
233239

234240
const Vector<SkBitmap*> &ownedBitmapResources = recorder.getOwnedBitmapResources();
235241
for (size_t i = 0; i < ownedBitmapResources.size(); i++) {
236242
SkBitmap* resource = ownedBitmapResources.itemAt(i);
237243
mOwnedBitmapResources.add(resource);
238-
caches.resourceCache.incrementRefcount(resource);
244+
caches.resourceCache.incrementRefcountLocked(resource);
239245
}
240246

241247
const Vector<SkiaColorFilter*>& filterResources = recorder.getFilterResources();
242248
for (size_t i = 0; i < filterResources.size(); i++) {
243249
SkiaColorFilter* resource = filterResources.itemAt(i);
244250
mFilterResources.add(resource);
245-
caches.resourceCache.incrementRefcount(resource);
251+
caches.resourceCache.incrementRefcountLocked(resource);
246252
}
247253

248254
const Vector<SkiaShader*>& shaders = recorder.getShaders();
249255
for (size_t i = 0; i < shaders.size(); i++) {
250256
SkiaShader* resource = shaders.itemAt(i);
251257
mShaders.add(resource);
252-
caches.resourceCache.incrementRefcount(resource);
258+
caches.resourceCache.incrementRefcountLocked(resource);
259+
}
260+
261+
const SortedVector<SkPath*>& sourcePaths = recorder.getSourcePaths();
262+
for (size_t i = 0; i < sourcePaths.size(); i++) {
263+
mSourcePaths.add(sourcePaths.itemAt(i));
264+
caches.resourceCache.incrementRefcountLocked(sourcePaths.itemAt(i));
253265
}
254266

267+
caches.resourceCache.unlock();
268+
255269
const Vector<SkPaint*>& paints = recorder.getPaints();
256270
for (size_t i = 0; i < paints.size(); i++) {
257271
mPaints.add(paints.itemAt(i));
@@ -262,12 +276,6 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde
262276
mPaths.add(paths.itemAt(i));
263277
}
264278

265-
const SortedVector<SkPath*>& sourcePaths = recorder.getSourcePaths();
266-
for (size_t i = 0; i < sourcePaths.size(); i++) {
267-
mSourcePaths.add(sourcePaths.itemAt(i));
268-
caches.resourceCache.incrementRefcount(sourcePaths.itemAt(i));
269-
}
270-
271279
const Vector<SkMatrix*>& matrices = recorder.getMatrices();
272280
for (size_t i = 0; i < matrices.size(); i++) {
273281
mMatrices.add(matrices.itemAt(i));
@@ -1309,7 +1317,8 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag
13091317
// Base structure
13101318
///////////////////////////////////////////////////////////////////////////////
13111319

1312-
DisplayListRenderer::DisplayListRenderer() : mWriter(MIN_WRITER_SIZE),
1320+
DisplayListRenderer::DisplayListRenderer():
1321+
mCaches(Caches::getInstance()), mWriter(MIN_WRITER_SIZE),
13131322
mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false), mHasDrawOps(false) {
13141323
}
13151324

@@ -1320,34 +1329,38 @@ DisplayListRenderer::~DisplayListRenderer() {
13201329
void DisplayListRenderer::reset() {
13211330
mWriter.reset();
13221331

1323-
Caches& caches = Caches::getInstance();
1332+
mCaches.resourceCache.lock();
1333+
13241334
for (size_t i = 0; i < mBitmapResources.size(); i++) {
1325-
caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
1335+
mCaches.resourceCache.decrementRefcountLocked(mBitmapResources.itemAt(i));
13261336
}
1327-
mBitmapResources.clear();
13281337

13291338
for (size_t i = 0; i < mOwnedBitmapResources.size(); i++) {
1330-
SkBitmap* bitmap = mOwnedBitmapResources.itemAt(i);
1331-
caches.resourceCache.decrementRefcount(bitmap);
1339+
mCaches.resourceCache.decrementRefcountLocked(mOwnedBitmapResources.itemAt(i));
13321340
}
1333-
mOwnedBitmapResources.clear();
13341341

13351342
for (size_t i = 0; i < mFilterResources.size(); i++) {
1336-
caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
1343+
mCaches.resourceCache.decrementRefcountLocked(mFilterResources.itemAt(i));
13371344
}
1338-
mFilterResources.clear();
13391345

13401346
for (size_t i = 0; i < mShaders.size(); i++) {
1341-
caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
1347+
mCaches.resourceCache.decrementRefcountLocked(mShaders.itemAt(i));
13421348
}
1343-
mShaders.clear();
1344-
mShaderMap.clear();
13451349

13461350
for (size_t i = 0; i < mSourcePaths.size(); i++) {
1347-
caches.resourceCache.decrementRefcount(mSourcePaths.itemAt(i));
1351+
mCaches.resourceCache.decrementRefcountLocked(mSourcePaths.itemAt(i));
13481352
}
1353+
1354+
mCaches.resourceCache.unlock();
1355+
1356+
mBitmapResources.clear();
1357+
mOwnedBitmapResources.clear();
1358+
mFilterResources.clear();
13491359
mSourcePaths.clear();
13501360

1361+
mShaders.clear();
1362+
mShaderMap.clear();
1363+
13511364
mPaints.clear();
13521365
mPaintMap.clear();
13531366

libs/hwui/DisplayListRenderer.h

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,7 @@ class DisplayListRenderer: public OpenGLRenderer {
763763
mPaths.add(pathCopy);
764764
}
765765
if (mSourcePaths.indexOf(path) < 0) {
766-
Caches::getInstance().resourceCache.incrementRefcount(path);
766+
mCaches.resourceCache.incrementRefcount(path);
767767
mSourcePaths.add(path);
768768
}
769769

@@ -811,13 +811,13 @@ class DisplayListRenderer: public OpenGLRenderer {
811811
// which doesn't seem worth the extra cycles for this unlikely case.
812812
addInt((int) bitmap);
813813
mBitmapResources.add(bitmap);
814-
Caches::getInstance().resourceCache.incrementRefcount(bitmap);
814+
mCaches.resourceCache.incrementRefcount(bitmap);
815815
}
816816

817817
void addBitmapData(SkBitmap* bitmap) {
818818
addInt((int) bitmap);
819819
mOwnedBitmapResources.add(bitmap);
820-
Caches::getInstance().resourceCache.incrementRefcount(bitmap);
820+
mCaches.resourceCache.incrementRefcount(bitmap);
821821
}
822822

823823
inline void addShader(SkiaShader* shader) {
@@ -833,7 +833,7 @@ class DisplayListRenderer: public OpenGLRenderer {
833833
// replaceValueFor() performs an add if the entry doesn't exist
834834
mShaderMap.replaceValueFor(shader, shaderCopy);
835835
mShaders.add(shaderCopy);
836-
Caches::getInstance().resourceCache.incrementRefcount(shaderCopy);
836+
mCaches.resourceCache.incrementRefcount(shaderCopy);
837837
}
838838

839839
addInt((int) shaderCopy);
@@ -842,7 +842,7 @@ class DisplayListRenderer: public OpenGLRenderer {
842842
inline void addColorFilter(SkiaColorFilter* colorFilter) {
843843
addInt((int) colorFilter);
844844
mFilterResources.add(colorFilter);
845-
Caches::getInstance().resourceCache.incrementRefcount(colorFilter);
845+
mCaches.resourceCache.incrementRefcount(colorFilter);
846846
}
847847

848848
Vector<SkBitmap*> mBitmapResources;
@@ -862,15 +862,16 @@ class DisplayListRenderer: public OpenGLRenderer {
862862

863863
Vector<SkMatrix*> mMatrices;
864864

865-
SkWriter32 mWriter;
866865
uint32_t mBufferSize;
867866

868867
int mRestoreSaveCount;
869868

869+
Caches& mCaches;
870+
SkWriter32 mWriter;
871+
870872
float mTranslateX;
871873
float mTranslateY;
872874
bool mHasTranslate;
873-
874875
bool mHasDrawOps;
875876

876877
friend class DisplayList;

0 commit comments

Comments
 (0)