diff options
author | 2015-09-11 14:37:39 -0700 | |
---|---|---|
committer | 2015-09-21 14:24:49 +0100 | |
commit | f53f3c80bf2dcf6c1b70320765f9fc8019b829a2 (patch) | |
tree | 8582ed2cec9f84c9af8d5b2b3fb2ef19daac00d8 | |
parent | c0ed128263f753696cbcb24a5d1a45bc894ae336 (diff) |
Remove usage of SharedBuffer
- Remove getSharedBuffer() from Region
- Don't use SharedBuffer for memory management in HWCLayerVersion1,
instead keep shallow copies of the Regions.
Bug 23962051
(cherry picked from commit d814cf2a3e3a2fdb73efa80539fe8af0a93da1db)
Change-Id: I8fa17beed57936648c7b4defc9219dff1d5b337f
-rw-r--r-- | include/ui/Region.h | 5 | ||||
-rw-r--r-- | libs/ui/Region.cpp | 12 | ||||
-rw-r--r-- | services/surfaceflinger/DisplayHardware/HWComposer.cpp | 41 |
3 files changed, 13 insertions, 45 deletions
diff --git a/include/ui/Region.h b/include/ui/Region.h index 2a1491837d..e9b3a0bad7 100644 --- a/include/ui/Region.h +++ b/include/ui/Region.h @@ -130,11 +130,6 @@ public: // Region object. Rect const* getArray(size_t* count) const; - // returns a SharedBuffer as well as the number of rects. - // ownership is transfered to the caller. - // the caller must call SharedBuffer::release() to free the memory. - SharedBuffer const* getSharedBuffer(size_t* count) const; - /* no user serviceable parts here... */ // add a rectangle to the internal list. This rectangle must diff --git a/libs/ui/Region.cpp b/libs/ui/Region.cpp index 3810da4049..a3558bd5c2 100644 --- a/libs/ui/Region.cpp +++ b/libs/ui/Region.cpp @@ -835,18 +835,6 @@ Rect const* Region::getArray(size_t* count) const { return begin(); } -SharedBuffer const* Region::getSharedBuffer(size_t* count) const { - // We can get to the SharedBuffer of a Vector<Rect> because Rect has - // a trivial destructor. - SharedBuffer const* sb = SharedBuffer::bufferFromData(mStorage.array()); - if (count) { - size_t numRects = isRect() ? 1 : mStorage.size() - 1; - count[0] = numRects; - } - sb->acquire(); - return sb; -} - // ---------------------------------------------------------------------------- void Region::dump(String8& out, const char* what, uint32_t /* flags */) const diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp index 2dad005171..3208990459 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp +++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp @@ -1017,12 +1017,10 @@ public: } } virtual void setVisibleRegionScreen(const Region& reg) { - // Region::getSharedBuffer creates a reference to the underlying - // SharedBuffer of this Region, this reference is freed - // in onDisplayed() hwc_region_t& visibleRegion = getLayer()->visibleRegionScreen; - SharedBuffer const* sb = reg.getSharedBuffer(&visibleRegion.numRects); - visibleRegion.rects = reinterpret_cast<hwc_rect_t const *>(sb->data()); + mVisibleRegion = reg; + visibleRegion.rects = reinterpret_cast<hwc_rect_t const *>( + mVisibleRegion.getArray(&visibleRegion.numRects)); } virtual void setSurfaceDamage(const Region& reg) { if (!hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_5)) { @@ -1036,8 +1034,9 @@ public: surfaceDamage.rects = NULL; return; } - SharedBuffer const* sb = reg.getSharedBuffer(&surfaceDamage.numRects); - surfaceDamage.rects = reinterpret_cast<hwc_rect_t const *>(sb->data()); + mSurfaceDamage = reg; + surfaceDamage.rects = reinterpret_cast<hwc_rect_t const *>( + mSurfaceDamage.getArray(&surfaceDamage.numRects)); } virtual void setSidebandStream(const sp<NativeHandle>& stream) { ALOG_ASSERT(stream->handle() != NULL); @@ -1059,29 +1058,15 @@ public: } } virtual void onDisplayed() { - hwc_region_t& visibleRegion = getLayer()->visibleRegionScreen; - SharedBuffer const* sb = SharedBuffer::bufferFromData(visibleRegion.rects); - if (sb) { - sb->release(); - // not technically needed but safer - visibleRegion.numRects = 0; - visibleRegion.rects = NULL; - } - getLayer()->acquireFenceFd = -1; - - if (!hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_5)) { - return; - } - - hwc_region_t& surfaceDamage = getLayer()->surfaceDamage; - sb = SharedBuffer::bufferFromData(surfaceDamage.rects); - if (sb) { - sb->release(); - surfaceDamage.numRects = 0; - surfaceDamage.rects = NULL; - } } + +protected: + // We need to hold "copies" of these for memory management purposes. The + // actual hwc_layer_1_t holds pointers to the memory within. Vector<> + // internally doesn't copy the memory unless one of the copies is modified. + Region mVisibleRegion; + Region mSurfaceDamage; }; /* |