am bcef9ac3: add basic time stats for surfaces lock time

Merge commit 'bcef9ac35da08b9f7f8a4728af94c23a7a010669' into eclair-plus-aosp

* commit 'bcef9ac35da08b9f7f8a4728af94c23a7a010669':
  add basic time stats for surfaces lock time
This commit is contained in:
Mathias Agopian
2009-09-17 08:47:04 -07:00
committed by Android Git Automerger
3 changed files with 38 additions and 11 deletions

View File

@@ -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) // should be 128 bytes (32 longs)
class SharedBufferStack class SharedBufferStack
{ {
@@ -84,6 +78,18 @@ class SharedBufferStack
friend class SharedBufferServer; friend class SharedBufferServer;
public: 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(); SharedBufferStack();
void init(int32_t identity); void init(int32_t identity);
status_t setDirtyRegion(int buffer, const Region& reg); status_t setDirtyRegion(int buffer, const Region& reg);
@@ -100,7 +106,8 @@ public:
volatile int32_t reallocMask; volatile int32_t reallocMask;
int32_t identity; // surface's identity (const) 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 FlatRegion dirtyRegion[NUM_BUFFER_MAX]; // 12*4=48 bytes
}; };
@@ -223,7 +230,7 @@ public:
status_t queue(int buf); status_t queue(int buf);
bool needNewBuffer(int buffer) const; bool needNewBuffer(int buffer) const;
status_t setDirtyRegion(int buffer, const Region& reg); status_t setDirtyRegion(int buffer, const Region& reg);
private: private:
friend struct Condition; friend struct Condition;
friend struct DequeueCondition; friend struct DequeueCondition;
@@ -257,6 +264,8 @@ private:
}; };
int32_t tail; int32_t tail;
// statistics...
nsecs_t mDequeueTime[NUM_BUFFER_MAX];
}; };
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -275,6 +284,9 @@ public:
Region getDirtyRegion(int buffer) const; Region getDirtyRegion(int buffer) const;
SharedBufferStack::Statistics getStats() const;
private: private:
struct UnlockUpdate : public UpdateBase { struct UnlockUpdate : public UpdateBase {
const int lockedBuffer; const int lockedBuffer;

View File

@@ -1521,6 +1521,7 @@ status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
/*** Layer ***/ /*** Layer ***/
sp<Layer> l = LayerBase::dynamicCast< Layer* >(layer.get()); sp<Layer> l = LayerBase::dynamicCast< Layer* >(layer.get());
if (l != 0) { if (l != 0) {
SharedBufferStack::Statistics stats = l->lcblk->getStats();
result.append( l->lcblk->dump(" ") ); result.append( l->lcblk->dump(" ") );
sp<const Buffer> buf0(l->getBuffer(0)); sp<const Buffer> buf0(l->getBuffer(0));
sp<const Buffer> buf1(l->getBuffer(1)); sp<const Buffer> buf1(l->getBuffer(1));
@@ -1539,10 +1540,10 @@ status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
snprintf(buffer, SIZE, snprintf(buffer, SIZE,
" " " "
"format=%2d, [%3ux%3u:%3u] [%3ux%3u:%3u]," "format=%2d, [%3ux%3u:%3u] [%3ux%3u:%3u],"
" freezeLock=%p\n", " freezeLock=%p, dq-q-time=%u us\n",
l->pixelFormat(), l->pixelFormat(),
w0, h0, s0, w1, h1, s1, w0, h0, s0, w1, h1, s1,
l->getFreezeLock().get()); l->getFreezeLock().get(), stats.totalTime);
result.append(buffer); result.append(buffer);
buffer[0] = 0; buffer[0] = 0;
} }

View File

@@ -276,6 +276,8 @@ ssize_t SharedBufferClient::dequeue()
LOGW("dequeue: tail=%d, head=%d, avail=%d, queued=%d", LOGW("dequeue: tail=%d, head=%d, avail=%d, queued=%d",
tail, stack.head, stack.available, stack.queued); tail, stack.head, stack.available, stack.queued);
} }
const nsecs_t dequeueTime = systemTime(SYSTEM_TIME_THREAD);
//LOGD("[%d] about to dequeue a buffer", //LOGD("[%d] about to dequeue a buffer",
// mSharedStack->identity); // mSharedStack->identity);
@@ -296,6 +298,8 @@ ssize_t SharedBufferClient::dequeue()
LOGD_IF(DEBUG_ATOMICS, "dequeued=%d, tail=%d, %s", LOGD_IF(DEBUG_ATOMICS, "dequeued=%d, tail=%d, %s",
dequeued, tail, dump("").string()); dequeued, tail, dump("").string());
mDequeueTime[dequeued] = dequeueTime;
return dequeued; return dequeued;
} }
@@ -312,7 +316,7 @@ status_t SharedBufferClient::undoDequeue(int buf)
status_t SharedBufferClient::lock(int buf) status_t SharedBufferClient::lock(int buf)
{ {
LockCondition condition(this, buf); LockCondition condition(this, buf);
status_t err = waitForCondition(condition); status_t err = waitForCondition(condition);
return err; return err;
} }
@@ -321,6 +325,9 @@ status_t SharedBufferClient::queue(int buf)
QueueUpdate update(this); QueueUpdate update(this);
status_t err = updateCondition( update ); status_t err = updateCondition( update );
LOGD_IF(DEBUG_ATOMICS, "queued=%d, %s", buf, dump("").string()); 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; return err;
} }
@@ -393,5 +400,12 @@ Region SharedBufferServer::getDirtyRegion(int buffer) const
return stack.getDirtyRegion(buffer); return stack.getDirtyRegion(buffer);
} }
SharedBufferStack::Statistics SharedBufferServer::getStats() const
{
SharedBufferStack& stack( *mSharedStack );
return stack.stats;
}
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
}; // namespace android }; // namespace android