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

Commit d478f37b authored by Alec Mouri's avatar Alec Mouri Committed by Automerger Merge Worker
Browse files

Fix filtering for screenshotting custom displays. am: 5a6d857f am: f537ef6c

Change-Id: I8fce1b458e148109f3ef8428c5841056971ba072
parents d8bfd7a2 f537ef6c
Loading
Loading
Loading
Loading
+3 −2
Original line number Original line Diff line number Diff line
@@ -795,6 +795,7 @@ void GLESRenderEngine::handleRoundedCorners(const DisplaySettings& display,


    // Firstly, we need to convert the coordination from layer native coordination space to
    // Firstly, we need to convert the coordination from layer native coordination space to
    // device coordination space.
    // device coordination space.
    // TODO(143929254): Verify that this transformation is correct
    const auto transformMatrix = display.globalTransform * layer.geometry.positionTransform;
    const auto transformMatrix = display.globalTransform * layer.geometry.positionTransform;
    const vec4 leftTopCoordinate(bounds.left, bounds.top, 1.0, 1.0);
    const vec4 leftTopCoordinate(bounds.left, bounds.top, 1.0, 1.0);
    const vec4 rightBottomCoordinate(bounds.right, bounds.bottom, 1.0, 1.0);
    const vec4 rightBottomCoordinate(bounds.right, bounds.bottom, 1.0, 1.0);
@@ -1015,8 +1016,8 @@ status_t GLESRenderEngine::drawLayers(const DisplaySettings& display,
    setOutputDataSpace(display.outputDataspace);
    setOutputDataSpace(display.outputDataspace);
    setDisplayMaxLuminance(display.maxLuminance);
    setDisplayMaxLuminance(display.maxLuminance);


    mat4 projectionMatrix = mState.projectionMatrix * display.globalTransform;
    const mat4 projectionMatrix =
    mState.projectionMatrix = projectionMatrix;
            ui::Transform(display.orientation).asMatrix4() * mState.projectionMatrix;
    if (!display.clearRegion.isEmpty()) {
    if (!display.clearRegion.isEmpty()) {
        glDisable(GL_BLEND);
        glDisable(GL_BLEND);
        fillRegionWithColor(display.clearRegion, 0.0, 0.0, 0.0, 1.0);
        fillRegionWithColor(display.clearRegion, 0.0, 0.0, 0.0, 1.0);
+11 −1
Original line number Original line Diff line number Diff line
@@ -41,6 +41,13 @@ struct DisplaySettings {
    Rect clip = Rect::INVALID_RECT;
    Rect clip = Rect::INVALID_RECT;


    // Global transform to apply to all layers.
    // Global transform to apply to all layers.
    // The global transform is assumed to automatically apply when projecting
    // the clip rectangle onto the physical display; however, this should be
    // explicitly provided to perform CPU-side optimizations such as computing
    // scissor rectangles for rounded corners which require transformation to
    // the phsical display space.
    //
    // This transform is also assumed to include the orientation flag below.
    mat4 globalTransform = mat4();
    mat4 globalTransform = mat4();


    // Maximum luminance pulled from the display's HDR capabilities.
    // Maximum luminance pulled from the display's HDR capabilities.
@@ -60,7 +67,10 @@ struct DisplaySettings {
    // rendered layers.
    // rendered layers.
    Region clearRegion = Region::INVALID_REGION;
    Region clearRegion = Region::INVALID_REGION;


    // The orientation of the physical display.
    // An additional orientation flag to be applied after clipping the output.
    // By way of example, this may be used for supporting fullscreen screenshot
    // capture of a device in landscape while the buffer is in portrait
    // orientation.
    uint32_t orientation = ui::Transform::ROT_0;
    uint32_t orientation = ui::Transform::ROT_0;
};
};


+8 −11
Original line number Original line Diff line number Diff line
@@ -298,7 +298,7 @@ struct RenderEngineTest : public ::testing::Test {
    void fillBufferPhysicalOffset();
    void fillBufferPhysicalOffset();


    template <typename SourceVariant>
    template <typename SourceVariant>
    void fillBufferCheckers(mat4 transform);
    void fillBufferCheckers(uint32_t rotation);


    template <typename SourceVariant>
    template <typename SourceVariant>
    void fillBufferCheckersRotate0();
    void fillBufferCheckersRotate0();
@@ -509,12 +509,12 @@ void RenderEngineTest::fillBufferPhysicalOffset() {
}
}


template <typename SourceVariant>
template <typename SourceVariant>
void RenderEngineTest::fillBufferCheckers(mat4 transform) {
void RenderEngineTest::fillBufferCheckers(uint32_t orientationFlag) {
    renderengine::DisplaySettings settings;
    renderengine::DisplaySettings settings;
    settings.physicalDisplay = fullscreenRect();
    settings.physicalDisplay = fullscreenRect();
    // Here logical space is 2x2
    // Here logical space is 2x2
    settings.clip = Rect(2, 2);
    settings.clip = Rect(2, 2);
    settings.globalTransform = transform;
    settings.orientation = orientationFlag;


    std::vector<const renderengine::LayerSettings*> layers;
    std::vector<const renderengine::LayerSettings*> layers;


@@ -545,7 +545,7 @@ void RenderEngineTest::fillBufferCheckers(mat4 transform) {


template <typename SourceVariant>
template <typename SourceVariant>
void RenderEngineTest::fillBufferCheckersRotate0() {
void RenderEngineTest::fillBufferCheckersRotate0() {
    fillBufferCheckers<SourceVariant>(mat4());
    fillBufferCheckers<SourceVariant>(ui::Transform::ROT_0);
    expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0,
    expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0,
                      255);
                      255);
    expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
    expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
@@ -561,8 +561,7 @@ void RenderEngineTest::fillBufferCheckersRotate0() {


template <typename SourceVariant>
template <typename SourceVariant>
void RenderEngineTest::fillBufferCheckersRotate90() {
void RenderEngineTest::fillBufferCheckersRotate90() {
    mat4 matrix = mat4(0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 1);
    fillBufferCheckers<SourceVariant>(ui::Transform::ROT_90);
    fillBufferCheckers<SourceVariant>(matrix);
    expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 255, 0,
    expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 255, 0,
                      255);
                      255);
    expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
    expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
@@ -578,8 +577,7 @@ void RenderEngineTest::fillBufferCheckersRotate90() {


template <typename SourceVariant>
template <typename SourceVariant>
void RenderEngineTest::fillBufferCheckersRotate180() {
void RenderEngineTest::fillBufferCheckersRotate180() {
    mat4 matrix = mat4(-1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 2, 2, 0, 1);
    fillBufferCheckers<SourceVariant>(ui::Transform::ROT_180);
    fillBufferCheckers<SourceVariant>(matrix);
    expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0,
    expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0,
                      0);
                      0);
    expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
    expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
@@ -595,8 +593,7 @@ void RenderEngineTest::fillBufferCheckersRotate180() {


template <typename SourceVariant>
template <typename SourceVariant>
void RenderEngineTest::fillBufferCheckersRotate270() {
void RenderEngineTest::fillBufferCheckersRotate270() {
    mat4 matrix = mat4(0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 1);
    fillBufferCheckers<SourceVariant>(ui::Transform::ROT_270);
    fillBufferCheckers<SourceVariant>(matrix);
    expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 255,
    expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 255,
                      255);
                      255);
    expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
    expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
@@ -928,7 +925,7 @@ void RenderEngineTest::clearLeftRegion() {
    // Here logical space is 4x4
    // Here logical space is 4x4
    settings.clip = Rect(4, 4);
    settings.clip = Rect(4, 4);
    settings.globalTransform = mat4::scale(vec4(2, 4, 0, 1));
    settings.globalTransform = mat4::scale(vec4(2, 4, 0, 1));
    settings.clearRegion = Region(Rect(1, 1));
    settings.clearRegion = Region(Rect(2, 4));
    std::vector<const renderengine::LayerSettings*> layers;
    std::vector<const renderengine::LayerSettings*> layers;
    // dummy layer, without bounds should not render anything
    // dummy layer, without bounds should not render anything
    renderengine::LayerSettings layer;
    renderengine::LayerSettings layer;
+33 −0
Original line number Original line Diff line number Diff line
@@ -618,6 +618,39 @@ bool BufferLayer::needsFiltering(const sp<const DisplayDevice>& displayDevice) c
            sourceCrop.getWidth() != displayFrame.getWidth();
            sourceCrop.getWidth() != displayFrame.getWidth();
}
}


bool BufferLayer::needsFilteringForScreenshots(const sp<const DisplayDevice>& displayDevice,
                                               const ui::Transform& inverseParentTransform) const {
    // If we are not capturing based on the state of a known display device,
    // just return false.
    if (displayDevice == nullptr) {
        return false;
    }

    const auto outputLayer = findOutputLayerForDisplay(displayDevice);
    if (outputLayer == nullptr) {
        return false;
    }

    // We need filtering if the sourceCrop rectangle size does not match the
    // viewport rectangle size (not a 1:1 render)
    const auto& compositionState = outputLayer->getState();
    const ui::Transform& displayTransform = displayDevice->getTransform();
    const ui::Transform inverseTransform = inverseParentTransform * displayTransform.inverse();
    // Undo the transformation of the displayFrame so that we're back into
    // layer-stack space.
    const Rect frame = inverseTransform.transform(compositionState.displayFrame);
    const FloatRect sourceCrop = compositionState.sourceCrop;

    int32_t frameHeight = frame.getHeight();
    int32_t frameWidth = frame.getWidth();
    // If the display transform had a rotational component then undo the
    // rotation so that the orientation matches the source crop.
    if (displayTransform.getOrientation() & ui::Transform::ROT_90) {
        std::swap(frameHeight, frameWidth);
    }
    return sourceCrop.getHeight() != frameHeight || sourceCrop.getWidth() != frameWidth;
}

uint64_t BufferLayer::getHeadFrameNumber(nsecs_t expectedPresentTime) const {
uint64_t BufferLayer::getHeadFrameNumber(nsecs_t expectedPresentTime) const {
    if (hasFrameUpdate()) {
    if (hasFrameUpdate()) {
        return getFrameNumber(expectedPresentTime);
        return getFrameNumber(expectedPresentTime);
+2 −0
Original line number Original line Diff line number Diff line
@@ -208,6 +208,8 @@ protected:
private:
private:
    // Returns true if this layer requires filtering
    // Returns true if this layer requires filtering
    bool needsFiltering(const sp<const DisplayDevice>& displayDevice) const override;
    bool needsFiltering(const sp<const DisplayDevice>& displayDevice) const override;
    bool needsFilteringForScreenshots(const sp<const DisplayDevice>& displayDevice,
                                      const ui::Transform& inverseParentTransform) const override;


    // BufferStateLayers can return Rect::INVALID_RECT if the layer does not have a display frame
    // BufferStateLayers can return Rect::INVALID_RECT if the layer does not have a display frame
    // and its parent layer is not bounded
    // and its parent layer is not bounded
Loading