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
Change-Id: I8fa17beed57936648c7b4defc9219dff1d5b337f
diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
index 0859149..d37fcb2 100644
--- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp
+++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
@@ -1036,12 +1036,10 @@
}
}
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)) {
@@ -1055,8 +1053,9 @@
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);
@@ -1078,29 +1077,15 @@
}
}
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;
};
/*