From 83809fec686b47da73ee0aaa80d226de7e33aab9 Mon Sep 17 00:00:00 2001 From: sergeyv Date: Wed, 1 Feb 2017 10:27:33 -0800 Subject: [PATCH] Properly clear textures for Hardware Bitmaps Test: manual (Description in the bug) bug:34858530 Change-Id: I13eb89077c43ca28436509a7af5b7c11374446c4 --- libs/hwui/Android.mk | 1 + libs/hwui/TextureCache.cpp | 6 ++++- libs/hwui/debug/nullegl.cpp | 13 ++++++++++ libs/hwui/tests/unit/TextureCacheTests.cpp | 39 ++++++++++++++++++++++++++++++ 4 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 libs/hwui/tests/unit/TextureCacheTests.cpp diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk index 138a5ef7c285..a799fdffd80e 100644 --- a/libs/hwui/Android.mk +++ b/libs/hwui/Android.mk @@ -316,6 +316,7 @@ LOCAL_SRC_FILES += \ tests/unit/StringUtilsTests.cpp \ tests/unit/TestUtilsTests.cpp \ tests/unit/TextDropShadowCacheTests.cpp \ + tests/unit/TextureCacheTests.cpp \ tests/unit/VectorDrawableTests.cpp \ include $(LOCAL_PATH)/hwui_static_deps.mk diff --git a/libs/hwui/TextureCache.cpp b/libs/hwui/TextureCache.cpp index 1aeb8d684a29..63a6a2c8c89c 100644 --- a/libs/hwui/TextureCache.cpp +++ b/libs/hwui/TextureCache.cpp @@ -46,7 +46,7 @@ TextureCache::TextureCache() } TextureCache::~TextureCache() { - mCache.clear(); + this->clear(); } /////////////////////////////////////////////////////////////////////////////// @@ -214,6 +214,10 @@ void TextureCache::clearGarbage() { void TextureCache::clear() { mCache.clear(); + for(auto& iter: mHardwareTextures) { + iter.second->deleteTexture(); + } + mHardwareTextures.clear(); TEXTURE_LOGD("TextureCache:clear(), mSize = %d", mSize); } diff --git a/libs/hwui/debug/nullegl.cpp b/libs/hwui/debug/nullegl.cpp index 1ce180dd7543..2ae71df5c22c 100644 --- a/libs/hwui/debug/nullegl.cpp +++ b/libs/hwui/debug/nullegl.cpp @@ -22,6 +22,7 @@ #include static EGLDisplay gDisplay = (EGLDisplay) 1; +static EGLSyncKHR gFence = (EGLSyncKHR) 1; typedef struct { EGLSurface surface; @@ -159,6 +160,18 @@ EGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EG return (EGLImageKHR) malloc(sizeof(EGLImageKHR)); } +EGLSyncKHR eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list) { + return gFence; +} + +EGLBoolean eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync) { + return EGL_TRUE; +} + +EGLint eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout) { + return EGL_CONDITION_SATISFIED_KHR; +} + EGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image) { free(image); return EGL_TRUE; diff --git a/libs/hwui/tests/unit/TextureCacheTests.cpp b/libs/hwui/tests/unit/TextureCacheTests.cpp new file mode 100644 index 000000000000..72384bfa87d8 --- /dev/null +++ b/libs/hwui/tests/unit/TextureCacheTests.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "Extensions.h" +#include "TextureCache.h" +#include "tests/common/TestUtils.h" + +using namespace android; +using namespace android::uirenderer; + +RENDERTHREAD_OPENGL_PIPELINE_TEST(TextureCache, clear) { + TextureCache cache; + ASSERT_EQ(cache.getSize(), 0u); + // it is not 0, because FontRenderer allocates one texture + int initialCount = GpuMemoryTracker::getInstanceCount(GpuObjectType::Texture); + SkBitmap skBitmap; + SkImageInfo info = SkImageInfo::Make(100, 100, kN32_SkColorType, kPremul_SkAlphaType); + skBitmap.setInfo(info); + sk_sp hwBitmap(Bitmap::allocateHardwareBitmap(renderThread, skBitmap)); + cache.get(hwBitmap.get()); + ASSERT_EQ(GpuMemoryTracker::getInstanceCount(GpuObjectType::Texture), initialCount + 1); + cache.clear(); + ASSERT_EQ(GpuMemoryTracker::getInstanceCount(GpuObjectType::Texture), initialCount); +} -- 2.11.0