Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b4c6e585 authored by chaviw's avatar chaviw
Browse files

[Mirror Layers] Added clone function to layers (1/4)

Added a cloning function to each layer in preparation for mirroring

Test: Nothing to test yet since no calls
Bug: 131622422
Change-Id: Iba0692b75c4d99841de48f40ed55b3dbccf2b9b9
parent 04c70c4c
Loading
Loading
Loading
Loading
+17 −2
Original line number Diff line number Diff line
@@ -58,7 +58,7 @@ namespace android {

BufferLayer::BufferLayer(const LayerCreationArgs& args)
      : Layer(args),
        mTextureName(args.flinger->getNewTexture()),
        mTextureName(args.textureName),
        mCompositionLayer{mFlinger->getCompositionEngine().createLayer(
                compositionengine::LayerCreationArgs{this})} {
    ALOGV("Creating Layer %s", args.name.string());
@@ -70,7 +70,13 @@ BufferLayer::BufferLayer(const LayerCreationArgs& args)
}

BufferLayer::~BufferLayer() {
    if (!isClone()) {
        // The original layer and the clone layer share the same texture. Therefore, only one of
        // the layers, in this case the original layer, needs to handle the deletion. The original
        // layer and the clone should be removed at the same time so there shouldn't be any issue
        // with the clone layer trying to use the deleted texture.
        mFlinger->deleteTextureAsync(mTextureName);
    }
    const int32_t layerID = getSequence();
    mFlinger->mTimeStats->onDestroy(layerID);
    mFlinger->mFrameTracer->onDestroy(layerID);
@@ -722,6 +728,15 @@ void BufferLayer::getDrawingTransformMatrix(bool filteringEnabled, float outMatr
                                       mBufferInfo.mTransform, filteringEnabled);
}

void BufferLayer::setInitialValuesForClone(const sp<Layer>& clonedFrom) {
    Layer::setInitialValuesForClone(clonedFrom);

    sp<BufferLayer> bufferClonedFrom = static_cast<BufferLayer*>(clonedFrom.get());
    mPremultipliedAlpha = bufferClonedFrom->mPremultipliedAlpha;
    mPotentialCursor = bufferClonedFrom->mPotentialCursor;
    mProtectedByApp = bufferClonedFrom->mProtectedByApp;
}

} // namespace android

#if defined(__gl_h_)
+1 −0
Original line number Diff line number Diff line
@@ -194,6 +194,7 @@ protected:
    bool mRefreshPending{false};

    ui::Dataspace translateDataspace(ui::Dataspace dataspace);
    void setInitialValuesForClone(const sp<Layer>& clonedFrom);

private:
    // Returns true if this layer requires filtering
+13 −7
Original line number Diff line number Diff line
@@ -461,12 +461,7 @@ void BufferQueueLayer::onFirstRef() {
    sp<IGraphicBufferConsumer> consumer;
    BufferQueue::createBufferQueue(&producer, &consumer, true);
    mProducer = new MonitoredProducer(producer, mFlinger, this);
    {
        // Grab the SF state lock during this since it's the only safe way to access RenderEngine
        Mutex::Autolock lock(mFlinger->mStateLock);
        mConsumer =
                new BufferLayerConsumer(consumer, mFlinger->getRenderEngine(), mTextureName, this);
    }
    mConsumer = new BufferLayerConsumer(consumer, mFlinger->getRenderEngine(), mTextureName, this);
    mConsumer->setConsumerUsageBits(getEffectiveUsage(0));
    mConsumer->setContentsChangedListener(this);
    mConsumer->setName(mName);
@@ -476,7 +471,7 @@ void BufferQueueLayer::onFirstRef() {
        mProducer->setMaxDequeuedBufferCount(2);
    }

    if (const auto display = mFlinger->getDefaultDisplayDevice()) {
    if (const auto display = mFlinger->getDefaultDisplayDeviceLocked()) {
        updateTransformHint(display);
    }
}
@@ -531,4 +526,15 @@ void BufferQueueLayer::gatherBufferInfo() {
    mBufferInfo.mTransformToDisplayInverse = mConsumer->getTransformToDisplayInverse();
}

sp<Layer> BufferQueueLayer::createClone() {
    const String8 name = mName + " (Mirror)";
    LayerCreationArgs args =
            LayerCreationArgs(mFlinger.get(), nullptr, name, 0, 0, 0, LayerMetadata());
    args.textureName = mTextureName;
    sp<BufferQueueLayer> layer = new BufferQueueLayer(args);
    layer->setInitialValuesForClone(this);

    return layer;
}

} // namespace android
+2 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ namespace android {
 */
class BufferQueueLayer : public BufferLayer, public BufferLayerConsumer::ContentsChangedListener {
public:
    // Only call while mStateLock is held
    explicit BufferQueueLayer(const LayerCreationArgs&);
    ~BufferQueueLayer() override;

@@ -81,6 +82,7 @@ private:
    status_t updateFrameNumber(nsecs_t latchTime) override;

    void latchPerFrameState(compositionengine::LayerFECompositionState&) const override;
    sp<Layer> createClone() override;

    // -----------------------------------------------------------------------
    // Interface implementation for BufferLayerConsumer::ContentsChangedListener
+18 −9
Original line number Diff line number Diff line
@@ -48,10 +48,17 @@ BufferStateLayer::BufferStateLayer(const LayerCreationArgs& args)
      : BufferLayer(args), mHwcSlotGenerator(new HwcSlotGenerator()) {
    mOverrideScalingMode = NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW;
    mCurrentState.dataspace = ui::Dataspace::V0_SRGB;
    if (const auto display = args.displayDevice) {
        updateTransformHint(display);
    }
}

BufferStateLayer::~BufferStateLayer() {
    if (mBufferInfo.mBuffer != nullptr) {
    // The original layer and the clone layer share the same texture and buffer. Therefore, only
    // one of the layers, in this case the original layer, needs to handle the deletion. The
    // original layer and the clone should be removed at the same time so there shouldn't be any
    // issue with the clone layer trying to use the texture.
    if (mBufferInfo.mBuffer != nullptr && !isClone()) {
        // Ensure that mBuffer is uncached from RenderEngine here, as
        // RenderEngine may have been using the buffer as an external texture
        // after the client uncached the buffer.
@@ -545,14 +552,6 @@ void BufferStateLayer::latchPerFrameState(
    mFrameNumber++;
}

void BufferStateLayer::onFirstRef() {
    BufferLayer::onFirstRef();

    if (const auto display = mFlinger->getDefaultDisplayDevice()) {
        updateTransformHint(display);
    }
}

void BufferStateLayer::HwcSlotGenerator::bufferErased(const client_cache_t& clientCacheId) {
    std::lock_guard lock(mMutex);
    if (!clientCacheId.isValid()) {
@@ -668,4 +667,14 @@ Rect BufferStateLayer::computeCrop(const State& s) {
    return s.crop;
}

sp<Layer> BufferStateLayer::createClone() {
    const String8 name = mName + " (Mirror)";
    LayerCreationArgs args =
            LayerCreationArgs(mFlinger.get(), nullptr, name, 0, 0, 0, LayerMetadata());
    args.textureName = mTextureName;
    sp<BufferStateLayer> layer = new BufferStateLayer(args);
    layer->mHwcSlotGenerator = mHwcSlotGenerator;
    layer->setInitialValuesForClone(this);
    return layer;
}
} // namespace android
Loading