diff options
author | 2022-05-02 10:38:38 -0400 | |
---|---|---|
committer | 2022-05-03 17:29:35 -0400 | |
commit | 8cedb66717694afe6584edefc0ed95c5dd18f8ed (patch) | |
tree | d70138f20e864d09413028d7a9ced95bc99a5ab7 | |
parent | 77644a2c3166d3f22b24bf26786d4339fd4bbd6c (diff) |
Add traces of the size of HWUI shader cache in RAM
When HWUI needs to either load a shader from or store one to persistent
storage, this means a new shader is in its temporary (RAM) cache. Keep
track of the number and include it in perfetto traces.
As long as we're modifying ::store, make it override the version with
the newer signature, since the old one is deprecated.
Bug: 231194869
Bug: 225211273
Test: manual
Change-Id: I36b7e018291c50ed315f534f15946047ca001300
-rw-r--r-- | libs/hwui/pipeline/skia/ShaderCache.cpp | 6 | ||||
-rw-r--r-- | libs/hwui/pipeline/skia/ShaderCache.h | 9 | ||||
-rw-r--r-- | libs/hwui/tests/unit/ShaderCacheTests.cpp | 10 |
3 files changed, 18 insertions, 7 deletions
diff --git a/libs/hwui/pipeline/skia/ShaderCache.cpp b/libs/hwui/pipeline/skia/ShaderCache.cpp index d9e9aafe91ea..90c4440c8339 100644 --- a/libs/hwui/pipeline/skia/ShaderCache.cpp +++ b/libs/hwui/pipeline/skia/ShaderCache.cpp @@ -136,6 +136,8 @@ sk_sp<SkData> ShaderCache::load(const SkData& key) { free(valueBuffer); return nullptr; } + mNumShadersCachedInRam++; + ATRACE_FORMAT("HWUI RAM cache: %d shaders", mNumShadersCachedInRam); return SkData::MakeFromMalloc(valueBuffer, valueSize); } @@ -182,9 +184,11 @@ void ShaderCache::saveToDiskLocked() { mSavePending = false; } -void ShaderCache::store(const SkData& key, const SkData& data) { +void ShaderCache::store(const SkData& key, const SkData& data, const SkString& /*description*/) { ATRACE_NAME("ShaderCache::store"); std::lock_guard<std::mutex> lock(mMutex); + mNumShadersCachedInRam++; + ATRACE_FORMAT("HWUI RAM cache: %d shaders", mNumShadersCachedInRam); if (!mInitialized) { return; diff --git a/libs/hwui/pipeline/skia/ShaderCache.h b/libs/hwui/pipeline/skia/ShaderCache.h index 4dcc9fb49802..3e0fd5164011 100644 --- a/libs/hwui/pipeline/skia/ShaderCache.h +++ b/libs/hwui/pipeline/skia/ShaderCache.h @@ -73,7 +73,7 @@ public: * "store" attempts to insert a new key/value blob pair into the cache. * This will be called by Skia after it compiled a new SKSL shader */ - void store(const SkData& key, const SkData& data) override; + void store(const SkData& key, const SkData& data, const SkString& description) override; /** * "onVkFrameFlushed" tries to store Vulkan pipeline cache state. @@ -210,6 +210,13 @@ private: */ static constexpr uint8_t sIDKey = 0; + /** + * Most of this class concerns persistent storage for shaders, but it's also + * interesting to keep track of how many shaders are stored in RAM. This + * class provides a convenient entry point for that. + */ + int mNumShadersCachedInRam = 0; + friend class ShaderCacheTestUtils; // used for unit testing }; diff --git a/libs/hwui/tests/unit/ShaderCacheTests.cpp b/libs/hwui/tests/unit/ShaderCacheTests.cpp index 87981f115763..974d85a453db 100644 --- a/libs/hwui/tests/unit/ShaderCacheTests.cpp +++ b/libs/hwui/tests/unit/ShaderCacheTests.cpp @@ -140,9 +140,9 @@ TEST(ShaderCacheTest, testWriteAndRead) { // write to the in-memory cache without storing on disk and verify we read the same values sk_sp<SkData> inVS; setShader(inVS, "sassas"); - ShaderCache::get().store(GrProgramDescTest(100), *inVS.get()); + ShaderCache::get().store(GrProgramDescTest(100), *inVS.get(), SkString()); setShader(inVS, "someVS"); - ShaderCache::get().store(GrProgramDescTest(432), *inVS.get()); + ShaderCache::get().store(GrProgramDescTest(432), *inVS.get(), SkString()); ASSERT_NE((outVS = ShaderCache::get().load(GrProgramDescTest(100))), sk_sp<SkData>()); ASSERT_TRUE(checkShader(outVS, "sassas")); ASSERT_NE((outVS = ShaderCache::get().load(GrProgramDescTest(432))), sk_sp<SkData>()); @@ -166,7 +166,7 @@ TEST(ShaderCacheTest, testWriteAndRead) { // change data, store to disk, read back again and verify data has been changed setShader(inVS, "ewData1"); - ShaderCache::get().store(GrProgramDescTest(432), *inVS.get()); + ShaderCache::get().store(GrProgramDescTest(432), *inVS.get(), SkString()); ShaderCacheTestUtils::terminate(ShaderCache::get(), true); ShaderCache::get().initShaderDiskCache(); ASSERT_NE((outVS2 = ShaderCache::get().load(GrProgramDescTest(432))), sk_sp<SkData>()); @@ -177,7 +177,7 @@ TEST(ShaderCacheTest, testWriteAndRead) { std::vector<uint8_t> dataBuffer(dataSize); genRandomData(dataBuffer); setShader(inVS, dataBuffer); - ShaderCache::get().store(GrProgramDescTest(432), *inVS.get()); + ShaderCache::get().store(GrProgramDescTest(432), *inVS.get(), SkString()); ShaderCacheTestUtils::terminate(ShaderCache::get(), true); ShaderCache::get().initShaderDiskCache(); ASSERT_NE((outVS2 = ShaderCache::get().load(GrProgramDescTest(432))), sk_sp<SkData>()); @@ -225,7 +225,7 @@ TEST(ShaderCacheTest, testCacheValidation) { setShader(data, dataBuffer); blob = std::make_pair(key, data); - ShaderCache::get().store(*key.get(), *data.get()); + ShaderCache::get().store(*key.get(), *data.get(), SkString()); } ShaderCacheTestUtils::terminate(ShaderCache::get(), true); |