Loading libs/hwui/Caches.cpp +18 −0 Original line number Diff line number Diff line Loading @@ -87,6 +87,8 @@ void Caches::init() { lastDstMode = GL_ZERO; currentProgram = NULL; mFunctorsCount = 0; mInitialized = true; } Loading Loading @@ -458,6 +460,22 @@ void Caches::endTiling() { } } bool Caches::hasRegisteredFunctors() { return mFunctorsCount > 0; } void Caches::registerFunctors(uint32_t functorCount) { mFunctorsCount += functorCount; } void Caches::unregisterFunctors(uint32_t functorCount) { if (functorCount > mFunctorsCount) { mFunctorsCount = 0; } else { mFunctorsCount -= functorCount; } } /////////////////////////////////////////////////////////////////////////////// // Regions /////////////////////////////////////////////////////////////////////////////// Loading libs/hwui/Caches.h +6 −0 Original line number Diff line number Diff line Loading @@ -226,6 +226,10 @@ public: void dumpMemoryUsage(); void dumpMemoryUsage(String8& log); bool hasRegisteredFunctors(); void registerFunctors(uint32_t functorCount); void unregisterFunctors(uint32_t functorCount); bool blend; GLenum lastSrcMode; GLenum lastDstMode; Loading Loading @@ -316,6 +320,8 @@ private: DebugLevel mDebugLevel; bool mInitialized; uint32_t mFunctorsCount; }; // class Caches }; // namespace uirenderer Loading libs/hwui/DisplayListRenderer.cpp +9 −1 Original line number Diff line number Diff line Loading @@ -157,6 +157,7 @@ void DisplayList::clearResources() { mAnimationMatrix = NULL; Caches& caches = Caches::getInstance(); caches.unregisterFunctors(mFunctorCount); caches.resourceCache.lock(); for (size_t i = 0; i < mBitmapResources.size(); i++) { Loading Loading @@ -218,6 +219,7 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde init(); if (writer.size() == 0) { mFunctorCount = 0; return; } Loading @@ -232,7 +234,10 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde writer.flatten(buffer); mReader.setMemory(buffer, mSize); mFunctorCount = recorder.getFunctorCount(); Caches& caches = Caches::getInstance(); caches.registerFunctors(mFunctorCount); caches.resourceCache.lock(); const Vector<SkBitmap*>& bitmapResources = recorder.getBitmapResources(); Loading Loading @@ -1340,7 +1345,8 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag DisplayListRenderer::DisplayListRenderer(): mCaches(Caches::getInstance()), mWriter(MIN_WRITER_SIZE), mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false), mHasDrawOps(false) { mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false), mHasDrawOps(false), mFunctorCount(0) { } DisplayListRenderer::~DisplayListRenderer() { Loading Loading @@ -1397,6 +1403,7 @@ void DisplayListRenderer::reset() { mLayers.clear(); mHasDrawOps = false; mFunctorCount = 0; } /////////////////////////////////////////////////////////////////////////////// Loading Loading @@ -1453,6 +1460,7 @@ status_t DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) // Ignore dirty during recording, it matters only when we replay addOp(DisplayList::DrawGLFunction); addInt((int) functor); mFunctorCount++; return DrawGlInfo::kStatusDone; // No invalidate needed at record-time } Loading libs/hwui/DisplayListRenderer.h +7 −0 Original line number Diff line number Diff line Loading @@ -503,6 +503,7 @@ private: size_t mSize; bool mIsRenderable; uint32_t mFunctorCount; String8 mName; Loading Loading @@ -661,6 +662,10 @@ public: return mMatrices; } uint32_t getFunctorCount() const { return mFunctorCount; } private: void insertRestoreToCount() { if (mRestoreSaveCount >= 0) { Loading Loading @@ -887,6 +892,8 @@ private: bool mHasTranslate; bool mHasDrawOps; uint32_t mFunctorCount; friend class DisplayList; }; // class DisplayListRenderer Loading libs/hwui/OpenGLRenderer.cpp +14 −7 Original line number Diff line number Diff line Loading @@ -193,6 +193,11 @@ int OpenGLRenderer::prepareDirty(float left, float top, float right, float botto syncState(); // Functors break the tiling extension in pretty spectacular ways // This ensures we don't use tiling when a functor is going to be // invoked during the frame mSuppressTiling = mCaches.hasRegisteredFunctors(); mTilingSnapshot = mSnapshot; startTiling(mTilingSnapshot, true); Loading Loading @@ -221,6 +226,7 @@ void OpenGLRenderer::syncState() { } void OpenGLRenderer::startTiling(const sp<Snapshot>& s, bool opaque) { if (!mSuppressTiling) { Rect* clip = mTilingSnapshot->clipRect; if (s->flags & Snapshot::kFlagIsFboLayer) { clip = s->clipRect; Loading @@ -229,9 +235,10 @@ void OpenGLRenderer::startTiling(const sp<Snapshot>& s, bool opaque) { mCaches.startTiling(clip->left, s->height - clip->bottom, clip->right - clip->left, clip->bottom - clip->top, opaque); } } void OpenGLRenderer::endTiling() { mCaches.endTiling(); if (!mSuppressTiling) mCaches.endTiling(); } void OpenGLRenderer::finish() { Loading Loading
libs/hwui/Caches.cpp +18 −0 Original line number Diff line number Diff line Loading @@ -87,6 +87,8 @@ void Caches::init() { lastDstMode = GL_ZERO; currentProgram = NULL; mFunctorsCount = 0; mInitialized = true; } Loading Loading @@ -458,6 +460,22 @@ void Caches::endTiling() { } } bool Caches::hasRegisteredFunctors() { return mFunctorsCount > 0; } void Caches::registerFunctors(uint32_t functorCount) { mFunctorsCount += functorCount; } void Caches::unregisterFunctors(uint32_t functorCount) { if (functorCount > mFunctorsCount) { mFunctorsCount = 0; } else { mFunctorsCount -= functorCount; } } /////////////////////////////////////////////////////////////////////////////// // Regions /////////////////////////////////////////////////////////////////////////////// Loading
libs/hwui/Caches.h +6 −0 Original line number Diff line number Diff line Loading @@ -226,6 +226,10 @@ public: void dumpMemoryUsage(); void dumpMemoryUsage(String8& log); bool hasRegisteredFunctors(); void registerFunctors(uint32_t functorCount); void unregisterFunctors(uint32_t functorCount); bool blend; GLenum lastSrcMode; GLenum lastDstMode; Loading Loading @@ -316,6 +320,8 @@ private: DebugLevel mDebugLevel; bool mInitialized; uint32_t mFunctorsCount; }; // class Caches }; // namespace uirenderer Loading
libs/hwui/DisplayListRenderer.cpp +9 −1 Original line number Diff line number Diff line Loading @@ -157,6 +157,7 @@ void DisplayList::clearResources() { mAnimationMatrix = NULL; Caches& caches = Caches::getInstance(); caches.unregisterFunctors(mFunctorCount); caches.resourceCache.lock(); for (size_t i = 0; i < mBitmapResources.size(); i++) { Loading Loading @@ -218,6 +219,7 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde init(); if (writer.size() == 0) { mFunctorCount = 0; return; } Loading @@ -232,7 +234,10 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde writer.flatten(buffer); mReader.setMemory(buffer, mSize); mFunctorCount = recorder.getFunctorCount(); Caches& caches = Caches::getInstance(); caches.registerFunctors(mFunctorCount); caches.resourceCache.lock(); const Vector<SkBitmap*>& bitmapResources = recorder.getBitmapResources(); Loading Loading @@ -1340,7 +1345,8 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag DisplayListRenderer::DisplayListRenderer(): mCaches(Caches::getInstance()), mWriter(MIN_WRITER_SIZE), mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false), mHasDrawOps(false) { mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false), mHasDrawOps(false), mFunctorCount(0) { } DisplayListRenderer::~DisplayListRenderer() { Loading Loading @@ -1397,6 +1403,7 @@ void DisplayListRenderer::reset() { mLayers.clear(); mHasDrawOps = false; mFunctorCount = 0; } /////////////////////////////////////////////////////////////////////////////// Loading Loading @@ -1453,6 +1460,7 @@ status_t DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) // Ignore dirty during recording, it matters only when we replay addOp(DisplayList::DrawGLFunction); addInt((int) functor); mFunctorCount++; return DrawGlInfo::kStatusDone; // No invalidate needed at record-time } Loading
libs/hwui/DisplayListRenderer.h +7 −0 Original line number Diff line number Diff line Loading @@ -503,6 +503,7 @@ private: size_t mSize; bool mIsRenderable; uint32_t mFunctorCount; String8 mName; Loading Loading @@ -661,6 +662,10 @@ public: return mMatrices; } uint32_t getFunctorCount() const { return mFunctorCount; } private: void insertRestoreToCount() { if (mRestoreSaveCount >= 0) { Loading Loading @@ -887,6 +892,8 @@ private: bool mHasTranslate; bool mHasDrawOps; uint32_t mFunctorCount; friend class DisplayList; }; // class DisplayListRenderer Loading
libs/hwui/OpenGLRenderer.cpp +14 −7 Original line number Diff line number Diff line Loading @@ -193,6 +193,11 @@ int OpenGLRenderer::prepareDirty(float left, float top, float right, float botto syncState(); // Functors break the tiling extension in pretty spectacular ways // This ensures we don't use tiling when a functor is going to be // invoked during the frame mSuppressTiling = mCaches.hasRegisteredFunctors(); mTilingSnapshot = mSnapshot; startTiling(mTilingSnapshot, true); Loading Loading @@ -221,6 +226,7 @@ void OpenGLRenderer::syncState() { } void OpenGLRenderer::startTiling(const sp<Snapshot>& s, bool opaque) { if (!mSuppressTiling) { Rect* clip = mTilingSnapshot->clipRect; if (s->flags & Snapshot::kFlagIsFboLayer) { clip = s->clipRect; Loading @@ -229,9 +235,10 @@ void OpenGLRenderer::startTiling(const sp<Snapshot>& s, bool opaque) { mCaches.startTiling(clip->left, s->height - clip->bottom, clip->right - clip->left, clip->bottom - clip->top, opaque); } } void OpenGLRenderer::endTiling() { mCaches.endTiling(); if (!mSuppressTiling) mCaches.endTiling(); } void OpenGLRenderer::finish() { Loading