diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2017-08-04 07:14:23 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2017-08-04 07:14:23 +0000 |
commit | 471b8351a526e3228a1bf90453782fddcb1cb86b (patch) | |
tree | eaaaa68312b360ce9493b14a04e4d92088d1e5b7 | |
parent | 92e5233608d38cc2af457e963971376fe9331f3f (diff) | |
parent | e018119bb3f3c231ca01a3ef407f715718a549ff (diff) | |
download | native-471b8351a526e3228a1bf90453782fddcb1cb86b.tar.gz |
release-request-c1d158b7-bec8-489c-b291-f2070225a3d9-for-git_oc-dr1-release-4245011 snap-temp-L08000000089163353
Change-Id: Idf1dfbe126a2d05b68c490e4ae68a270fa00b55d
-rw-r--r-- | libs/vr/libbufferhubqueue/buffer_hub_queue_client.cpp | 6 | ||||
-rw-r--r-- | libs/vr/libvrflinger/display_surface.cpp | 3 | ||||
-rw-r--r-- | libs/vr/libvrflinger/display_surface.h | 1 | ||||
-rw-r--r-- | services/surfaceflinger/DisplayDevice.h | 1 | ||||
-rw-r--r-- | services/surfaceflinger/Layer.h | 8 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 35 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 4 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger_hwc1.cpp | 15 |
8 files changed, 48 insertions, 25 deletions
diff --git a/libs/vr/libbufferhubqueue/buffer_hub_queue_client.cpp b/libs/vr/libbufferhubqueue/buffer_hub_queue_client.cpp index 38603905aa..bfb9a55e93 100644 --- a/libs/vr/libbufferhubqueue/buffer_hub_queue_client.cpp +++ b/libs/vr/libbufferhubqueue/buffer_hub_queue_client.cpp @@ -613,6 +613,12 @@ Status<size_t> ConsumerQueue::ImportBuffers() { std::unique_ptr<BufferConsumer> buffer_consumer = BufferConsumer::Import(std::move(buffer_handle_slot.first)); + if (!buffer_consumer) { + ALOGE("ConsumerQueue::ImportBuffers: Failed to import buffer: slot=%zu", + buffer_handle_slot.second); + last_error = ErrorStatus(EPIPE); + continue; + } // Setup ignore state before adding buffer to the queue. if (ignore_on_import_) { diff --git a/libs/vr/libvrflinger/display_surface.cpp b/libs/vr/libvrflinger/display_surface.cpp index 04e3d5f3c5..0d6a732a8e 100644 --- a/libs/vr/libvrflinger/display_surface.cpp +++ b/libs/vr/libvrflinger/display_surface.cpp @@ -194,6 +194,7 @@ std::shared_ptr<ConsumerQueue> ApplicationDisplaySurface::GetQueue( "ApplicationDisplaySurface::GetQueue: surface_id=%d queue_id=%d", surface_id(), queue_id); + std::lock_guard<std::mutex> autolock(lock_); auto search = consumer_queues_.find(queue_id); if (search != consumer_queues_.end()) return search->second; @@ -202,6 +203,7 @@ std::shared_ptr<ConsumerQueue> ApplicationDisplaySurface::GetQueue( } std::vector<int32_t> ApplicationDisplaySurface::GetQueueIds() const { + std::lock_guard<std::mutex> autolock(lock_); std::vector<int32_t> queue_ids; for (const auto& entry : consumer_queues_) queue_ids.push_back(entry.first); @@ -270,6 +272,7 @@ void ApplicationDisplaySurface::OnQueueEvent( } std::vector<int32_t> DirectDisplaySurface::GetQueueIds() const { + std::lock_guard<std::mutex> autolock(lock_); std::vector<int32_t> queue_ids; if (direct_queue_) queue_ids.push_back(direct_queue_->id()); diff --git a/libs/vr/libvrflinger/display_surface.h b/libs/vr/libvrflinger/display_surface.h index 556183a4e9..5cbee57bf9 100644 --- a/libs/vr/libvrflinger/display_surface.h +++ b/libs/vr/libvrflinger/display_surface.h @@ -133,6 +133,7 @@ class ApplicationDisplaySurface : public DisplaySurface { void OnQueueEvent(const std::shared_ptr<ConsumerQueue>& consumer_queue, int events) override; + // Accessed by both message dispatch thread and epoll event thread. std::unordered_map<int32_t, std::shared_ptr<ConsumerQueue>> consumer_queues_; }; diff --git a/services/surfaceflinger/DisplayDevice.h b/services/surfaceflinger/DisplayDevice.h index 578f81b690..8636e2af79 100644 --- a/services/surfaceflinger/DisplayDevice.h +++ b/services/surfaceflinger/DisplayDevice.h @@ -141,6 +141,7 @@ public: uint32_t getLayerStack() const { return mLayerStack; } int32_t getDisplayType() const { return mType; } + bool isPrimary() const { return mType == DISPLAY_PRIMARY; } int32_t getHwcDisplayId() const { return mHwcDisplayId; } const wp<IBinder>& getDisplayToken() const { return mDisplayToken; } diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 392479fb2c..2306d1a43a 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -166,6 +166,8 @@ public: virtual ~Layer(); + void setPrimaryDisplayOnly() { mPrimaryDisplayOnly = true; } + // the this layer's size and format status_t setBuffers(uint32_t w, uint32_t h, PixelFormat format, uint32_t flags); @@ -249,6 +251,10 @@ public: uint32_t getTransactionFlags(uint32_t flags); uint32_t setTransactionFlags(uint32_t flags); + bool belongsToDisplay(uint32_t layerStack, bool isPrimaryDisplay) const { + return getLayerStack() == layerStack && (!mPrimaryDisplayOnly || isPrimaryDisplay); + } + void computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh, bool useIdentityTransform) const; Rect computeBounds(const Region& activeTransparentRegion) const; @@ -701,6 +707,8 @@ private: String8 mTransactionName; // A cached version of "TX - " + mName for systraces PixelFormat mFormat; + bool mPrimaryDisplayOnly = false; + // these are protected by an external lock State mCurrentState; State mDrawingState; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 702f32f197..0f6c581e14 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -1684,12 +1684,11 @@ void SurfaceFlinger::rebuildLayerStacks() { const Transform& tr(displayDevice->getTransform()); const Rect bounds(displayDevice->getBounds()); if (displayDevice->isDisplayOn()) { - computeVisibleRegions( - displayDevice->getLayerStack(), dirtyRegion, - opaqueRegion); + computeVisibleRegions(displayDevice, dirtyRegion, opaqueRegion); mDrawingState.traverseInZOrder([&](Layer* layer) { - if (layer->getLayerStack() == displayDevice->getLayerStack()) { + if (layer->belongsToDisplay(displayDevice->getLayerStack(), + displayDevice->isPrimary())) { Region drawRegion(tr.transform( layer->visibleNonTransparentRegion)); drawRegion.andSelf(bounds); @@ -2211,7 +2210,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) disp.clear(); for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { sp<const DisplayDevice> hw(mDisplays[dpy]); - if (hw->getLayerStack() == currentlayerStack) { + if (layer->belongsToDisplay(hw->getLayerStack(), hw->isPrimary())) { if (disp == NULL) { disp = hw; } else { @@ -2260,7 +2259,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) // TODO: we could cache the transformed region Region visibleReg; visibleReg.set(layer->computeScreenBounds()); - invalidateLayerStack(layer->getLayerStack(), visibleReg); + invalidateLayerStack(layer, visibleReg); } }); } @@ -2309,7 +2308,7 @@ void SurfaceFlinger::commitTransaction() mTransactionCV.broadcast(); } -void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, +void SurfaceFlinger::computeVisibleRegions(const sp<const DisplayDevice>& displayDevice, Region& outDirtyRegion, Region& outOpaqueRegion) { ATRACE_CALL(); @@ -2326,7 +2325,7 @@ void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, const Layer::State& s(layer->getDrawingState()); // only consider the layers on the given layer stack - if (layer->getLayerStack() != layerStack) + if (!layer->belongsToDisplay(displayDevice->getLayerStack(), displayDevice->isPrimary())) return; /* @@ -2441,11 +2440,10 @@ void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, outOpaqueRegion = aboveOpaqueLayers; } -void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack, - const Region& dirty) { +void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty) { for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { const sp<DisplayDevice>& hw(mDisplays[dpy]); - if (hw->getLayerStack() == layerStack) { + if (layer->belongsToDisplay(hw->getLayerStack(), hw->isPrimary())) { hw->dirtyRegion.orSelf(dirty); } } @@ -2486,7 +2484,7 @@ bool SurfaceFlinger::handlePageFlip() for (auto& layer : mLayersWithQueuedFrames) { const Region dirty(layer->latchBuffer(visibleRegions, latchTime)); layer->useSurfaceDamage(); - invalidateLayerStack(layer->getLayerStack(), dirty); + invalidateLayerStack(layer, dirty); if (layer->isBufferLatched()) { newDataLatched = true; } @@ -3108,6 +3106,13 @@ status_t SurfaceFlinger::createLayer( return result; } + // window type is WINDOW_TYPE_DONT_SCREENSHOT from SurfaceControl.java + // TODO b/64227542 + if (windowType == 441731) { + windowType = 2024; // TYPE_NAVIGATION_BAR_PANEL + layer->setPrimaryDisplayOnly(); + } + layer->setInfo(windowType, ownerUid); result = addClientLayer(client, *handle, *gbp, layer, *parent); @@ -4335,7 +4340,7 @@ void SurfaceFlinger::renderScreenImplLocked( // We loop through the first level of layers without traversing, // as we need to interpret min/max layer Z in the top level Z space. for (const auto& layer : mDrawingState.layersSortedByZ) { - if (layer->getLayerStack() != hw->getLayerStack()) { + if (!layer->belongsToDisplay(hw->getLayerStack(), false)) { continue; } const Layer::State& state(layer->getDrawingState()); @@ -4387,7 +4392,7 @@ status_t SurfaceFlinger::captureScreenImplLocked(const sp<const DisplayDevice>& bool secureLayerIsVisible = false; for (const auto& layer : mDrawingState.layersSortedByZ) { const Layer::State& state(layer->getDrawingState()); - if ((layer->getLayerStack() != hw->getLayerStack()) || + if (layer->belongsToDisplay(hw->getLayerStack(), false) || (state.z < minLayerZ || state.z > maxLayerZ)) { continue; } @@ -4498,7 +4503,7 @@ void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* v size_t i = 0; for (const auto& layer : mDrawingState.layersSortedByZ) { const Layer::State& state(layer->getDrawingState()); - if (layer->getLayerStack() == hw->getLayerStack() && state.z >= minLayerZ && + if (layer->belongsToDisplay(hw->getLayerStack(), false) && state.z >= minLayerZ && state.z <= maxLayerZ) { layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) { ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%.3f", diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 48bbd13b52..acfad46526 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -494,7 +494,7 @@ private: // mark a region of a layer stack dirty. this updates the dirty // region of all screens presenting this layer stack. - void invalidateLayerStack(uint32_t layerStack, const Region& dirty); + void invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty); #ifndef USE_HWC2 int32_t allocateHwcDisplayId(DisplayDevice::DisplayType type); @@ -510,7 +510,7 @@ private: * Compositing */ void invalidateHwcGeometry(); - void computeVisibleRegions(uint32_t layerStack, + void computeVisibleRegions(const sp<const DisplayDevice>& displayDevice, Region& dirtyRegion, Region& opaqueRegion); void preComposition(nsecs_t refreshStartTime); diff --git a/services/surfaceflinger/SurfaceFlinger_hwc1.cpp b/services/surfaceflinger/SurfaceFlinger_hwc1.cpp index 2b56928c3d..247d80bc07 100644 --- a/services/surfaceflinger/SurfaceFlinger_hwc1.cpp +++ b/services/surfaceflinger/SurfaceFlinger_hwc1.cpp @@ -1361,8 +1361,7 @@ void SurfaceFlinger::rebuildLayerStacks() { const Transform& tr(hw->getTransform()); const Rect bounds(hw->getBounds()); if (hw->isDisplayOn()) { - computeVisibleRegions(hw->getLayerStack(), dirtyRegion, - opaqueRegion); + computeVisibleRegions(hw, dirtyRegion, opaqueRegion); mDrawingState.traverseInZOrder([&](Layer* layer) { if (layer->getLayerStack() == hw->getLayerStack()) { @@ -1863,7 +1862,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) // TODO: we could cache the transformed region Region visibleReg; visibleReg.set(layer->computeScreenBounds()); - invalidateLayerStack(layer->getLayerStack(), visibleReg); + invalidateLayerStack(layer, visibleReg); } }); } @@ -1924,7 +1923,7 @@ void SurfaceFlinger::commitTransaction() mTransactionCV.broadcast(); } -void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, +void SurfaceFlinger::computeVisibleRegions(const sp<const DisplayDevice>& displayDevice, Region& outDirtyRegion, Region& outOpaqueRegion) { ATRACE_CALL(); @@ -1940,7 +1939,7 @@ void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, const Layer::State& s(layer->getDrawingState()); // only consider the layers on the given layer stack - if (layer->getLayerStack() != layerStack) + if (layer->getLayerStack() != displayDevice->getLayerStack()) return; /* @@ -2055,8 +2054,8 @@ void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack, outOpaqueRegion = aboveOpaqueLayers; } -void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack, - const Region& dirty) { +void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty) { + uint32_t layerStack = layer->getLayerStack(); for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) { const sp<DisplayDevice>& hw(mDisplays[dpy]); if (hw->getLayerStack() == layerStack) { @@ -2099,7 +2098,7 @@ bool SurfaceFlinger::handlePageFlip() Layer* layer = layersWithQueuedFrames[i]; const Region dirty(layer->latchBuffer(visibleRegions, latchTime)); layer->useSurfaceDamage(); - invalidateLayerStack(layer->getLayerStack(), dirty); + invalidateLayerStack(layer, dirty); } mVisibleRegionsDirty |= visibleRegions; |