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

Commit a1f1e15d authored by Evan Rosky's avatar Evan Rosky
Browse files

Initialize layers with metadata

layers weren't being initialized with metadata, this meant a
traversal was required in order to apply the setmetadata call.
While this seemed to happen in practice, its a weird thing to
rely on.

Bug: 122925737
Test: Behavior is same
Change-Id: I455f6c69ce92e6045aa0c12f8cfbb70c1d283088
parent fb7cb9f3
Loading
Loading
Loading
Loading
+3 −2
Original line number Original line Diff line number Diff line
@@ -104,6 +104,7 @@ Layer::Layer(const LayerCreationArgs& args)
    mCurrentState.api = -1;
    mCurrentState.api = -1;
    mCurrentState.hasColorTransform = false;
    mCurrentState.hasColorTransform = false;
    mCurrentState.colorSpaceAgnostic = false;
    mCurrentState.colorSpaceAgnostic = false;
    mCurrentState.metadata = args.metadata;


    // drawing state & current state are identical
    // drawing state & current state are identical
    mDrawingState = mCurrentState;
    mDrawingState = mCurrentState;
@@ -1250,8 +1251,8 @@ bool Layer::setBackgroundColor(const half3& color, float alpha, ui::Dataspace da
        // create background color layer if one does not yet exist
        // create background color layer if one does not yet exist
        uint32_t flags = ISurfaceComposerClient::eFXSurfaceColor;
        uint32_t flags = ISurfaceComposerClient::eFXSurfaceColor;
        const String8& name = mName + "BackgroundColorLayer";
        const String8& name = mName + "BackgroundColorLayer";
        mCurrentState.bgColorLayer =
        mCurrentState.bgColorLayer = new ColorLayer(
                new ColorLayer(LayerCreationArgs(mFlinger.get(), nullptr, name, 0, 0, flags));
                LayerCreationArgs(mFlinger.get(), nullptr, name, 0, 0, flags, LayerMetadata()));


        // add to child list
        // add to child list
        addChild(mCurrentState.bgColorLayer);
        addChild(mCurrentState.bgColorLayer);
+4 −2
Original line number Original line Diff line number Diff line
@@ -80,8 +80,9 @@ class SurfaceInterceptor;


struct LayerCreationArgs {
struct LayerCreationArgs {
    LayerCreationArgs(SurfaceFlinger* flinger, const sp<Client>& client, const String8& name,
    LayerCreationArgs(SurfaceFlinger* flinger, const sp<Client>& client, const String8& name,
                      uint32_t w, uint32_t h, uint32_t flags)
                      uint32_t w, uint32_t h, uint32_t flags, LayerMetadata metadata)
          : flinger(flinger), client(client), name(name), w(w), h(h), flags(flags) {}
          : flinger(flinger), client(client), name(name), w(w), h(h), flags(flags),
            metadata(std::move(metadata)) {}


    SurfaceFlinger* flinger;
    SurfaceFlinger* flinger;
    const sp<Client>& client;
    const sp<Client>& client;
@@ -89,6 +90,7 @@ struct LayerCreationArgs {
    uint32_t w;
    uint32_t w;
    uint32_t h;
    uint32_t h;
    uint32_t flags;
    uint32_t flags;
    LayerMetadata metadata;
};
};


class Layer : public virtual compositionengine::LayerFE {
class Layer : public virtual compositionengine::LayerFE {
+43 −37
Original line number Original line Diff line number Diff line
@@ -3980,14 +3980,27 @@ status_t SurfaceFlinger::createLayer(const String8& name, const sp<Client>& clie


    String8 uniqueName = getUniqueLayerName(name);
    String8 uniqueName = getUniqueLayerName(name);


    bool primaryDisplayOnly = false;

    // window type is WINDOW_TYPE_DONT_SCREENSHOT from SurfaceControl.java
    // TODO b/64227542
    if (metadata.has(METADATA_WINDOW_TYPE)) {
        int32_t windowType = metadata.getInt32(METADATA_WINDOW_TYPE, 0);
        if (windowType == 441731) {
            metadata.setInt32(METADATA_WINDOW_TYPE, 2024); // TYPE_NAVIGATION_BAR_PANEL
            primaryDisplayOnly = true;
        }
    }

    switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
    switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
        case ISurfaceComposerClient::eFXSurfaceBufferQueue:
        case ISurfaceComposerClient::eFXSurfaceBufferQueue:
            result = createBufferQueueLayer(client, uniqueName, w, h, flags, format, handle, gbp,
            result = createBufferQueueLayer(client, uniqueName, w, h, flags, std::move(metadata),
                                            &layer);
                                            format, handle, gbp, &layer);


            break;
            break;
        case ISurfaceComposerClient::eFXSurfaceBufferState:
        case ISurfaceComposerClient::eFXSurfaceBufferState:
            result = createBufferStateLayer(client, uniqueName, w, h, flags, handle, &layer);
            result = createBufferStateLayer(client, uniqueName, w, h, flags, std::move(metadata),
                                            handle, &layer);
            break;
            break;
        case ISurfaceComposerClient::eFXSurfaceColor:
        case ISurfaceComposerClient::eFXSurfaceColor:
            // check if buffer size is set for color layer.
            // check if buffer size is set for color layer.
@@ -3997,9 +4010,8 @@ status_t SurfaceFlinger::createLayer(const String8& name, const sp<Client>& clie
                return BAD_VALUE;
                return BAD_VALUE;
            }
            }


            result = createColorLayer(client,
            result = createColorLayer(client, uniqueName, w, h, flags, std::move(metadata), handle,
                    uniqueName, w, h, flags,
                                      &layer);
                    handle, &layer);
            break;
            break;
        case ISurfaceComposerClient::eFXSurfaceContainer:
        case ISurfaceComposerClient::eFXSurfaceContainer:
            // check if buffer size is set for container layer.
            // check if buffer size is set for container layer.
@@ -4008,8 +4020,7 @@ status_t SurfaceFlinger::createLayer(const String8& name, const sp<Client>& clie
                      int(w), int(h));
                      int(w), int(h));
                return BAD_VALUE;
                return BAD_VALUE;
            }
            }
            result = createContainerLayer(client,
            result = createContainerLayer(client, uniqueName, w, h, flags, std::move(metadata),
                    uniqueName, w, h, flags,
                                          handle, &layer);
                                          handle, &layer);
            break;
            break;
        default:
        default:
@@ -4021,17 +4032,9 @@ status_t SurfaceFlinger::createLayer(const String8& name, const sp<Client>& clie
        return result;
        return result;
    }
    }


    // window type is WINDOW_TYPE_DONT_SCREENSHOT from SurfaceControl.java
    if (primaryDisplayOnly) {
    // TODO b/64227542
    if (metadata.has(METADATA_WINDOW_TYPE)) {
        int32_t windowType = metadata.getInt32(METADATA_WINDOW_TYPE, 0);
        if (windowType == 441731) {
            metadata.setInt32(METADATA_WINDOW_TYPE, 2024); // TYPE_NAVIGATION_BAR_PANEL
        layer->setPrimaryDisplayOnly();
        layer->setPrimaryDisplayOnly();
    }
    }
    }

    layer->setMetadata(metadata);


    bool addToCurrentState = callingThreadHasUnscopedSurfaceFlingerAccess();
    bool addToCurrentState = callingThreadHasUnscopedSurfaceFlingerAccess();
    result = addClientLayer(client, *handle, *gbp, layer, *parent,
    result = addClientLayer(client, *handle, *gbp, layer, *parent,
@@ -4075,7 +4078,8 @@ String8 SurfaceFlinger::getUniqueLayerName(const String8& name)


status_t SurfaceFlinger::createBufferQueueLayer(const sp<Client>& client, const String8& name,
status_t SurfaceFlinger::createBufferQueueLayer(const sp<Client>& client, const String8& name,
                                                uint32_t w, uint32_t h, uint32_t flags,
                                                uint32_t w, uint32_t h, uint32_t flags,
                                                PixelFormat& format, sp<IBinder>* handle,
                                                LayerMetadata metadata, PixelFormat& format,
                                                sp<IBinder>* handle,
                                                sp<IGraphicBufferProducer>* gbp,
                                                sp<IGraphicBufferProducer>* gbp,
                                                sp<Layer>* outLayer) {
                                                sp<Layer>* outLayer) {
    // initialize the surfaces
    // initialize the surfaces
@@ -4089,8 +4093,8 @@ status_t SurfaceFlinger::createBufferQueueLayer(const sp<Client>& client, const
        break;
        break;
    }
    }


    sp<BufferQueueLayer> layer =
    sp<BufferQueueLayer> layer = getFactory().createBufferQueueLayer(
            getFactory().createBufferQueueLayer(LayerCreationArgs(this, client, name, w, h, flags));
            LayerCreationArgs(this, client, name, w, h, flags, std::move(metadata)));
    status_t err = layer->setDefaultBufferProperties(w, h, format);
    status_t err = layer->setDefaultBufferProperties(w, h, format);
    if (err == NO_ERROR) {
    if (err == NO_ERROR) {
        *handle = layer->getHandle();
        *handle = layer->getHandle();
@@ -4104,30 +4108,31 @@ status_t SurfaceFlinger::createBufferQueueLayer(const sp<Client>& client, const


status_t SurfaceFlinger::createBufferStateLayer(const sp<Client>& client, const String8& name,
status_t SurfaceFlinger::createBufferStateLayer(const sp<Client>& client, const String8& name,
                                                uint32_t w, uint32_t h, uint32_t flags,
                                                uint32_t w, uint32_t h, uint32_t flags,
                                                sp<IBinder>* handle, sp<Layer>* outLayer) {
                                                LayerMetadata metadata, sp<IBinder>* handle,
    sp<BufferStateLayer> layer =
                                                sp<Layer>* outLayer) {
            getFactory().createBufferStateLayer(LayerCreationArgs(this, client, name, w, h, flags));
    sp<BufferStateLayer> layer = getFactory().createBufferStateLayer(
            LayerCreationArgs(this, client, name, w, h, flags, std::move(metadata)));
    *handle = layer->getHandle();
    *handle = layer->getHandle();
    *outLayer = layer;
    *outLayer = layer;


    return NO_ERROR;
    return NO_ERROR;
}
}


status_t SurfaceFlinger::createColorLayer(const sp<Client>& client,
status_t SurfaceFlinger::createColorLayer(const sp<Client>& client, const String8& name, uint32_t w,
        const String8& name, uint32_t w, uint32_t h, uint32_t flags,
                                          uint32_t h, uint32_t flags, LayerMetadata metadata,
        sp<IBinder>* handle, sp<Layer>* outLayer)
                                          sp<IBinder>* handle, sp<Layer>* outLayer) {
{
    *outLayer = getFactory().createColorLayer(
    *outLayer = getFactory().createColorLayer(LayerCreationArgs(this, client, name, w, h, flags));
            LayerCreationArgs(this, client, name, w, h, flags, std::move(metadata)));
    *handle = (*outLayer)->getHandle();
    *handle = (*outLayer)->getHandle();
    return NO_ERROR;
    return NO_ERROR;
}
}


status_t SurfaceFlinger::createContainerLayer(const sp<Client>& client,
status_t SurfaceFlinger::createContainerLayer(const sp<Client>& client, const String8& name,
        const String8& name, uint32_t w, uint32_t h, uint32_t flags,
                                              uint32_t w, uint32_t h, uint32_t flags,
        sp<IBinder>* handle, sp<Layer>* outLayer)
                                              LayerMetadata metadata, sp<IBinder>* handle,
{
                                              sp<Layer>* outLayer) {
    *outLayer =
    *outLayer = getFactory().createContainerLayer(
            getFactory().createContainerLayer(LayerCreationArgs(this, client, name, w, h, flags));
            LayerCreationArgs(this, client, name, w, h, flags, std::move(metadata)));
    *handle = (*outLayer)->getHandle();
    *handle = (*outLayer)->getHandle();
    return NO_ERROR;
    return NO_ERROR;
}
}
@@ -5337,7 +5342,8 @@ status_t SurfaceFlinger::captureLayers(const sp<IBinder>& layerHandleBinder,
                Rect bounds = getBounds();
                Rect bounds = getBounds();
                screenshotParentLayer = mFlinger->getFactory().createContainerLayer(
                screenshotParentLayer = mFlinger->getFactory().createContainerLayer(
                        LayerCreationArgs(mFlinger, nullptr, String8("Screenshot Parent"),
                        LayerCreationArgs(mFlinger, nullptr, String8("Screenshot Parent"),
                                          bounds.getWidth(), bounds.getHeight(), 0));
                                          bounds.getWidth(), bounds.getHeight(), 0,
                                          LayerMetadata()));


                ReparentForDrawing reparent(mLayer, screenshotParentLayer, sourceCrop);
                ReparentForDrawing reparent(mLayer, screenshotParentLayer, sourceCrop);
                drawLayers();
                drawLayers();
+11 −11
Original line number Original line Diff line number Diff line
@@ -602,21 +602,21 @@ private:
                         sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* parent);
                         sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* parent);


    status_t createBufferQueueLayer(const sp<Client>& client, const String8& name, uint32_t w,
    status_t createBufferQueueLayer(const sp<Client>& client, const String8& name, uint32_t w,
                                    uint32_t h, uint32_t flags, PixelFormat& format,
                                    uint32_t h, uint32_t flags, LayerMetadata metadata,
                                    sp<IBinder>* outHandle, sp<IGraphicBufferProducer>* outGbp,
                                    PixelFormat& format, sp<IBinder>* outHandle,
                                    sp<Layer>* outLayer);
                                    sp<IGraphicBufferProducer>* outGbp, sp<Layer>* outLayer);


    status_t createBufferStateLayer(const sp<Client>& client, const String8& name, uint32_t w,
    status_t createBufferStateLayer(const sp<Client>& client, const String8& name, uint32_t w,
                                    uint32_t h, uint32_t flags, sp<IBinder>* outHandle,
                                    uint32_t h, uint32_t flags, LayerMetadata metadata,
                                    sp<Layer>* outLayer);
                                    sp<IBinder>* outHandle, sp<Layer>* outLayer);


    status_t createColorLayer(const sp<Client>& client, const String8& name,
    status_t createColorLayer(const sp<Client>& client, const String8& name, uint32_t w, uint32_t h,
            uint32_t w, uint32_t h, uint32_t flags, sp<IBinder>* outHandle,
                              uint32_t flags, LayerMetadata metadata, sp<IBinder>* outHandle,
                              sp<Layer>* outLayer);
                              sp<Layer>* outLayer);


    status_t createContainerLayer(const sp<Client>& client, const String8& name,
    status_t createContainerLayer(const sp<Client>& client, const String8& name, uint32_t w,
            uint32_t w, uint32_t h, uint32_t flags, sp<IBinder>* outHandle,
                                  uint32_t h, uint32_t flags, LayerMetadata metadata,
            sp<Layer>* outLayer);
                                  sp<IBinder>* outHandle, sp<Layer>* outLayer);


    String8 getUniqueLayerName(const String8& name);
    String8 getUniqueLayerName(const String8& name);


+3 −2
Original line number Original line Diff line number Diff line
@@ -22,6 +22,7 @@
#include <gmock/gmock.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <gtest/gtest.h>
#include <gui/IProducerListener.h>
#include <gui/IProducerListener.h>
#include <gui/LayerMetadata.h>
#include <log/log.h>
#include <log/log.h>
#include <renderengine/mock/Framebuffer.h>
#include <renderengine/mock/Framebuffer.h>
#include <renderengine/mock/Image.h>
#include <renderengine/mock/Image.h>
@@ -806,7 +807,7 @@ struct ColorLayerVariant : public BaseLayerVariant<LayerProperties> {
            return new ColorLayer(LayerCreationArgs(test->mFlinger.mFlinger.get(), sp<Client>(),
            return new ColorLayer(LayerCreationArgs(test->mFlinger.mFlinger.get(), sp<Client>(),
                                                    String8("test-layer"), LayerProperties::WIDTH,
                                                    String8("test-layer"), LayerProperties::WIDTH,
                                                    LayerProperties::HEIGHT,
                                                    LayerProperties::HEIGHT,
                                                    LayerProperties::LAYER_FLAGS));
                                                    LayerProperties::LAYER_FLAGS, LayerMetadata()));
        });
        });


        auto& layerDrawingState = test->mFlinger.mutableLayerDrawingState(layer);
        auto& layerDrawingState = test->mFlinger.mutableLayerDrawingState(layer);
@@ -847,7 +848,7 @@ struct BufferLayerVariant : public BaseLayerVariant<LayerProperties> {
                            LayerCreationArgs(test->mFlinger.mFlinger.get(), sp<Client>(),
                            LayerCreationArgs(test->mFlinger.mFlinger.get(), sp<Client>(),
                                              String8("test-layer"), LayerProperties::WIDTH,
                                              String8("test-layer"), LayerProperties::WIDTH,
                                              LayerProperties::HEIGHT,
                                              LayerProperties::HEIGHT,
                                              LayerProperties::LAYER_FLAGS));
                                              LayerProperties::LAYER_FLAGS, LayerMetadata()));
                });
                });


        LayerProperties::setupLayerState(test, layer);
        LayerProperties::setupLayerState(test, layer);