diff options
| author | 2016-04-15 21:22:46 +0000 | |
|---|---|---|
| committer | 2016-04-15 21:22:46 +0000 | |
| commit | 12402e34ad453f58e2c9d39fa65772f6cb09a0b6 (patch) | |
| tree | 13a48f5fa24cb2aa3bd05a7051f92e80d2540493 | |
| parent | ccf8058396c3ac8d1e296b9c0ba5f6317cc90661 (diff) | |
| parent | f5abc7801eb008708d31c8f349d4301881c51c89 (diff) | |
Merge "SF: Fix the delivery of visible and damage rects to HWC" into nyc-dev
| -rw-r--r-- | services/surfaceflinger/DisplayHardware/HWComposer_hwc1.cpp | 43 | ||||
| -rw-r--r-- | services/surfaceflinger/DisplayHardware/HWComposer_hwc1.h | 7 |
2 files changed, 36 insertions, 14 deletions
diff --git a/services/surfaceflinger/DisplayHardware/HWComposer_hwc1.cpp b/services/surfaceflinger/DisplayHardware/HWComposer_hwc1.cpp index d37fcb2b8a..4afd8a2dce 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer_hwc1.cpp +++ b/services/surfaceflinger/DisplayHardware/HWComposer_hwc1.cpp @@ -926,16 +926,19 @@ class Iterable : public HWComposer::HWCLayer { protected: HWCTYPE* const mLayerList; HWCTYPE* mCurrentLayer; - Iterable(HWCTYPE* layer) : mLayerList(layer), mCurrentLayer(layer) { } + Iterable(HWCTYPE* layer) : mLayerList(layer), mCurrentLayer(layer), + mIndex(0) { } inline HWCTYPE const * getLayer() const { return mCurrentLayer; } inline HWCTYPE* getLayer() { return mCurrentLayer; } virtual ~Iterable() { } + size_t mIndex; private: // returns a copy of ourselves virtual HWComposer::HWCLayer* dup() { return new CONCRETE( static_cast<const CONCRETE&>(*this) ); } virtual status_t setLayer(size_t index) { + mIndex = index; mCurrentLayer = &mLayerList[index]; return NO_ERROR; } @@ -948,8 +951,12 @@ private: class HWCLayerVersion1 : public Iterable<HWCLayerVersion1, hwc_layer_1_t> { struct hwc_composer_device_1* mHwc; public: - HWCLayerVersion1(struct hwc_composer_device_1* hwc, hwc_layer_1_t* layer) - : Iterable<HWCLayerVersion1, hwc_layer_1_t>(layer), mHwc(hwc) { } + HWCLayerVersion1(struct hwc_composer_device_1* hwc, hwc_layer_1_t* layer, + Vector<Region>* visibleRegions, + Vector<Region>* surfaceDamageRegions) + : Iterable<HWCLayerVersion1, hwc_layer_1_t>(layer), mHwc(hwc), + mVisibleRegions(visibleRegions), + mSurfaceDamageRegions(surfaceDamageRegions) {} virtual int32_t getCompositionType() const { return getLayer()->compositionType; @@ -1037,9 +1044,10 @@ public: } virtual void setVisibleRegionScreen(const Region& reg) { hwc_region_t& visibleRegion = getLayer()->visibleRegionScreen; - mVisibleRegion = reg; + mVisibleRegions->editItemAt(mIndex) = reg; visibleRegion.rects = reinterpret_cast<hwc_rect_t const *>( - mVisibleRegion.getArray(&visibleRegion.numRects)); + mVisibleRegions->itemAt(mIndex).getArray( + &visibleRegion.numRects)); } virtual void setSurfaceDamage(const Region& reg) { if (!hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_5)) { @@ -1053,9 +1061,10 @@ public: surfaceDamage.rects = NULL; return; } - mSurfaceDamage = reg; + mSurfaceDamageRegions->editItemAt(mIndex) = reg; surfaceDamage.rects = reinterpret_cast<hwc_rect_t const *>( - mSurfaceDamage.getArray(&surfaceDamage.numRects)); + mSurfaceDamageRegions->itemAt(mIndex).getArray( + &surfaceDamage.numRects)); } virtual void setSidebandStream(const sp<NativeHandle>& stream) { ALOG_ASSERT(stream->handle() != NULL); @@ -1081,11 +1090,10 @@ public: } 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; + // Pointers to the vectors of Region backing-memory held in DisplayData. + // Only the Region at mIndex corresponds to this Layer. + Vector<Region>* mVisibleRegions; + Vector<Region>* mSurfaceDamageRegions; }; /* @@ -1095,11 +1103,18 @@ HWComposer::LayerListIterator HWComposer::getLayerIterator(int32_t id, size_t in if (uint32_t(id)>31 || !mAllocatedDisplayIDs.hasBit(id)) { return LayerListIterator(); } - const DisplayData& disp(mDisplayData[id]); + DisplayData& disp(mDisplayData[id]); if (!mHwc || !disp.list || index > disp.list->numHwLayers) { return LayerListIterator(); } - return LayerListIterator(new HWCLayerVersion1(mHwc, disp.list->hwLayers), index); + if (disp.visibleRegions.size() < disp.list->numHwLayers) { + disp.visibleRegions.resize(disp.list->numHwLayers); + } + if (disp.surfaceDamageRegions.size() < disp.list->numHwLayers) { + disp.surfaceDamageRegions.resize(disp.list->numHwLayers); + } + return LayerListIterator(new HWCLayerVersion1(mHwc, disp.list->hwLayers, + &disp.visibleRegions, &disp.surfaceDamageRegions), index); } /* diff --git a/services/surfaceflinger/DisplayHardware/HWComposer_hwc1.h b/services/surfaceflinger/DisplayHardware/HWComposer_hwc1.h index f5f7d7702b..c86181781b 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer_hwc1.h +++ b/services/surfaceflinger/DisplayHardware/HWComposer_hwc1.h @@ -346,6 +346,13 @@ private: // protected by mEventControlLock int32_t events; + + // 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. + Vector<Region> visibleRegions; + Vector<Region> surfaceDamageRegions; }; sp<SurfaceFlinger> mFlinger; |