Skip to content

Commit 49c5fc0

Browse files
author
Romain Guy
committed
Avoid unnecessary copy when invoking drawBitmap(int[])
Bug #6483390 Change-Id: I4d2d725ef50c9401b4bd998b6160128102b40745
1 parent 6675721 commit 49c5fc0

File tree

6 files changed

+68
-41
lines changed

6 files changed

+68
-41
lines changed

core/jni/android_view_GLES20Canvas.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -357,19 +357,26 @@ static void android_view_GLES20Canvas_drawBitmapMatrix(JNIEnv* env, jobject claz
357357
static void android_view_GLES20Canvas_drawBitmapData(JNIEnv* env, jobject clazz,
358358
OpenGLRenderer* renderer, jintArray colors, jint offset, jint stride,
359359
jfloat left, jfloat top, jint width, jint height, jboolean hasAlpha, SkPaint* paint) {
360-
SkBitmap bitmap;
361-
SkBitmap::Config config = hasAlpha ? SkBitmap::kARGB_8888_Config : SkBitmap::kRGB_565_Config;
362-
bitmap.setConfig(config, width, height);
360+
SkBitmap* bitmap = new SkBitmap;
361+
bitmap->setConfig(hasAlpha ? SkBitmap::kARGB_8888_Config : SkBitmap::kRGB_565_Config,
362+
width, height);
363363

364-
if (!bitmap.allocPixels()) {
364+
if (!bitmap->allocPixels()) {
365+
delete bitmap;
365366
return;
366367
}
367368

368-
if (!GraphicsJNI::SetPixels(env, colors, offset, stride, 0, 0, width, height, bitmap)) {
369+
if (!GraphicsJNI::SetPixels(env, colors, offset, stride, 0, 0, width, height, *bitmap)) {
370+
delete bitmap;
369371
return;
370372
}
371373

372-
renderer->drawBitmapData(&bitmap, left, top, paint);
374+
renderer->drawBitmapData(bitmap, left, top, paint);
375+
376+
// If the renderer is a deferred renderer it will own the bitmap
377+
if (!renderer->isDeferred()) {
378+
delete bitmap;
379+
}
373380
}
374381

375382
static void android_view_GLES20Canvas_drawBitmapMesh(JNIEnv* env, jobject clazz,

libs/hwui/DisplayListRenderer.cpp

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,13 @@ void DisplayList::clearResources() {
162162
}
163163
mBitmapResources.clear();
164164

165+
for (size_t i = 0; i < mOwnedBitmapResources.size(); i++) {
166+
SkBitmap* bitmap = mOwnedBitmapResources.itemAt(i);
167+
caches.resourceCache.decrementRefcount(bitmap);
168+
caches.resourceCache.destructor(bitmap);
169+
}
170+
mOwnedBitmapResources.clear();
171+
165172
for (size_t i = 0; i < mFilterResources.size(); i++) {
166173
caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
167174
}
@@ -217,44 +224,51 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde
217224

218225
Caches& caches = Caches::getInstance();
219226

220-
const Vector<SkBitmap*> &bitmapResources = recorder.getBitmapResources();
227+
const Vector<SkBitmap*>& bitmapResources = recorder.getBitmapResources();
221228
for (size_t i = 0; i < bitmapResources.size(); i++) {
222229
SkBitmap* resource = bitmapResources.itemAt(i);
223230
mBitmapResources.add(resource);
224231
caches.resourceCache.incrementRefcount(resource);
225232
}
226233

227-
const Vector<SkiaColorFilter*> &filterResources = recorder.getFilterResources();
234+
const Vector<SkBitmap*> &ownedBitmapResources = recorder.getOwnedBitmapResources();
235+
for (size_t i = 0; i < ownedBitmapResources.size(); i++) {
236+
SkBitmap* resource = ownedBitmapResources.itemAt(i);
237+
mOwnedBitmapResources.add(resource);
238+
caches.resourceCache.incrementRefcount(resource);
239+
}
240+
241+
const Vector<SkiaColorFilter*>& filterResources = recorder.getFilterResources();
228242
for (size_t i = 0; i < filterResources.size(); i++) {
229243
SkiaColorFilter* resource = filterResources.itemAt(i);
230244
mFilterResources.add(resource);
231245
caches.resourceCache.incrementRefcount(resource);
232246
}
233247

234-
const Vector<SkiaShader*> &shaders = recorder.getShaders();
248+
const Vector<SkiaShader*>& shaders = recorder.getShaders();
235249
for (size_t i = 0; i < shaders.size(); i++) {
236250
SkiaShader* resource = shaders.itemAt(i);
237251
mShaders.add(resource);
238252
caches.resourceCache.incrementRefcount(resource);
239253
}
240254

241-
const Vector<SkPaint*> &paints = recorder.getPaints();
255+
const Vector<SkPaint*>& paints = recorder.getPaints();
242256
for (size_t i = 0; i < paints.size(); i++) {
243257
mPaints.add(paints.itemAt(i));
244258
}
245259

246-
const Vector<SkPath*> &paths = recorder.getPaths();
260+
const Vector<SkPath*>& paths = recorder.getPaths();
247261
for (size_t i = 0; i < paths.size(); i++) {
248262
mPaths.add(paths.itemAt(i));
249263
}
250264

251-
const SortedVector<SkPath*> &sourcePaths = recorder.getSourcePaths();
265+
const SortedVector<SkPath*>& sourcePaths = recorder.getSourcePaths();
252266
for (size_t i = 0; i < sourcePaths.size(); i++) {
253267
mSourcePaths.add(sourcePaths.itemAt(i));
254268
caches.resourceCache.incrementRefcount(sourcePaths.itemAt(i));
255269
}
256270

257-
const Vector<SkMatrix*> &matrices = recorder.getMatrices();
271+
const Vector<SkMatrix*>& matrices = recorder.getMatrices();
258272
for (size_t i = 0; i < matrices.size(); i++) {
259273
mMatrices.add(matrices.itemAt(i));
260274
}
@@ -1036,10 +1050,7 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag
10361050
SkPaint* paint = getPaint(renderer);
10371051
DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
10381052
bitmap, x, y, paint);
1039-
if (bitmap) {
1040-
renderer.drawBitmap(bitmap, x, y, paint);
1041-
delete bitmap;
1042-
}
1053+
renderer.drawBitmap(bitmap, x, y, paint);
10431054
}
10441055
break;
10451056
case DrawBitmapMesh: {
@@ -1295,6 +1306,12 @@ void DisplayListRenderer::reset() {
12951306
}
12961307
mBitmapResources.clear();
12971308

1309+
for (size_t i = 0; i < mOwnedBitmapResources.size(); i++) {
1310+
SkBitmap* bitmap = mOwnedBitmapResources.itemAt(i);
1311+
caches.resourceCache.decrementRefcount(bitmap);
1312+
}
1313+
mOwnedBitmapResources.clear();
1314+
12981315
for (size_t i = 0; i < mFilterResources.size(); i++) {
12991316
caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
13001317
}
@@ -1336,6 +1353,10 @@ DisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) {
13361353
return displayList;
13371354
}
13381355

1356+
bool DisplayListRenderer::isDeferred() {
1357+
return true;
1358+
}
1359+
13391360
void DisplayListRenderer::setViewport(int width, int height) {
13401361
mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
13411362

libs/hwui/DisplayListRenderer.h

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,6 @@ class DisplayList {
398398

399399
private:
400400
void init();
401-
402401
void initProperties();
403402

404403
void clearResources();
@@ -424,16 +423,7 @@ class DisplayList {
424423
}
425424

426425
SkBitmap* getBitmapData() {
427-
SkBitmap* bitmap = new SkBitmap;
428-
bitmap->setConfig((SkBitmap::Config) getInt(), getInt(), getInt());
429-
if (!bitmap->allocPixels()) {
430-
delete bitmap;
431-
return NULL;
432-
}
433-
434-
bitmap->setPixels((void*) mReader.skip(bitmap->height() * bitmap->rowBytes()));
435-
436-
return bitmap;
426+
return (SkBitmap*) getInt();
437427
}
438428

439429
SkiaShader* getShader() {
@@ -497,6 +487,7 @@ class DisplayList {
497487
}
498488

499489
Vector<SkBitmap*> mBitmapResources;
490+
Vector<SkBitmap*> mOwnedBitmapResources;
500491
Vector<SkiaColorFilter*> mFilterResources;
501492

502493
Vector<SkPaint*> mPaints;
@@ -552,6 +543,8 @@ class DisplayListRenderer: public OpenGLRenderer {
552543

553544
ANDROID_API DisplayList* getDisplayList(DisplayList* displayList);
554545

546+
virtual bool isDeferred();
547+
555548
virtual void setViewport(int width, int height);
556549
virtual void prepareDirty(float left, float top, float right, float bottom, bool opaque);
557550
virtual void finish();
@@ -634,6 +627,10 @@ class DisplayListRenderer: public OpenGLRenderer {
634627
return mBitmapResources;
635628
}
636629

630+
const Vector<SkBitmap*>& getOwnedBitmapResources() const {
631+
return mOwnedBitmapResources;
632+
}
633+
637634
const Vector<SkiaColorFilter*>& getFilterResources() const {
638635
return mFilterResources;
639636
}
@@ -719,17 +716,6 @@ class DisplayListRenderer: public OpenGLRenderer {
719716
mWriter.write(values, count * sizeof(int32_t));
720717
}
721718

722-
void addBitmapData(SkBitmap* bitmap) {
723-
mWriter.writeInt(bitmap->config());
724-
mWriter.writeInt(bitmap->width());
725-
mWriter.writeInt(bitmap->height());
726-
727-
SkAutoLockPixels alp(*bitmap);
728-
void* src = bitmap->getPixels();
729-
730-
mWriter.write(src, bitmap->rowBytes() * bitmap->height());
731-
}
732-
733719
void addUInts(const uint32_t* values, int8_t count) {
734720
mWriter.writeInt(count);
735721
mWriter.write(values, count * sizeof(uint32_t));
@@ -825,6 +811,12 @@ class DisplayListRenderer: public OpenGLRenderer {
825811
Caches::getInstance().resourceCache.incrementRefcount(bitmap);
826812
}
827813

814+
void addBitmapData(SkBitmap* bitmap) {
815+
addInt((int) bitmap);
816+
mOwnedBitmapResources.add(bitmap);
817+
Caches::getInstance().resourceCache.incrementRefcount(bitmap);
818+
}
819+
828820
inline void addShader(SkiaShader* shader) {
829821
if (!shader) {
830822
addInt((int) NULL);
@@ -851,6 +843,7 @@ class DisplayListRenderer: public OpenGLRenderer {
851843
}
852844

853845
Vector<SkBitmap*> mBitmapResources;
846+
Vector<SkBitmap*> mOwnedBitmapResources;
854847
Vector<SkiaColorFilter*> mFilterResources;
855848

856849
Vector<SkPaint*> mPaints;

libs/hwui/OpenGLRenderer.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,10 @@ uint32_t OpenGLRenderer::getStencilSize() {
144144
return STENCIL_BUFFER_SIZE;
145145
}
146146

147+
bool OpenGLRenderer::isDeferred() {
148+
return false;
149+
}
150+
147151
void OpenGLRenderer::setViewport(int width, int height) {
148152
mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
149153

libs/hwui/OpenGLRenderer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ class OpenGLRenderer {
6363
ANDROID_API OpenGLRenderer();
6464
virtual ~OpenGLRenderer();
6565

66+
virtual bool isDeferred();
67+
6668
virtual void setViewport(int width, int height);
6769

6870
ANDROID_API void prepare(bool opaque);

libs/hwui/ResourceCache.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,11 @@ void ResourceCache::incrementRefcount(void* resource, ResourceType resourceType)
5959
void ResourceCache::incrementRefcount(SkBitmap* bitmapResource) {
6060
SkSafeRef(bitmapResource->pixelRef());
6161
SkSafeRef(bitmapResource->getColorTable());
62-
incrementRefcount((void*)bitmapResource, kBitmap);
62+
incrementRefcount((void*) bitmapResource, kBitmap);
6363
}
6464

6565
void ResourceCache::incrementRefcount(SkPath* pathResource) {
66-
incrementRefcount((void*)pathResource, kPath);
66+
incrementRefcount((void*) pathResource, kPath);
6767
}
6868

6969
void ResourceCache::incrementRefcount(SkiaShader* shaderResource) {

0 commit comments

Comments
 (0)