diff options
Diffstat (limited to 'services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp')
-rw-r--r-- | services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp | 61 |
1 files changed, 22 insertions, 39 deletions
diff --git a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp index e26ab117b8..fba3261388 100644 --- a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp +++ b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp @@ -57,7 +57,8 @@ static const char* dbgCompositionTypeStr(compositionengine::DisplaySurface::Comp } } -VirtualDisplaySurface::VirtualDisplaySurface(HWComposer& hwc, VirtualDisplayId displayId, +VirtualDisplaySurface::VirtualDisplaySurface(HWComposer& hwc, + const std::optional<DisplayId>& displayId, const sp<IGraphicBufferProducer>& sink, const sp<IGraphicBufferProducer>& bqProducer, const sp<IGraphicBufferConsumer>& bqConsumer, @@ -72,7 +73,6 @@ VirtualDisplaySurface::VirtualDisplaySurface(HWComposer& hwc, VirtualDisplayId d mOutputUsage(GRALLOC_USAGE_HW_COMPOSER), mProducerSlotSource(0), mProducerBuffers(), - mProducerSlotNeedReallocation(0), mQueueBufferOutput(), mSinkBufferWidth(0), mSinkBufferHeight(0), @@ -125,7 +125,7 @@ VirtualDisplaySurface::~VirtualDisplaySurface() { } status_t VirtualDisplaySurface::beginFrame(bool mustRecompose) { - if (GpuVirtualDisplayId::tryCast(mDisplayId)) { + if (!mDisplayId) { return NO_ERROR; } @@ -139,7 +139,7 @@ status_t VirtualDisplaySurface::beginFrame(bool mustRecompose) { } status_t VirtualDisplaySurface::prepareFrame(CompositionType compositionType) { - if (GpuVirtualDisplayId::tryCast(mDisplayId)) { + if (!mDisplayId) { return NO_ERROR; } @@ -187,7 +187,7 @@ status_t VirtualDisplaySurface::prepareFrame(CompositionType compositionType) { } status_t VirtualDisplaySurface::advanceFrame() { - if (GpuVirtualDisplayId::tryCast(mDisplayId)) { + if (!mDisplayId) { return NO_ERROR; } @@ -219,11 +219,9 @@ status_t VirtualDisplaySurface::advanceFrame() { mFbProducerSlot, fbBuffer.get(), mOutputProducerSlot, outBuffer.get()); - const auto halDisplayId = HalVirtualDisplayId::tryCast(mDisplayId); - LOG_FATAL_IF(!halDisplayId); // At this point we know the output buffer acquire fence, // so update HWC state with it. - mHwc.setOutputBuffer(*halDisplayId, mOutputFence, outBuffer); + mHwc.setOutputBuffer(*mDisplayId, mOutputFence, outBuffer); status_t result = NO_ERROR; if (fbBuffer != nullptr) { @@ -232,7 +230,7 @@ status_t VirtualDisplaySurface::advanceFrame() { mHwcBufferCache.getHwcBuffer(mFbProducerSlot, fbBuffer, &hwcSlot, &hwcBuffer); // TODO: Correctly propagate the dataspace from GL composition - result = mHwc.setClientTarget(*halDisplayId, hwcSlot, mFbFence, hwcBuffer, + result = mHwc.setClientTarget(*mDisplayId, hwcSlot, mFbFence, hwcBuffer, ui::Dataspace::UNKNOWN); } @@ -240,8 +238,7 @@ status_t VirtualDisplaySurface::advanceFrame() { } void VirtualDisplaySurface::onFrameCommitted() { - const auto halDisplayId = HalVirtualDisplayId::tryCast(mDisplayId); - if (!halDisplayId) { + if (!mDisplayId) { return; } @@ -249,7 +246,7 @@ void VirtualDisplaySurface::onFrameCommitted() { "Unexpected onFrameCommitted() in %s state", dbgStateStr()); mDbgState = DBG_STATE_IDLE; - sp<Fence> retireFence = mHwc.getPresentFence(*halDisplayId); + sp<Fence> retireFence = mHwc.getPresentFence(*mDisplayId); if (mCompositionType == COMPOSITION_MIXED && mFbProducerSlot >= 0) { // release the scratch buffer back to the pool Mutex::Autolock lock(mMutex); @@ -291,11 +288,11 @@ void VirtualDisplaySurface::onFrameCommitted() { void VirtualDisplaySurface::dumpAsString(String8& /* result */) const { } -void VirtualDisplaySurface::resizeBuffers(const ui::Size& newSize) { - mQueueBufferOutput.width = newSize.width; - mQueueBufferOutput.height = newSize.height; - mSinkBufferWidth = newSize.width; - mSinkBufferHeight = newSize.height; +void VirtualDisplaySurface::resizeBuffers(const uint32_t w, const uint32_t h) { + mQueueBufferOutput.width = w; + mQueueBufferOutput.height = h; + mSinkBufferWidth = w; + mSinkBufferHeight = h; } const sp<Fence>& VirtualDisplaySurface::getClientTargetAcquireFence() const { @@ -304,7 +301,7 @@ const sp<Fence>& VirtualDisplaySurface::getClientTargetAcquireFence() const { status_t VirtualDisplaySurface::requestBuffer(int pslot, sp<GraphicBuffer>* outBuf) { - if (GpuVirtualDisplayId::tryCast(mDisplayId)) { + if (!mDisplayId) { return mSource[SOURCE_SINK]->requestBuffer(pslot, outBuf); } @@ -326,7 +323,7 @@ status_t VirtualDisplaySurface::setAsyncMode(bool async) { status_t VirtualDisplaySurface::dequeueBuffer(Source source, PixelFormat format, uint64_t usage, int* sslot, sp<Fence>* fence) { - LOG_FATAL_IF(GpuVirtualDisplayId::tryCast(mDisplayId)); + LOG_FATAL_IF(!mDisplayId); status_t result = mSource[source]->dequeueBuffer(sslot, fence, mSinkBufferWidth, mSinkBufferHeight, @@ -338,14 +335,10 @@ status_t VirtualDisplaySurface::dequeueBuffer(Source source, dbgSourceStr(source), *sslot, pslot, result); uint64_t sourceBit = static_cast<uint64_t>(source) << pslot; - // reset producer slot reallocation flag - mProducerSlotNeedReallocation &= ~(1ULL << pslot); - if ((mProducerSlotSource & (1ULL << pslot)) != sourceBit) { // This slot was previously dequeued from the other source; must // re-request the buffer. - mProducerSlotNeedReallocation |= 1ULL << pslot; - + result |= BUFFER_NEEDS_REALLOCATION; mProducerSlotSource &= ~(1ULL << pslot); mProducerSlotSource |= sourceBit; } @@ -367,9 +360,6 @@ status_t VirtualDisplaySurface::dequeueBuffer(Source source, dbgSourceStr(source), pslot, mProducerBuffers[pslot].get(), mProducerBuffers[pslot]->getPixelFormat(), mProducerBuffers[pslot]->getUsage()); - - // propagate reallocation to VDS consumer - mProducerSlotNeedReallocation |= 1ULL << pslot; } return result; @@ -379,7 +369,7 @@ status_t VirtualDisplaySurface::dequeueBuffer(int* pslot, sp<Fence>* fence, uint PixelFormat format, uint64_t usage, uint64_t* outBufferAge, FrameEventHistoryDelta* outTimestamps) { - if (GpuVirtualDisplayId::tryCast(mDisplayId)) { + if (!mDisplayId) { return mSource[SOURCE_SINK]->dequeueBuffer(pslot, fence, w, h, format, usage, outBufferAge, outTimestamps); } @@ -444,11 +434,6 @@ status_t VirtualDisplaySurface::dequeueBuffer(int* pslot, sp<Fence>* fence, uint if (outBufferAge) { *outBufferAge = 0; } - - if ((mProducerSlotNeedReallocation & (1ULL << *pslot)) != 0) { - result |= BUFFER_NEEDS_REALLOCATION; - } - return result; } @@ -471,7 +456,7 @@ status_t VirtualDisplaySurface::attachBuffer(int* /* outSlot */, status_t VirtualDisplaySurface::queueBuffer(int pslot, const QueueBufferInput& input, QueueBufferOutput* output) { - if (GpuVirtualDisplayId::tryCast(mDisplayId)) { + if (!mDisplayId) { return mSource[SOURCE_SINK]->queueBuffer(pslot, input, output); } @@ -529,7 +514,7 @@ status_t VirtualDisplaySurface::queueBuffer(int pslot, status_t VirtualDisplaySurface::cancelBuffer(int pslot, const sp<Fence>& fence) { - if (GpuVirtualDisplayId::tryCast(mDisplayId)) { + if (!mDisplayId) { return mSource[SOURCE_SINK]->cancelBuffer(mapProducer2SourceSlot(SOURCE_SINK, pslot), fence); } @@ -641,7 +626,7 @@ void VirtualDisplaySurface::resetPerFrameState() { } status_t VirtualDisplaySurface::refreshOutputBuffer() { - LOG_FATAL_IF(GpuVirtualDisplayId::tryCast(mDisplayId)); + LOG_FATAL_IF(!mDisplayId); if (mOutputProducerSlot >= 0) { mSource[SOURCE_SINK]->cancelBuffer( @@ -660,9 +645,7 @@ status_t VirtualDisplaySurface::refreshOutputBuffer() { // until after GPU calls queueBuffer(). So here we just set the buffer // (for use in HWC prepare) but not the fence; we'll call this again with // the proper fence once we have it. - const auto halDisplayId = HalVirtualDisplayId::tryCast(mDisplayId); - LOG_FATAL_IF(!halDisplayId); - result = mHwc.setOutputBuffer(*halDisplayId, Fence::NO_FENCE, + result = mHwc.setOutputBuffer(*mDisplayId, Fence::NO_FENCE, mProducerBuffers[mOutputProducerSlot]); return result; |