Loading include/private/surfaceflinger/SharedBufferStack.h +12 −8 Original line number Diff line number Diff line Loading @@ -58,7 +58,7 @@ namespace android { // When changing these values, the COMPILE_TIME_ASSERT at the end of this // file need to be updated. const unsigned int NUM_LAYERS_MAX = 31; const unsigned int NUM_BUFFER_MAX = 4; const unsigned int NUM_BUFFER_MAX = 16; const unsigned int NUM_DISPLAY_MAX = 4; // ---------------------------------------------------------------------------- Loading @@ -69,7 +69,11 @@ class SharedClient; // ---------------------------------------------------------------------------- // should be 128 bytes (32 longs) // 4 * (11 + 7 + (1 + 2*NUM_RECT_MAX) * NUM_BUFFER_MAX) * NUM_LAYERS_MAX // 4 * (11 + 7 + (1 + 2*6)*16) * 31 // 904 * 31 // = ~27 KiB (28024) class SharedBufferStack { friend class SharedClient; Loading @@ -78,8 +82,8 @@ class SharedBufferStack friend class SharedBufferServer; public: struct FlatRegion { // 12 bytes static const unsigned int NUM_RECT_MAX = 1; struct FlatRegion { // 52 bytes = 4 * (1 + 2*N) static const unsigned int NUM_RECT_MAX = 6; uint32_t count; uint16_t rects[4*NUM_RECT_MAX]; }; Loading @@ -106,9 +110,10 @@ public: volatile int32_t reallocMask; int32_t identity; // surface's identity (const) int32_t reserved32[9]; int32_t reserved32[6]; Statistics stats; FlatRegion dirtyRegion[NUM_BUFFER_MAX]; // 12*4=48 bytes int32_t reserved; FlatRegion dirtyRegion[NUM_BUFFER_MAX]; // 832 bytes }; // ---------------------------------------------------------------------------- Loading Loading @@ -349,8 +354,7 @@ struct surface_flinger_cblk_t // 4KB max // --------------------------------------------------------------------------- COMPILE_TIME_ASSERT(sizeof(SharedClient) <= 4096) COMPILE_TIME_ASSERT(sizeof(SharedBufferStack) == 128) COMPILE_TIME_ASSERT(sizeof(SharedClient) <= 32768) COMPILE_TIME_ASSERT(sizeof(surface_flinger_cblk_t) <= 4096) // --------------------------------------------------------------------------- Loading libs/surfaceflinger_client/SharedBufferStack.cpp +34 −8 Original line number Diff line number Diff line Loading @@ -73,13 +73,25 @@ status_t SharedBufferStack::setDirtyRegion(int buffer, const Region& dirty) return BAD_INDEX; // in the current implementation we only send a single rectangle const Rect bounds(dirty.getBounds()); size_t count; Rect const* r = dirty.getArray(&count); FlatRegion& reg(dirtyRegion[buffer]); if (count > FlatRegion::NUM_RECT_MAX) { const Rect bounds(dirty.getBounds()); reg.count = 1; reg.rects[0] = uint16_t(bounds.left); reg.rects[1] = uint16_t(bounds.top); reg.rects[2] = uint16_t(bounds.right); reg.rects[3] = uint16_t(bounds.bottom); } else { reg.count = count; for (size_t i=0 ; i<count ; i++) { reg.rects[i*4 + 0] = uint16_t(r[i].left); reg.rects[i*4 + 1] = uint16_t(r[i].top); reg.rects[i*4 + 2] = uint16_t(r[i].right); reg.rects[i*4 + 3] = uint16_t(r[i].bottom); } } return NO_ERROR; } Loading @@ -90,7 +102,21 @@ Region SharedBufferStack::getDirtyRegion(int buffer) const return res; const FlatRegion& reg(dirtyRegion[buffer]); if (reg.count > FlatRegion::NUM_RECT_MAX) return res; if (reg.count == 1) { res.set(Rect(reg.rects[0], reg.rects[1], reg.rects[2], reg.rects[3])); } else { for (size_t i=0 ; i<reg.count ; i++) { const Rect r( reg.rects[i*4 + 0], reg.rects[i*4 + 1], reg.rects[i*4 + 2], reg.rects[i*4 + 3]); res.orSelf(r); } } return res; } Loading Loading @@ -280,7 +306,7 @@ ssize_t SharedBufferClient::dequeue() { SharedBufferStack& stack( *mSharedStack ); if (stack.head == tail && stack.available == 2) { if (stack.head == tail && stack.available == mNumBuffers) { LOGW("dequeue: tail=%d, head=%d, avail=%d, queued=%d", tail, stack.head, stack.available, stack.queued); } Loading Loading
include/private/surfaceflinger/SharedBufferStack.h +12 −8 Original line number Diff line number Diff line Loading @@ -58,7 +58,7 @@ namespace android { // When changing these values, the COMPILE_TIME_ASSERT at the end of this // file need to be updated. const unsigned int NUM_LAYERS_MAX = 31; const unsigned int NUM_BUFFER_MAX = 4; const unsigned int NUM_BUFFER_MAX = 16; const unsigned int NUM_DISPLAY_MAX = 4; // ---------------------------------------------------------------------------- Loading @@ -69,7 +69,11 @@ class SharedClient; // ---------------------------------------------------------------------------- // should be 128 bytes (32 longs) // 4 * (11 + 7 + (1 + 2*NUM_RECT_MAX) * NUM_BUFFER_MAX) * NUM_LAYERS_MAX // 4 * (11 + 7 + (1 + 2*6)*16) * 31 // 904 * 31 // = ~27 KiB (28024) class SharedBufferStack { friend class SharedClient; Loading @@ -78,8 +82,8 @@ class SharedBufferStack friend class SharedBufferServer; public: struct FlatRegion { // 12 bytes static const unsigned int NUM_RECT_MAX = 1; struct FlatRegion { // 52 bytes = 4 * (1 + 2*N) static const unsigned int NUM_RECT_MAX = 6; uint32_t count; uint16_t rects[4*NUM_RECT_MAX]; }; Loading @@ -106,9 +110,10 @@ public: volatile int32_t reallocMask; int32_t identity; // surface's identity (const) int32_t reserved32[9]; int32_t reserved32[6]; Statistics stats; FlatRegion dirtyRegion[NUM_BUFFER_MAX]; // 12*4=48 bytes int32_t reserved; FlatRegion dirtyRegion[NUM_BUFFER_MAX]; // 832 bytes }; // ---------------------------------------------------------------------------- Loading Loading @@ -349,8 +354,7 @@ struct surface_flinger_cblk_t // 4KB max // --------------------------------------------------------------------------- COMPILE_TIME_ASSERT(sizeof(SharedClient) <= 4096) COMPILE_TIME_ASSERT(sizeof(SharedBufferStack) == 128) COMPILE_TIME_ASSERT(sizeof(SharedClient) <= 32768) COMPILE_TIME_ASSERT(sizeof(surface_flinger_cblk_t) <= 4096) // --------------------------------------------------------------------------- Loading
libs/surfaceflinger_client/SharedBufferStack.cpp +34 −8 Original line number Diff line number Diff line Loading @@ -73,13 +73,25 @@ status_t SharedBufferStack::setDirtyRegion(int buffer, const Region& dirty) return BAD_INDEX; // in the current implementation we only send a single rectangle const Rect bounds(dirty.getBounds()); size_t count; Rect const* r = dirty.getArray(&count); FlatRegion& reg(dirtyRegion[buffer]); if (count > FlatRegion::NUM_RECT_MAX) { const Rect bounds(dirty.getBounds()); reg.count = 1; reg.rects[0] = uint16_t(bounds.left); reg.rects[1] = uint16_t(bounds.top); reg.rects[2] = uint16_t(bounds.right); reg.rects[3] = uint16_t(bounds.bottom); } else { reg.count = count; for (size_t i=0 ; i<count ; i++) { reg.rects[i*4 + 0] = uint16_t(r[i].left); reg.rects[i*4 + 1] = uint16_t(r[i].top); reg.rects[i*4 + 2] = uint16_t(r[i].right); reg.rects[i*4 + 3] = uint16_t(r[i].bottom); } } return NO_ERROR; } Loading @@ -90,7 +102,21 @@ Region SharedBufferStack::getDirtyRegion(int buffer) const return res; const FlatRegion& reg(dirtyRegion[buffer]); if (reg.count > FlatRegion::NUM_RECT_MAX) return res; if (reg.count == 1) { res.set(Rect(reg.rects[0], reg.rects[1], reg.rects[2], reg.rects[3])); } else { for (size_t i=0 ; i<reg.count ; i++) { const Rect r( reg.rects[i*4 + 0], reg.rects[i*4 + 1], reg.rects[i*4 + 2], reg.rects[i*4 + 3]); res.orSelf(r); } } return res; } Loading Loading @@ -280,7 +306,7 @@ ssize_t SharedBufferClient::dequeue() { SharedBufferStack& stack( *mSharedStack ); if (stack.head == tail && stack.available == 2) { if (stack.head == tail && stack.available == mNumBuffers) { LOGW("dequeue: tail=%d, head=%d, avail=%d, queued=%d", tail, stack.head, stack.available, stack.queued); } Loading