diff options
author | Mathias Agopian <mathias@google.com> | 2009-09-17 01:35:28 -0700 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2009-09-17 01:35:28 -0700 |
commit | bcef9ac35da08b9f7f8a4728af94c23a7a010669 (patch) | |
tree | c13c342c0265bc0b94608695d90e3edb6f54a918 | |
parent | 76f0111845f0886f522cfe1eb5ec1dee34181f7c (diff) | |
download | frameworks_base-bcef9ac35da08b9f7f8a4728af94c23a7a010669.zip frameworks_base-bcef9ac35da08b9f7f8a4728af94c23a7a010669.tar.gz frameworks_base-bcef9ac35da08b9f7f8a4728af94c23a7a010669.tar.bz2 |
add basic time stats for surfaces lock time
-rw-r--r-- | include/private/ui/SharedBufferStack.h | 28 | ||||
-rw-r--r-- | libs/surfaceflinger/SurfaceFlinger.cpp | 5 | ||||
-rw-r--r-- | libs/ui/SharedBufferStack.cpp | 16 |
3 files changed, 38 insertions, 11 deletions
diff --git a/include/private/ui/SharedBufferStack.h b/include/private/ui/SharedBufferStack.h index 8b0f154..c02b2e7 100644 --- a/include/private/ui/SharedBufferStack.h +++ b/include/private/ui/SharedBufferStack.h @@ -69,12 +69,6 @@ class SharedClient; // ---------------------------------------------------------------------------- -struct FlatRegion { // 12 bytes - static const unsigned int NUM_RECT_MAX = 1; - uint32_t count; - uint16_t rects[4*NUM_RECT_MAX]; -}; - // should be 128 bytes (32 longs) class SharedBufferStack { @@ -84,6 +78,18 @@ class SharedBufferStack friend class SharedBufferServer; public: + struct FlatRegion { // 12 bytes + static const unsigned int NUM_RECT_MAX = 1; + uint32_t count; + uint16_t rects[4*NUM_RECT_MAX]; + }; + + struct Statistics { // 4 longs + typedef int32_t usecs_t; + usecs_t totalTime; + usecs_t reserved[3]; + }; + SharedBufferStack(); void init(int32_t identity); status_t setDirtyRegion(int buffer, const Region& reg); @@ -100,7 +106,8 @@ public: volatile int32_t reallocMask; int32_t identity; // surface's identity (const) - int32_t reserved32[13]; + int32_t reserved32[9]; + Statistics stats; FlatRegion dirtyRegion[NUM_BUFFER_MAX]; // 12*4=48 bytes }; @@ -223,7 +230,7 @@ public: status_t queue(int buf); bool needNewBuffer(int buffer) const; status_t setDirtyRegion(int buffer, const Region& reg); - + private: friend struct Condition; friend struct DequeueCondition; @@ -257,6 +264,8 @@ private: }; int32_t tail; + // statistics... + nsecs_t mDequeueTime[NUM_BUFFER_MAX]; }; // ---------------------------------------------------------------------------- @@ -275,6 +284,9 @@ public: Region getDirtyRegion(int buffer) const; + SharedBufferStack::Statistics getStats() const; + + private: struct UnlockUpdate : public UpdateBase { const int lockedBuffer; diff --git a/libs/surfaceflinger/SurfaceFlinger.cpp b/libs/surfaceflinger/SurfaceFlinger.cpp index a352431..31b5128 100644 --- a/libs/surfaceflinger/SurfaceFlinger.cpp +++ b/libs/surfaceflinger/SurfaceFlinger.cpp @@ -1521,6 +1521,7 @@ status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args) /*** Layer ***/ sp<Layer> l = LayerBase::dynamicCast< Layer* >(layer.get()); if (l != 0) { + SharedBufferStack::Statistics stats = l->lcblk->getStats(); result.append( l->lcblk->dump(" ") ); sp<const Buffer> buf0(l->getBuffer(0)); sp<const Buffer> buf1(l->getBuffer(1)); @@ -1539,10 +1540,10 @@ status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args) snprintf(buffer, SIZE, " " "format=%2d, [%3ux%3u:%3u] [%3ux%3u:%3u]," - " freezeLock=%p\n", + " freezeLock=%p, dq-q-time=%u us\n", l->pixelFormat(), w0, h0, s0, w1, h1, s1, - l->getFreezeLock().get()); + l->getFreezeLock().get(), stats.totalTime); result.append(buffer); buffer[0] = 0; } diff --git a/libs/ui/SharedBufferStack.cpp b/libs/ui/SharedBufferStack.cpp index 7789a3f..9ad4349 100644 --- a/libs/ui/SharedBufferStack.cpp +++ b/libs/ui/SharedBufferStack.cpp @@ -276,6 +276,8 @@ ssize_t SharedBufferClient::dequeue() LOGW("dequeue: tail=%d, head=%d, avail=%d, queued=%d", tail, stack.head, stack.available, stack.queued); } + + const nsecs_t dequeueTime = systemTime(SYSTEM_TIME_THREAD); //LOGD("[%d] about to dequeue a buffer", // mSharedStack->identity); @@ -296,6 +298,8 @@ ssize_t SharedBufferClient::dequeue() LOGD_IF(DEBUG_ATOMICS, "dequeued=%d, tail=%d, %s", dequeued, tail, dump("").string()); + mDequeueTime[dequeued] = dequeueTime; + return dequeued; } @@ -312,7 +316,7 @@ status_t SharedBufferClient::undoDequeue(int buf) status_t SharedBufferClient::lock(int buf) { LockCondition condition(this, buf); - status_t err = waitForCondition(condition); + status_t err = waitForCondition(condition); return err; } @@ -321,6 +325,9 @@ status_t SharedBufferClient::queue(int buf) QueueUpdate update(this); status_t err = updateCondition( update ); LOGD_IF(DEBUG_ATOMICS, "queued=%d, %s", buf, dump("").string()); + SharedBufferStack& stack( *mSharedStack ); + const nsecs_t now = systemTime(SYSTEM_TIME_THREAD); + stack.stats.totalTime = ns2us(now - mDequeueTime[buf]); return err; } @@ -393,5 +400,12 @@ Region SharedBufferServer::getDirtyRegion(int buffer) const return stack.getDirtyRegion(buffer); } +SharedBufferStack::Statistics SharedBufferServer::getStats() const +{ + SharedBufferStack& stack( *mSharedStack ); + return stack.stats; +} + + // --------------------------------------------------------------------------- }; // namespace android |