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

Commit 88a11f26 authored by Vishnu Nair's avatar Vishnu Nair
Browse files

SF: User buffer size instead of layer size when calculating size

- Change the remaining references to layer size with buffer size
- Fail SurfaceFlinger::createLayer if the caller provides a buffer size and the layer is a color or
  container layer
- Update Transation_test to explicitly set crop for buffer-less layers

Bug:114413815
Test: go/wm-smoke
Test: mmma frameworks/native/services/surfaceflinger/tests/ && \
mmma frameworks/native/libs/gui/tests/ && adb sync data && \
adb shell /data/nativetest64/libgui_test/libgui_test && \
adb shell /data/nativetest64/libsurfaceflinger_unittest/libsurfaceflinger_unittest && \
adb shell /data/nativetest64/SurfaceFlinger_test/SurfaceFlinger_test && \
adb shell /data/nativetest64/SurfaceParcelable_test/SurfaceParcelable_test && \
echo "ALL TESTS PASSED"

Change-Id: Ic40a2ea3e629ce774891075afaf9a4d05e95ca4d
parent fb5594cd
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -59,8 +59,7 @@ static const int LAYER_BASE = INT32_MAX - 10;
class InputSurface {
public:
    InputSurface(const sp<SurfaceComposerClient>& scc, int width, int height) {
        mSurfaceControl = scc->createSurface(String8("Test Surface"),
                width, height, PIXEL_FORMAT_RGBA_8888,
        mSurfaceControl = scc->createSurface(String8("Test Surface"), 0, 0, PIXEL_FORMAT_RGBA_8888,
                                             ISurfaceComposerClient::eFXSurfaceColor);

        InputChannel::openInputChannelPair("testchannels", mServerChannel, mClientChannel);
+7 −5
Original line number Diff line number Diff line
@@ -501,7 +501,7 @@ Region BufferLayer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime

    // FIXME: postedRegion should be dirty & bounds
    // transform the dirty region to window-manager space
    return getTransform().transform(Region(Rect(getActiveWidth(s), getActiveHeight(s))));
    return getTransform().transform(Region(getBufferSize(s)));
}

// transaction
@@ -624,11 +624,13 @@ void BufferLayer::drawWithOpenGL(const RenderArea& renderArea, bool useIdentityT

    ui::Transform t = getTransform();
    Rect win = bounds;
    const int bufferWidth = getBufferSize(s).getWidth();
    const int bufferHeight = getBufferSize(s).getHeight();

    float left = float(win.left) / float(getActiveWidth(s));
    float top = float(win.top) / float(getActiveHeight(s));
    float right = float(win.right) / float(getActiveWidth(s));
    float bottom = float(win.bottom) / float(getActiveHeight(s));
    const float left = float(win.left) / float(bufferWidth);
    const float top = float(win.top) / float(bufferHeight);
    const float right = float(win.right) / float(bufferWidth);
    const float bottom = float(win.bottom) / float(bufferHeight);

    // TODO: we probably want to generate the texture coords with the mesh
    // here we assume that we only have 4 vertices
+6 −6
Original line number Diff line number Diff line
@@ -596,6 +596,12 @@ public:
    int32_t getZ() const;
    virtual void pushPendingState();

    /**
     * Returns active buffer size in the correct orientation. Buffer size is determined by undoing
     * any buffer transformations. If the layer has no buffer then return INVALID_RECT.
     */
    virtual Rect getBufferSize(const Layer::State&) const { return Rect::INVALID_RECT; }

protected:
    // constant
    sp<SurfaceFlinger> mFlinger;
@@ -819,12 +825,6 @@ private:
     * bounds are constrained by its parent bounds.
     */
    Rect getCroppedBufferSize(const Layer::State& s) const;

    /**
     * Returns active buffer size in the correct orientation. Buffer size is determined by undoing
     * any buffer transformations. If the layer has no buffer then return INVALID_RECT.
     */
    virtual Rect getBufferSize(const Layer::State&) const { return Rect::INVALID_RECT; }
};

} // namespace android
+20 −5
Original line number Diff line number Diff line
@@ -3707,11 +3707,24 @@ status_t SurfaceFlinger::createLayer(
            result = createBufferStateLayer(client, uniqueName, w, h, flags, handle, &layer);
            break;
        case ISurfaceComposerClient::eFXSurfaceColor:
            // check if buffer size is set for color layer.
            if (w > 0 || h > 0) {
                ALOGE("createLayer() failed, w or h cannot be set for color layer (w=%d, h=%d)",
                      int(w), int(h));
                return BAD_VALUE;
            }

            result = createColorLayer(client,
                    uniqueName, w, h, flags,
                    handle, &layer);
            break;
        case ISurfaceComposerClient::eFXSurfaceContainer:
            // check if buffer size is set for container layer.
            if (w > 0 || h > 0) {
                ALOGE("createLayer() failed, w or h cannot be set for container layer (w=%d, h=%d)",
                      int(w), int(h));
                return BAD_VALUE;
            }
            result = createContainerLayer(client,
                    uniqueName, w, h, flags,
                    handle, &layer);
@@ -5161,12 +5174,14 @@ status_t SurfaceFlinger::captureLayers(const sp<IBinder>& layerHandleBinder,
        const ui::Transform& getTransform() const override { return mTransform; }
        Rect getBounds() const override {
            const Layer::State& layerState(mLayer->getDrawingState());
            return Rect(mLayer->getActiveWidth(layerState), mLayer->getActiveHeight(layerState));
            return mLayer->getBufferSize(layerState);
        }
        int getHeight() const override {
            return mLayer->getActiveHeight(mLayer->getDrawingState());
            return mLayer->getBufferSize(mLayer->getDrawingState()).getHeight();
        }
        int getWidth() const override {
            return mLayer->getBufferSize(mLayer->getDrawingState()).getWidth();
        }
        int getWidth() const override { return mLayer->getActiveWidth(mLayer->getDrawingState()); }
        bool isSecure() const override { return false; }
        bool needsFiltering() const override { return mNeedsFiltering; }
        Rect getSourceCrop() const override {
@@ -5240,12 +5255,12 @@ status_t SurfaceFlinger::captureLayers(const sp<IBinder>& layerHandleBinder,
    Rect crop(sourceCrop);
    if (sourceCrop.width() <= 0) {
        crop.left = 0;
        crop.right = parent->getActiveWidth(parent->getCurrentState());
        crop.right = parent->getBufferSize(parent->getCurrentState()).getWidth();
    }

    if (sourceCrop.height() <= 0) {
        crop.top = 0;
        crop.bottom = parent->getActiveHeight(parent->getCurrentState());
        crop.bottom = parent->getBufferSize(parent->getCurrentState()).getHeight();
    }

    int32_t reqWidth = crop.width() * frameScale;
+110 −123

File changed.

Preview size limit exceeded, changes collapsed.